Mybatis学习笔记

Mybatis学习笔记,第1张

Mybatis学习笔记 Mybatis

Mybatis继承了JDBC,代替传统DAO模式开发

jar包+API+源码----->开源文件

  • 环境:
    1. JDK1.8
    2. Mysql 5.7
    3. maven 3.6.1
    4. IDEA
DAO层的缺点
  1. 架构太麻烦,逻辑太繁杂
  2. 使用JDBC连接数据库没有办法实现java代码和SQL代码之间的解耦(耦合度太高,SQL语句卸载class中)
  3. 使用JDBC连接数据库在接受查询的数据的时候非常费劲,特别影响开发效率
  4. JDBC连接数据库的效率比较低,我们需要自己使用连接池连接
一、Mybatis简介

​ Mybatis是一个Apache的一共开源项目iBatis,是internet和abatis的组合,是一个基于Java的持久层框架

是一个半自动化的ORM框架,其本质是对JDBC的封装,封装过后只需要写Mysql代码而不需要写JDBC代码。ORM(Object-Relational Mapping),对象关系映射。

Mybatis较于Hibernate的优势
  1. Mybatis直接手写SQL语句,可以更加精确定义SQL,更加灵活,也便于性能优化。
  2. 学习成本比Hibernate低不少
  3. 相对轻量级,封装少、映射多样化、支持存储过程、可以进行SQL语句优化等特点,符合互联网高并发、大数据、高性能、高相应的要求。
Mybatis的jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCMCtxDp-1637676602882)(C:Users86135AppDataRoamingTyporatypora-user-imagesimage-20211016154547648.png)]

  1. asm和javassist是Java字节码解析助手,主要帮助解析字节码文件
  2. cglib包的作用是动态代理
  3. commons-logging是组件和子文件
  4. log4j和slf4g包都是日志
  5. ognl包ognl表达式的包
  6. 最核心的内容在mybatis的jar包中
二、Mybatis的配置

去Mybatis官网搜索,去Mybatis的git社区下载Mybatis文件,将jar包拷贝到项目的lib文件夹下,在src中创建xml文件配置Mybatis。




    
    
        
            
            
            
            
                
                
                
                
            
        
    

1.环境配置(environments)

MyBatis可以配置成适应多种环境

不过:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境

Mybatis默认的事务管理器就是JDBC,连接池:POOLED(用于不让事务回收)

2.属性(properties)

我们可以通过properties属性来实现引用配置文件

这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,也可以通过properties元素的子元素来传递【db.propertis】

编写一个db.properties配置文件

driver:
url:		//省去&
username:
password:

在xml中引入properties文件之后,在environment中的value就可以中properties文件中的值用**${}**来引用

如果引入的文件和xml中的properties中自己输入的配置冲突,优先使用外部文件的配置


    
    

3.类型别名(typeAliases)

	
    


  • 扫描实体类的包,它的默认别名就为这个类的类型,首字母小写
  • 在实体类比较少的时候可以直接给类起别名,也就是第一种
  • 在实体类比较多的时候,用第二种
  • 第一种可以DIY,第二种不行
  • 也可以用注解
4.设置(settings)
  • 这是MyBatis中极为重要的调整设置,他们会改变MyBatis的运行时行为
  • 数量有限,是可以直接罗列完的,在spring中封装后就不用这个了
5.其他配置
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins插件
    • mybatis-generator-core
    • mybatis-plus
    • 通用mapper
6.映射器(mappers)

MapperRegistry:注册绑定Mapper文件

方式一:【推荐使用resource】


	

方式二:使用class文件绑定注册


	

注意点:

  • 接口和Mapper配置文件必须同名
  • 接口和Mapper配置文件必须在同一个包下

方式三:使用扫描包进行注入绑定


	

注意点:

  • 接口和Mapper配置文件必须同名
  • 接口和Mapper配置文件必须在同一个包下
7.生命周期和作用域

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder:

  • 一旦创建了SqlSessionFactory,就不再需要它了
  • 局部变量

SqlSessionFactory:

  • 等价于数据库连接池
  • 一旦创建就一直存在
  • SqlSessionFactory最佳作用域就是应用作用域
  • 最简单的就是使用单例模式和多例模式

SqlSession:

  • 连接到连接池的一个请求!
  • SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳作用域是请求或方法作用域。
  • 用完之后就要马上关闭,否则资源被占用。

每一个Mapper就代表一个具体的业务。

三、CRUD
  1. 在pom.xml中添加maven
  2. 先写MybatisUtils工具类
  3. 写mybatis-config.xml配置文件,配置Mybatis,环境准备
  4. 写实体类User.java
  5. 写接口UserMapper.java
  6. 写接口的UserMapper.xml
  7. 写Test测试

在Java代码中

