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

MyBatis详解

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

MyBatis详解

一、Mybatis入门 1.1 Mybatis历史

iBatis一词来源于“Internet”和“Abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(Dao)。

1.2 Mybatis特性

1)Mybatis是支持定制化SQL、存储过程以及高级映射的持久层框架

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

3)Mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录

4)Mybatis是一个半自动的ORM(Object Relation Mapping)框架

1.3 创建MyBatis的核心配置文件
  • 习惯上命名为MyBatis-config.xml,这个文件名仅仅是建议,并非强制要求,将来整合Spirng之后,这个配置文件可以省略。
  • 核心配置文件主要用于配置连接数据库的环境、Mybatis的全局配置信息
  • 核心配置文件存放的位置是src/main/resource目录下
  
  
 



	
	

    
        
        
        
        
    
    
	
	
        
		
        
        
        
	

	
	
		
		
			
			
			
			 
				
				
 				
				  
				  
				  
			  
		  
	  
	  
	  
		  
		 
        
        
	  

1.3.1 引入properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/MyBatis
jdbc.username=root
jdbc.password=123456
1.4 创建mapper接口

MyBatis中的接口相当于以前的Dao,但区别再与,MyBatis中我们只需要提供接口,无需提供实现类,MyBatis就可以自动为我们去调用对应的SQL语句操作数据,返回结果。

public interface UserMapper {
    	
    int insertUser();
}
1.5 创建Mybatis的映射文件

相关概念:ORM(Object Relationship Mapping)对象映射关系。

  • 对象:Java的实体类对象

  • 关系:关系型数据库

  • 映射:二者之间的对应关系

    Java概念数据库概念
    对象记录/行
    属性

    1、映射文件的命名规则:

    表名+Mapper.xml,例:表为User表,映射的实体类为User.java,所对应的映射文件为UserMapper.xml

    因此,一张表对应一个Mapper映射文件(对这个表的操作都写在这个映射文件中),对应一个实体类

    2、映射文件的作用及存放位置

    • 作用:用于编写SQL,访问以及操作表中的数据。
    • 位置:src/main/resources/mapper目录下

    注:MaBatis可以面向接口操作数据,要保证两个一致。

    • 映射文件的namespace和mapper接口的全类名保持一致。
    • 映射文件中的SQL语句的id和mapper接口中的方法名保持一致。
  
  


  

	  
	  
		insert into t_user values(null,'张三','123',23,'女')  
	

	  
	
		select * from t_user where id = 1
	

总结:通过核心配置文件,配置好与数据库的连接关系,以及映射文件的位置,MyBatis是面向接口编程,接口相当于之前的Dao,只是没有了实现类,我们配置好MyBatis的信息后,调用接口。

  • MyBatis先是从核心配置文件中找到连接数据库信息,以及找到映射文件的位置。
  • 然后再通过mapper接口的全类名,在映射文件里找到的对应的namespace。
  • 再通过调用的方法名,找到映射文件里的SQL唯一id,MaBatis执行SQL操作数据库。
  • 返回结果,吧查到的表记录通过resultType或resultMap来确定映射关系,再通过反射自动映射表字段和实体类的属性名实现赋值,复杂的映射关系可以通过restultMap来自定义数据库字段与属性的关系。

打印日志,输出SQL执行情况

1、加入依赖



	log4j
	log4j
	1.2.17

2、添加log4j.xml文件

  • log4j的配置文件名为log4j.xml,存放位置是src/main/resources目录下
  • 日志的级别:FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
  • 从左到右打印的内容越来越详细



    
        
        
			
        
    
    
        
    
    
        
    
    
        
        
    

二、MyBatis获取参数值的两种方式
  • MyBatis获取参数值的两种方式:#{} 和 #{}

  • #{}的本质是:占位符赋值,${}的本质是:字符串拼接

  • #{}使用占位符赋值的方式拼接SQL,此时字符串类型或日期类型的字段进行赋值时,可以自动添加单引号;

    ${}使用字符串拼接的方式拼接SQL,此时字符串类型或日期类型的字段进行赋值时,需要手动加单引号。

2.1 单个字面量类型的参数

可以通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}以任意名称获取参数值,但使…{}时需要手动添加单引号


  
	select * from t_user where username = '${username}'  

