栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis

MyBatis 1、什么是Mybatis

1、来历
  • MyBatis 本是apache的一个开源项目iBatis,

  • 2010年这个项目由 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。

  • 2013年迁移到Github。

  • iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。

  • iBATIS提供的持久层框架包括SQL MapsData Access Objects(DAOs)

2、基本内容
  • MyBatis 是一款优秀的持久层框架(DAO),

  • 它支持定制化 SQL、存储过程以及高级映射。

  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

3.持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程

  • 数据库(jdbc),io文件持久化

  • 生活中:冷藏、罐头

为什么需要持久化?

内存太贵惹

4.持久层

Dao层,Service层,controller层。。。

  • 完成持久化工作的代码块
  • 层界限十分明显
5.为什么需要MyBatis

帮助程序员将数据存放到数据库中

传统的JDBC代码太复杂了—>简化——>框架

不用MyBatis也可以

优点

  • 简单易学:最简单安装只要两个jar文件+配置几个sql映射文件易于学习,
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
    • ​ sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • sql和代码的分离,提高了可维护性。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。
4.、如何获得Mybatis 1.从GitHub获取

因为MyBatis是开源的,所以可以从从开源的网站下载

https://github.com/mybatis/mybatis-3

2.Maven

https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6



    org.mybatis
    mybatis
    3.5.7


3.中文文档地址:

https://mybatis.org/mybatis-3/zh/index.html

5.准备工作

环境

  • JDK 1.8
  • Mysql 5.7
  • maven 3.6.1
  • IDEA

回顾

  • JDBC
  • Mysql
  • java基础
  • Maven
  • junit

SSM框架:配置文件,最好看官网文档

MyBatis中文文档

https://mybatis.org/mybatis-3/zh/index.html

2、第一个MyBatis程序(入门)

思路:

  • 搭建环境(Maven)
  • 导入myBatis
  • 编写代码
  • 测试

2.1、搭建环境 搭建数据库
CREATE DATABASE mybatis
 USE mybatis
  CREATE TABLE 	`user`(
`id` INT (10) NOT NULL PRIMARY KEY,
`name` VARCHAr (30) DEFAULT NULL,
`pwd`  VARCHAr (10) DEFAULT NULL
  )ENGINE =INNODB DEFAULT CHARSET=utf8;
  
  INSERT INTO `user`(`id`,`name`,`pwd`) VALUES
(1,"cc",'123456'),
(2,"aa",'123'),
(3,"bb",'1234')
新建项目
  1. 新建一个普通的maven项目
  1. 删除src目录,父工程,创建子工程

  1. 导入依赖

    1. mysql
    2. mybatis
    3. junit

    为什么在maven的pom.xml中导入项目依赖还是红色的!!!

    把maven版本换一下


    
        
            mysql
            mysql-connector-java
            8.0.11
        

        
            org.mybatis
            mybatis
            3.4.6
        

        
            junit
            junit
            4.12
        

    

    
        
            
                src/main/resources
                
                    ***.xml
                
                true
            
            
                src/main/java
                
                    ***.xml
                
                true
            
        
    
2.2、创建一个项目
  • 编写mybatis核心配置文件mybatis-config.xml,将网页中的代码粘贴进去
从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。后面会再探讨 XML 配置文件的详细内容,这里先给出一个简单的示例:




    
        
            
            
                
                
                
                
            
        
    

    
        
    

  • 配置mybatis工具类
package com.kuang.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }

}

2.3、编写代码
  • 实体类 pojo

package com.kuang.pojo;

public class user {
    private int id;
    private String name;
    private String pwd;

    public user() {
    }

    public user(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "user{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", pwd='" + pwd + ''' +
                '}';
    }
}

  • Dao接口

不需要写UserDaoInterface,直接写UserMapper.xml

package com.kuang.dao;

import com.kuang.pojo.user;

import java.util.List;

public interface userDao {
    List getuserList();
}

  • 接口实现类 由原来的UserDaoImpl变为UserMapper.xml



    
        select *
        from mybatis.user;
    

2.4测试

org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.userDao is not known to the MapperRegistry.

MapperRegistry是什么?

​ 核心配置文件中注册Mappers

  • junt测试
package com.kuang.dao;

import com.kuang.pojo.user;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class userDaoTest {

    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        userDao userDao = sqlSession.getMapper(userDao.class);
        List usersList = userDao.getuserList();
        for (user user : usersList) {
            System.out.println(user);
        }


        sqlSession.close();
    }
}

测试中可能会遇到的问题

  1. 配置文件没有注册!
  2. 绑定接口不对
  3. 方法名不对
  4. 返回类型不对
  5. maven导出资源问题

1.连接数据库

2.导入相关jar(mybatis,sql。。)

3.建造工具类《——编写配置文件

4.编写实体类——接口——Mapper

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rbgbamh8-1651656024038)(https://gitee.com/cl2854697833/my-picture/raw/master/img/202205041716774.png)]

3、CRUD 1、namespace

namespace中的包名要和Dao/Mapper接口的名字一样!!

2、select



    
    select * from student


    
        
        
        
        

    

    
        select s.id sid,s.name sname ,t.name tname
        from student s , teacher t
        where s.tid=t.id;
    

    
        
        
        
            
        
    

回顾MySql多对一查询:

  • 子查询
  • 连表查询
11、一对多

比如一个老师拥有多个学生

1.搭建环境 实体类

学生

package com.kuang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}

老师

package com.kuang.pojo;