@Test
public void deleteUser(){
	SqlSession sqlSession = MybatisUtils.getSqlSession();	//获得实例化sql接口
    
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);		//创建mapper对象
    
    mapper.deleteUser(4);
    
    sqlSession.commit();	//提交事务
    sqlSession.close();	//关闭sql接口
}
1.namespace
  • 在UserMapper.XML中namespace的包名要和Dao/Mapper接口的包名一致
2.select

选择,查询语句

  • id:就是对应namespace中的方法名
  • resultType:sql语句执行的返回值(Class、int、varchar)
  • parameterType:参数类型

	select * from mybatis.user where id = #{helloId} and name = #{name}

@Test
public void getUserById2(){
    SqlSession sqlSessin = MybatisUtils.getSqlSession();
    
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
    Map map = new HashMap();
    
    map.put("helloId",1);
    
    mapper.getUserById2(map);
    
    sqlSession.close();
}

Map传递参数,直接在sql取出key即可 【parameterType=“map”】

对象传递参数,直接在sql中取对象属性即可 【parameterType=“Object”】

只有一个基本类型参数的情况下,可以直接在sql中取到

多个参数用Map,或者注解!

7.模糊查询
//接口类
List getUserLike(String value);

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







mybatis-config.xml配置


	
    

十、一对多

比如:一个老师拥有多个学生,对于老师来说就是一对多的关系。

1.实体类(pojo目录下):
@Data
public class Student{
    
    private int id;
    private String name;
    
    //学生需要一个老师
    private int tid;
}
@Data
public class Teacher(){
    private int id;
    private String name;
    //一个老师可以拥有多个学生
    private List students;
}
2.接口(dao目录下):
public interface StudentMapper{
    
    
}
public interface TeacherMapper{
    
    //获取老师
    //public List getTeacher();
    
    //获取指定老师下的所有学生及老师的信息
    Teacher getTeacher(@Param("tid")int id);
}
3.在配置目录下





    





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

choose(when,otherwise)

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


	update Author
    
    	
        	title = #{title},
        
        
        	author = #{author}
        
    
    where id = #{id}

    

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

Foreach

	select * from mybatis.blog
    
    	
        	id = #{id}
        
    

SQL片段

有点时候,可能需要将一些片段抽取出来,方便复用


	
        	title = #{title},
        
        
        	author = #{author}
        





注意事项:

  • 最好基于单表来定义SQL片段
  • 不要存在where标签
十二、缓存(了解) 12.1 简介
查询 : 连接数据库,高资源
	一次查询的结果,给他暂存在一个可以直接取到的地方  ----> 内存:缓存
	
在查询相同数据的时候,直接走缓存,就不用走数据库了
  1. 什么是缓存[Cache]?
    • 存在内存中的临时数据
    • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
  2. 为什么使用缓存?
    • 减少和数据库的交互次数,减少系统开销,提高系统效率。
  3. 什么样的数据能使用缓存?
    • 经常查询并且不经常改变的数据
12.2 Mybatis缓存
  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大提升查询效率。
  • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
    • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也成为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存
    • 为了提高拓展性,MyBatis定义了缓存接口Cache。我们可以通过Cache接口来自定义二级缓存
12.3 一级缓存
  • 一级缓存也叫本地缓存
    • 与数据库同一次会话期间查询到的数据会放在本地缓存中
    • 以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库
    • 默认开启,只在一次SqlSession中有效,也就是拿到连接和关闭连接这个区间段

缓存失效的情况:

  1. 查询不同的东西
  2. 增删改 *** 作,可能会改变原来的数据
  3. 查询不同的Mapper.xml
  4. 手动清理缓存
12.4 二级缓存
  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存
  • 工作机制
    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
    • 如果当前会话关闭了,这个会话对应的一级缓存就没了。会话关闭后,缓存就存在了二级缓存。
    • 新的会话查询信息,就可以从二级缓存中获取内容
    • 不同的mapper查出的数据会放在自己对应的缓存(map)中

步骤:

  1. 开启全局缓存

    
    
  2. 在要使用二级缓存的mapper中开启

    
    
    
    
    
  3. 测试

    1. 问题:需要将实体类序列化,否则会报错

      Caused by:java.io.NotSerializableException:com.tunan.pojo.User
      

      序列化方法:实体类 implements Serializable

小结:

  • 只要开启了二级缓存,在同一个Mapper下就有效
  • 所有的数据都会先放在一级缓存中
  • 只有当会话提交,或者关闭的时候,才会提交到二级缓存中。
12.5 总结
  • 在没有开启二级缓存的时候默认使用一级缓存
    • 一级缓存的作用范围为一个SqlSession,在连接数据库的时候开,关闭数据库的时候关闭
  • 二级缓存需要手动开启,每一个Mapper对应一个二级缓存
    • 二级缓存的作用范围为一个namespace
    • 每个一级缓存关闭或者会话提交后,会将数据提交到二级缓存中
    • 同一个namespace共用一个二级缓存

12.6 自定义缓存(ehcache)
Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存

创建一个eache的xml文件




    

    

    

用Redies做缓存

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5596040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存