以任意名称获取也可获取,但最好见名知意

  
	select * from t_user where username = #{arg0} and password = #{arg1}  


  
	select * from t_user where username = #{arg0} and password = #{param2}  

  • 所以只需要通过#{}和#{}访问map集合的键就可以获取相对应的值,${}需要加上单引号
  • 使用arg或param都行,要注意的是,arg是从arg0开始的,param是从param1开始的
2.3 map集合类型的参数
  • 若mapper接口中的参数为多个时,此时可以手动创建map集合,把参数封装到map中,也可以通过#{}和 来 访 问 m a p 的 k e y 来 获 取 参 数 值 , 但 {}来访问map的key来获取参数值,但 来访问map的key来获取参数值,但{}需要手动添加单引号
Map params = new HashMap<>();
params.put("username","admin");
params.put("password",123456);
User user = mapper.checkLogin(params);


        select * from t_user where username = #{username} and password = #{password}
    
2.6 总结
  • 建议分词两种情况进行处理
  1. 实体类类型的参数,及6.4所示
  2. 使用@Param标识参数,及6.5所示
三、MyBatis的各种查询功能
  • 如果查询出的数据只有一条,可以通过
  1. 实体类对象接收
  2. List集合接收
  3. Map集合接收,结果{password=123456, sex=男, id=1, age=23, username=admin}
  • 如果查询出的数据有多条,一定不能用实体类对象接收,会抛出TooManyRestultsException,可以通过
    1. 实体类泛型的List集合接收
    2. Map类型的List集合接收
    3. 在mapper接口方法上添加@MapKey注解
  • MaBatis中设置了默认的类型别名
    1. java.lang.Integer---->int,integer
    2. int---->_int,_integer
    3. Map---->map
    4. Stirng---->string
3.1 查询一个实体类对象
User getUserById(@Param("id") int id);


	select * from t_user

3.3 查询单个数据
  
int getCount();


	select * from t_user where id = #{id}


3.5 查询多条数据为map集合
  • 方法一
  
List> getAllUserToMap();
  

	select * from t_user



四、特殊SQL的执行 4.1 模糊查询(用#{})
List getUserByLike(@Param("username") String username);


	select * from ${tableName}

4.4 添加功能获取自增的主键

使用场景

  • t_clazz(clazz_id,clazz_name)

    • t_student(student_id,student_name,clazz_id)
    1. 添加班级信息
    2. 获取新添加的班级的id
    3. 为班级分配学生,即将某学的班级id修改为新添加的班级的id
  • 在mapper.xml中设置两个属性

  • useGeneratedKeys:设置使用自增的主键

    • keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中

注:一对多还是多对一,都要把表关系设置在多的一方,增删改的返回值固定,就是受影响的条数。

void insertUser(User user);


	insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})

//测试类
@Test
public void insertUser() {
	SqlSession sqlSession = SqlSessionUtils.getSqlSession();
	SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
	User user = new User(null, "ton", "123", 23, "男", "123@321.com");
	mapper.insertUser(user);
	System.out.println(user);
	//输出:user{id=10, username='ton', password='123', age=23, sex='男', email='123@321.com'},自增主键存放到了user的id属性中
}
五、自定义映射 5.1 字段名与属性名不一致
  • 字段名与属性名一致,就可以自动创建映射关系,把查出来的值对相对应的属性赋值。

  • 字段名与属性名不一致时,如字段名为emp_name ,属性名为empName,下划线并不能对应驼峰命名,此时mybatis默认不能自动映射,但不会报错,只是不一致的不会赋值,empName会被赋值'null'。