import jdk.internal.dynalink.linker.LinkerServices;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private  int id;
    private String name;

    //一个老师拥有多个学生
    private List students;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List getStudents() {
        return students;
    }

    public void setStudents(List students) {
        this.students = students;
    }

按照结果嵌套处理


    
        select * from mybatis.teacher where id=#{tid}
    

    
        

    
    
        select  * from mybatis.blog where 1=1
    
        and title=#{title}
    

    and author=#{author}

    
choose (when, otherwise)

  SELECT *
  FROM POST P
  WHERe ID in
  
        #{item}
  

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

提示 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

至此,我们已经完成了与 XML 配置及映射文件相关的讨论。下一章将详细探讨 Java API,以便你能充分利用已经创建的映射配置。

SQL片段

有的时候,我们可能会将一些功能的部分抽取出来,方便复用!

  1. 使用SQL标签抽取公共的部分
  2. 在需要使用的地方使用Include标签引用即可

    
        
            title=#{title}
        
        
            and author=#{author}
        
    
    
  • 最好基于单表来定义SQL片段
  • 不要存在where标签

所谓动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码

==动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了I=
建议:
•现在Mysq中写出完整的SQL,再对应的去修改成为我们的动态SQL实现通用即可

13、缓存
杳询:连接数据库,耗资源!
一次查询的结果,给他暂存在一个可以直接取到的地方!---->内存:缓存
 我们再次查询相同数据的时候,直接走缓存,就不用走数据库
13.1简介
  1. 什么是缓存[ Cache ]?
    。存在内存中的临时数据。
    。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
  2. 为什么使用缓存?
    减少和数据库的交互次数,减少系统开销,提高系统效率。
  3. 什么样的数据能使用缓存?
    经常查询并且不经常改变的数据。
13.2Mybatis缓存
  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。

  • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存

    • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)

    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

    • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

13.3、一级缓存
  • 级缓存也叫本地缓存:
    。与数据库同一次会话期间查询到的数据会放在本地缓存中。
    。以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;
测试环境搭建

1.开启日志

2.测试在一个Sqlsession中查询两次相同的记录

package com.kuang.dao;

import com.kuang.pojo.user;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;

public class userDaoTest {

    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        userMapper userDao = sqlSession.getMapper(userMapper.class);
        user user1 = userDao.getUserById(1);

        System.out.println(user1);

        user user2 = userDao.getUserById(1);
        System.out.println(user2);

        System.out.println(user1==user2);
        sqlSession.close();
    }




}

3.参看日志输出

缓存失效的情况:

  1. 增删改,可能回修改原来的东西所以必定会刷新缓存
  2. 查询不同的东西
  3. 查询不同的mapper.xml
  4. 手动清理缓存

小结:一级缓存默认开启,再一次Sqlsession开启

13.2二级缓存
  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存

  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;

工作机制

  • 一 个会话查询
  • 一 条数据,这个数据就会被放在当前会话的一级缓存中;
  • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的
  • 数据被保存到二级缓存中;
  • 新的会话查询信息,就可以从二级缓存中获取内容;
  • 不同的mapper查出的数据会放在自己对应的缓存(map)中;

步骤:

  1. 开启全局缓存

    1.  
  2. 测试

小结:
•只要开启了二级缓存,在同一个Mapper下就有效
•所有的数据都会先放在一级缓存中;
•只有当会话提交,或者关闭的时候,才会提交到二级缓冲中!

13.5缓存原理

13.6、自定义缓存

导包


    
        org.mybatis.caches
        mybatis-ehcache
        1.1.0
    

14、实战练习 Spring

https://spring.io/

情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)

  • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

  • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

13.3、一级缓存
  • 级缓存也叫本地缓存:
    。与数据库同一次会话期间查询到的数据会放在本地缓存中。
    。以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;
测试环境搭建

1.开启日志

2.测试在一个Sqlsession中查询两次相同的记录

package com.kuang.dao;

import com.kuang.pojo.user;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;

public class userDaoTest {

    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        userMapper userDao = sqlSession.getMapper(userMapper.class);
        user user1 = userDao.getUserById(1);

        System.out.println(user1);

        user user2 = userDao.getUserById(1);
        System.out.println(user2);

        System.out.println(user1==user2);
        sqlSession.close();
    }




}

3.参看日志输出

[外链图片转存中…(img-fK4Yt75O-1651656024046)]

缓存失效的情况:

  1. 增删改,可能回修改原来的东西所以必定会刷新缓存
  2. 查询不同的东西
  3. 查询不同的mapper.xml
  4. 手动清理缓存

小结:一级缓存默认开启,再一次Sqlsession开启

13.2二级缓存
  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存

  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;

工作机制

  • 一 个会话查询
  • 一 条数据,这个数据就会被放在当前会话的一级缓存中;
  • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的
  • 数据被保存到二级缓存中;
  • 新的会话查询信息,就可以从二级缓存中获取内容;
  • 不同的mapper查出的数据会放在自己对应的缓存(map)中;

步骤:

  1. 开启全局缓存

    1.  
  2. 测试

小结:
•只要开启了二级缓存,在同一个Mapper下就有效
•所有的数据都会先放在一级缓存中;
•只有当会话提交,或者关闭的时候,才会提交到二级缓冲中!

13.5缓存原理

[外链图片转存中…(img-06J968ev-1651656024047)]

13.6、自定义缓存

导包


    
        org.mybatis.caches
        mybatis-ehcache
        1.1.0
    

14、实战练习 Spring

https://spring.io/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号