Mybatis笔记总结
一、基本知识点
- MyBatis是一个基于java的持久层框架
- 几乎代替JDBC,同时提供了接口编程
- MyBatis的数据访问层DAO是不需要实现类的,它只需要一个接口和XML
- MyBatis提供自动映射、动态SQL、级联、缓存、注解、代码和SQL分离等
- MyBatis或者Hibernate中可以通过XML或者注解提供映射规则(MyBatis中注解方式会受到一定的限制,通过使用XML方式实现映射关系),如下图所示:
- O/R mapping,Hibernate基本不需要编写SQL就可以通过映射关系来操作数据库,是一种全表映射的提现,而MyBatis需要我们提供SQL去运行,这样能够更加精确地定义SQL,从而优化性能,如下图所示:
二、认识MyBatis核心组件
2.1 SqlSessionFactoryBuilder构造器
根据配置或代码来生成SqlSessionFactory,采用的是分布构建Builder模式,Builder模式是一种一步一步创建一个复杂对象的设计模式,设计模式的精髓就主要有两点:其一,用户使用简单,并且可以在不需要知道内部构建细节的情况下,就可以构建出复杂的对象模型;其二,对于设计者来说,这是一个解耦的过程,这种设计模式可以将构建的过程和具体的表示分离开来。
例子:
2.2 SqlSessionFactory工厂接口
2.2.1 作用与模式
依靠它生成SqlSession,使用的是工厂模式,工厂模式例子如下:
2.2.2 实现原理
只构造一次,作为数据库连接池,生命周期就等同于MyBatis的应用周期,作为一个单例为共享,通过读取配置的XML文件的形式来生成SqlSessionFactory,也可以通过Java代码的形式去生成SqlSessionFactory
2.2.3 XML构建方式
使用XML构建SqlSessionFactory,Mybatis中的XML分为两类,一类是基础配置文件,通常只有一个,主要配置一些最基本的上下文参数和运行环境,二类是映射文件,主要配置映射关系、SQL、参数等信息
下面为MyBatis的基础配置文件,< typeAlias >定义别名,在MyBatis上下文中就可以使用别名代替全限定使用了;< environment >元素的定义,这里描述的是数据库,里面的< transactionManager >元素配置事务管理器,采用mybatis的JDBC管理器方式,< dataSource >元素配置数据库,属性type=”POOLED”代表采用mybatis内部提供的连接池方式
2.3 SqlSession会话
2.3.1 说明
一个既可以发送SQL执行返回结果,也可以获取Mapper的接口,建议使用MyBatis提供的SQL Mapper接口编程技术,提高代码的可读性和可维护性
2.3.2 作用与例子
在mybatis中,有两个实现类,DafaultSqlSession(单线程)和SqlSessionManager(多线程),SqlSession作用类似于一个JDBC中的connection对象,代表着一个连接资源的启用,SqlSession的获取Mapper接口和发送SQL的功能需要先实现映射器的功能,作用为有三点,获取Mapper接口、发送SQL给数据库、控制数据库事务
2.4 SQL Mapper映射器
2.4.1 说明
由一个Java接口和XML文件构成,需要给出对应SQL和映射规则,负责发送SQL去执行,并返回结果
2.4.2 作用与例子
由接口和对应的XML文件组成,配置的内容:描述映射规则;提供SQL语句;配置缓存;提供动态SQL,映射器的主要作用是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中,MyBatis会为找个接口生成一个代理对象,代理对象会去处理相关的逻辑即可,用XML实现映射器
2.4.2.1 XML定义映射器分为两个部分:接口和XML
< mapper >元素中的namespace所对应的是一个接口的全限定名,mybatis上下问就可以通过它找到对应的接口;< select >元素表示这是一条查询语句,属性id表示了这条SQL,parameter表明参数类型,resultType表明返回值为role类型,role是之前配置文件mybatis-config.xml配置的别名,#{id}表示传递进去的参数。MyBatis在默认情况下提供自动映射,只要SQL返回的列名和POJO对应起来即可
2.4.2.2 SqlSession发送SQL
SelectOne方法表示使用查询并且只返回一个对象,参数为一个String对象和一个Object对象,String对象由一个命名空间加上SQL id组合而成的(接口全局限定名+SQL id),定位了一条SQ
2.4.2.3 用Mapper接口发送SQL(建议)
SqlSession的getMapper方法来获取一个Mapper接口,接口.SQL id来调用,通过Mapper接口发送SQL
三、实例配置,书籍p57
3.1 工程文件目录
3.2 构建POJO对象
3.3 创建映射器,即接口与XML配置文件
3.4 基本配置文件
3.5 构建SqlSessionFactory
读取配置的XML文件的形式来生成SqlSessionFactory,由于SqlSessionFactory应该采用单例模式(类的唯一实例),加入synchronized关键字加锁,防止在多线程中多次实例化SqlSessionFactory
3.6 SqlSession获取接口对象
通过SqlSession获取一个RoleMapper接口对象,然后通过getRole方法获取对象
四、MyBatis配置
4.1 说明
MyBatis配置项的顺序不能颠倒,其中properties、settings、typeAliases、typeHandler、plugin、environments、mappers是常用的内容
4.2 properties属性
properties属性可以给系统配置一些运行参数,可以放在XML文件或properties文件中,好处在于方便参数修改,而不会引起代码的重新编译,三种方式使用properties:property子元素、properties文件、程序代码传递
4.2.1 property子元素
下多个,使用的时候则${},主要用于进行数据源配置,可以配置多个数据源,通过default属性来指定当前项目运行过程中使用哪个数据源
4.2.2 使用properties文件
这是一种比较普遍的做法,其逻辑就是键值对应,可以配置多个键值放在一个properties文件中,创建一个文件jdbc.properties放到classpath的路径下
4.2.3 运用加解密
在真实的生产环境中,数据库的用户密码对开发人员和其他人员保密的,一般需要把用户和密码经过加密成为密文后,配置到properties文件中,假设系统已经为提供了这样的一个CodeUtils.decode(str)进行解密,那么我们在创建SqlSessionFactory前,就需解密,然后把解密后的字符串重置到properties属性中,最后使用SqlSessionFactory的build方法,传递多个properties参数来完成,而这里并没有把解密的写回jdbc.properties中
4.3 typeAliases属性
由别名代替类的全限定名称,别名分为系统定义别名和自定义别名,在MyBatis中别名有类TypeAliasRegistry去定义,别名不区分大小写
4.3.1 TypeAliasRegistry
使用TypeAliasRegistry的registerAlias方法注册别名,一般是通过Configuration获取TypeAliasRegistry类对象,其中有一个getTypeAliasRegistry方法可以获得别名,然后可以通过registerAlias方法对别名注册了
4.3.2 自定义别名
使用配置文件定义
MyBatis还支持扫描别名,比如上面的两个类都在包com.learn.ssm.chapter4.pojo下,这样MyBatis将扫描这 个包里面的类,将其第一个字母变为小写作为其别名,User的别名变为user,但有时候容易出现重名,这个时候MyBatis提供注解@Alias(“user3”)进行区分
4.4 typeHandler类型转换器
在typeHandler中,分为jdbcType(定义数据库类型)和javaType(定义java类型),typeHandler的作用就是承担jdbcType和javaType之间的相互转换,MyBatis中存在系统定义的typeHandler和自定义typeHandler,枚举类往往需要自己去编写规则。要实现typeHandler就需要去实现接口typeHandler,或者继承BaseTypeHandler
4.5 environments运行环境
运行环境主要配置数据库信息,大部分情况下会采用spring对数据源和数据库的事务进行管理