解决方式

  1. 为字段起别名,保持和属性名的一致:对与属性名不一致的字段名起别名,来保证和实体类中的属性名保持一致 。

    
    	
    	select * from t_emp
    
    
    5.2 多对一映射
    //对一对应对象
    

    解决方式

    5.2.1 级联属性赋值
    
    	
    	
    	
    	
    	
    	
    	
    
    
    
    	select * from t_emp left join t_dept on t_emp.eid = t_dept.did where t_emp.eid = #{eid}
    
    
    5.2.3 分布查询处理多对一映射
    • select:设置分布查询的SQL的唯一标识(namespace.SQLId或mappper接口的全类名.方法名)
    • column:设置分布查询的条件
    5.2.3.1 查询员工信息
    //EmpMapper里的方法
    
    Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);
    
    
    	
    	
    	
    	
    	
    	
    
    
    
    	select * from t_dept where did = #{did}
    
    

    延迟加载

    
        
        
     
    

    分布查询的好处:

    1. 可以实现功能的独立,把一条SQL拆分成两条形成两个功能,当你想调用哪个就可以单独调用它。
    2. 可以实现延迟加载,只有当访问需要执行的数据,对应需要执行的SQL才会去执行。
    • fetchType:当开启了全局的延迟加载之后,该属性默认为lazy,此时所有的分布查询都是延迟加载。
    • 当你想要单独设置某个分布查询为立即加载时,可通过设置fetchType="eager"来开启立即加载
    
    
    	
    	
    	
    	
    	
    	
    
    
    
    	select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}
    
    
    5.3.2 分布查询 5.3.2.1 查出部门信息
    Dept getDeptAndEmpByStepOne(@Param("did") Integer did);
    
    
    	
    	
    	
    
    
    
    	select * from t_emp where did = #{did}
    
    
    六、动态SQL

    MyBatis框架的动态SQL技术是一种根据特定条件动态拼接SQL语句的功能,它存在的意思是为了解决拼接SQL语句字符串时的痛点问题。

    6.1 if
    • if标签可通过test属性(即传递过来的数据)的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行
    • 在where后面添加一个恒成立条件1=1
    • 这个恒成立条件并不会影响查询的结果
      • 这个1=1可以用来拼接and语句,例如:当empName为null时
      • 如果不加上恒成立条件,则SQL语句为select * from t_emp where and age = ? and sex = ? and email = ?,此时where会与and连用,SQL语句会报错
        • 如果加上一个恒成立条件,则SQL语句为select * from t_emp where 1= 1 and age = ? and sex = ? and email = ?,此时不报错
    
    
    
    	select * from t_emp where 1=1
    	
    		and emp_name = #{empName}
    	
    	
    		and age = #{age}
    	
    	
    		and sex = #{sex}
    	
    	
    		and email = #{email}
    	
    
    
    6.2 where(常用,与if语句结合使用)
    • 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and或or去掉
    • 当where标签中没有内容时,此时where标签没有任何效果,即不会在SQL中拼接where
    • 注意:where标签不能将内容后面多余的and或or去掉,所以if条件拼接应该把and或or放在前面拼接
    
    
    	select * from t_emp
    	
    		
    			emp_name = #{empName} and
    		
    		
    			age = #{age} and
    		
    		
    			sex = #{sex} or
    		
    		
    			email = #{email}
    		
    	
    
    
    6.4 choose、when、otherwise
    • choose、when、otherwise相当于if...else if..else
    • when至少要有一个,otherwise至多只有一个(when只有一个条件会执行,有一个执行下面就不执行了,otherwise实在when都不满足的时候执行)
    
        select  from t_emp
    
    
    七、MyBatis的缓存 7.1 MyBatis的一级缓存

    一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问。缓存只针对查询。

    使一级缓存失效的四种方式:

    • 不同的SqlSession对应不同的一级缓存
    • 同一个SqlSession但是查询条件不同
    • 同一个SqlSession两次查询期间执行了任何一次增删改操作
    • 同一个SqlSession两次查询期间手动清空了缓存
    7.2 MyBatis的二级缓存

    二级缓存是SqlSessionFactory级别的,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取;

    使二级缓存失效的情况:两次查询直接执行了任意的增删改操作,会使一级和二级缓存同时失效。

    二级缓存开启的条件:

    • 在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置
    • 在映射文件中设置标签
    • 二级缓存必须在SqlSession关闭或提交之后有效
    • 查询的数据所转换的实体类类型必须实现序列化的接口
    7.2.1 二级缓存的相关设置
    • 在mapper配置文件中添加的cache标签可以设置一些属性
    • eviction属性:缓存回收策略
      • LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。
      • FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。
      • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
      • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
      • 默认的是 LRU
    • flushInterval属性:刷新间隔,单位毫秒
    • 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句(增删改)时刷新
    • size属性:引用数目,正整数
    • 代表缓存最多可以存储多少个对象,太大容易导致内存溢出
    • readOnly属性:只读,true/false
      • true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
      • false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false
    7.3 MyBatis的查询顺序
    • 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用
    • 如果二级缓存没有命中,再查询一级缓存
    • 如果一级缓存也没有命中,则查询数据库
    • SqlSession关闭之后,一级缓存中的数据会写入二级缓存
    7.4 整合第三方缓存EHCache(了解) 7.4.1 添加依赖
    
    
    	org.mybatis.caches
    	mybatis-ehcache
    	1.2.1
    
    
    
    	ch.qos.logback
    	logback-classic
    	1.2.3
    
    
    7.4.1.1 各个jar包的功能
    jar包名称作用
    mybatis-ehcacheMybatis和EHCache的整合包
    ehcacheEHCache核心包
    slf4j-apiSLF4J日志门面包
    logback-classic支持SLF4J门面接口的一个具体实现
    7.4.2 创建EHCache的配置文件ehcache.xml

    名字必须叫ehcache.xml

    
    
        
        
        
        
    
    
    7.4.2.1 EHCache配置文件说明
    属性名是否必须作用
    maxElementsInMemory在内存中缓存的element的最大数目
    maxElementsOnDisk在磁盘上缓存的element的最大数目,若是0表示无穷大
    eternal设定缓存的elements是否永远不过期。 如果为true,则缓存的数据始终有效, 如果为false那么还要根据timeToIdleSeconds、timeToLiveSeconds判断
    overflowToDisk设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
    timeToIdleSeconds当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时, 这些数据便会删除,默认值是0,也就是可闲置时间无穷大
    timeToLiveSeconds缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
    diskSpoolBufferSizeMBDiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
    diskPersistent在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false
    diskExpiryThreadIntervalSeconds磁盘缓存的清理线程运行间隔,默认是120秒。每个120s, 相应的线程会进行一次EhCache中数据的清理工作
    memoryStoreEvictionPolicy当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。 默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出
    7.4.3 设置二级缓存的类型
    • 在xxxMapper.xml文件中设置二级缓存类型
    
    
    7.4.4 加入logback日志

    存在SLF4J时,作为简易日志的log4j将失效,此时我们需要借助SLF4J的具体实现logback来打印日志。创建logback的配置文件logback.xml,名字固定,不可改变

    
    
        
        
            
                
                
                [%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n
            
        
        
        
        
            
            
        
        
        
    
    
    八、分页插件 8.1 添加依赖
    
    
    	com.github.pagehelper
    	pagehelper
    	5.2.0
    
    
    8.2 配置分页插件

    在MyBatis的核心配置文件(mybatis-config.xml)中配置插件

    
    	
    	
    
    
    8.3 开启分页功能
    • 在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)开启分页功能
    • pageNum:当前页的页码
    • pageSize:每页显示的条数
    @Test
    public void testPageHelper() throws IOException {
    	InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    	SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    	SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    	SqlSession sqlSession = sqlSessionFactory.openSession(true);
    	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    	//访问第一页,每页四条数据
    	PageHelper.startPage(1,4);
    	List emps = mapper.selectByExample(null);
    	emps.forEach(System.out::println);
    }
    
    8.4 获取分页相关的数据(重点)

    分页插件的意义就是可以方便的获取关于分页的所有数据。

    8.4.1 直接获取简易信息Page
    @Test
    public void testPageHelper() throws IOException {
    	InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    	SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    	SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    	SqlSession sqlSession = sqlSessionFactory.openSession(true);
    	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    	//访问第一页,每页四条数据
    	Page page = PageHelper.startPage(1, 4);
    	List emps = mapper.selectByExample(null);
    	//在查询到List集合后,打印分页数据
    	System.out.println(page);
    }
     
    

    分页相关数据:

    Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=8, pages=2, reasonable=false, pageSizeZero=false}
    [Emp{eid=1, empName='admin', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=2, empName='admin2', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=3, empName='王五', age=12, sex='女', email='123@qq.com', did=3}, Emp{eid=4, empName='赵六', age=32, sex='男', email='123@qq.com', did=1}]
    
    8.4.2 获取PageInfo
    • 在查询获取结果后,使用PageInfo pageInfo = new PageInfo<>(List list, intnavigatePages)获取分页相关数据
    • list:分页之后的数据
    • navigatePage:导航分页的页码数
    @Test
    public void testPageHelper() throws IOException {
    	InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    	SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    	SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    	SqlSession sqlSession = sqlSessionFactory.openSession(true);
    	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    	PageHelper.startPage(1, 4);
    	List emps = mapper.selectByExample(null);
    	PageInfo page = new PageInfo<>(emps,5);
    	System.out.println(page);
    }
    

    分页相关数据:

    • 其中list相当于8.4.1中获取的Page数据
    PageInfo{pageNum=1, pageSize=4, size=4, startRow=1, endRow=4, total=8, pages=2, 
             
    list=Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=8, pages=2, reasonable=false, pageSizeZero=false}
             
    [Emp{eid=1, empName='admin', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=2, empName='admin2', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=3, empName='王五', age=12, sex='女', email='123@qq.com', did=3}, Emp{eid=4, empName='赵六', age=32, sex='男', email='123@qq.com', did=1}], 
    
    prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=5, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}
    

    相关数据:

    • pageNum:当前页的页码
    • pageSize:每页显示的条数
    • size:当前页显示的真实条数
    • total:总记录数
    • pages:总页数
    • prePage:上一页的页码
    • nextPage:下一页的页码
    • isFirstPage/isLastPage:是否为第一页/最后一页
    • hasPreviousPage/hasNextPage:是否存在上一页/下一页
    • navigatePages:导航分页的页码数
    • navigatepageNums:导航分页的页码,[1,2,3,4,5]
    九、MyBatis的逆向工程
    • 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的
    • 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
      • Java实体类
      • Mapper接口
      • Mapper映射文件
    9.1 创建逆向工程的步骤 9.1.1 添加依赖和插件
    
    	
    	
    		org.mybatis
    		mybatis
    		3.5.9
    	
    	
    	
    		junit
    		junit
    		4.13.2
    		test
    	
    	
    	
    		mysql
    		mysql-connector-java
    		8.0.27
    	
    	
    	
    		log4j
    		log4j
    		1.2.17
    	
    
    
    
    	
    	
    		
    		
    			org.mybatis.generator
    			mybatis-generator-maven-plugin
    			1.3.0
    			
    			
    				
    				
    					org.mybatis.generator
    					mybatis-generator-core
    					1.3.2
    				
    				
    				
    					com.mchange
    					c3p0
    					0.9.2
    				
    				
    				
    					mysql
    					mysql-connector-java
    					8.0.27
    				
    			
    		
    	
    
    
    9.1.2 创建MyBatis的核心配置文件
    
    
    
        
        
            
        
        
            
                
                
                    
                    
                    
                    
                
            
        
        
            
        
    
    
    9.1.3 创建逆向工程的配置文件
    • 文件名必须是:generatorConfig.xml
    
    
    
        
        
            
            
            
            
            
                
                
            
            
            
                
            
            
            
                
            
            
            
            
            
    9.1.4 执行MBG插件的generate功能
    • 如果出现报错:Exception getting JDBC Driver,可能是pom.xml中,数据库驱动配置错误
      • mybatis-generator-maven-plugin插件中的驱动
      • 两者的驱动版本应该相同
    9.2 QBC 9.2.1 查询
    • selectByExample:按条件查询,需要传入一个example对象或者null;如果传入一个null,则表示没有条件,也就是查询所有数据
    • example.createCriteria().xxx:创建条件对象,通过andXXX方法为SQL添加查询添加,每个条件之间是and关系
    • example.or().xxx:将之前添加的条件通过or拼接其他条件
    @Test public void testMBG() throws IOException {
    	InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    	SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    	SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    	SqlSession sqlSession = sqlSessionFactory.openSession(true);
    	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    	EmpExample example = new EmpExample();
    	//名字为张三,且年龄大于等于20
    	example.createCriteria().andEmpNameEqualTo("张三").andAgeGreaterThanOrEqualTo(20);
    	//或者did不为空
    	example.or().andDidIsNotNull();
    	List emps = mapper.selectByExample(example);
    	emps.forEach(System.out::println);
    }
    
    9.2.2 增改
    • updateByPrimaryKey:通过主键进行数据修改,如果某一个值为null,也会将对应的字段改为null
      • mapper.updateByPrimaryKey(new Emp(1,"admin",22,null,"456@qq.com",3));
    • updateByPrimaryKeySelective():通过主键进行选择性数据修改,如果某个值为null,则不修改这个字段
      • mapper.updateByPrimaryKeySelective(new Emp(2,"admin2",22,null,"456@qq.com",3));

    本篇博客,根据尚硅谷杨博超老师的MyBatis的教程学习所记,地址如下:尚硅谷-Mybatisspm_id_from=333.1007.top_right_bar_window_history.content.click如有不正确的地方,欢迎同学们指正,喜欢的话,欢迎点赞收藏评论哦~

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

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

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