Mybatis总结(mybatis plus待更新)
MyBatis是Apache公司开发为解决数据持久化问题的框架。
下面以maven工程为例,来介绍搭建mybatis开发环境(使用mysql数据库)的一些细节。
要搭建mybatis环境,首先必须的是在pom.xml中配置jar的打包方式,以及mybatis和mysql-connector-java的坐标。(根据需要,增添日志或者测试的坐标)
首先介绍不使用注解方式来搭建环境。
1. 注意持久层接口的映射文件(Dao.xml)的resources路径必须与java中持久层的接口Dao路径相匹配,创建路径时也必须逐层Directory,如果一次性创建,可能并不会创建分层的目录,路径就无法匹配。
!!!如果使用注解的方式,一定要移除对应的映射配置文件(Dao.xml)
查询所有
IUserDao.xml中关于’查询所有‘这个功能的配置,其关键路径是由namespace的接口路径
id是接口中定义的方法的名字,返回类型可以通过SqlMapConfig.xml中的package标签进行简化,不然也需要全路径
下面是保存用户的例子,其中#{}代表了ppst中的占位符,会自动进行java类型和jdbc类型的转换,填充对象的数据,简单的传入单个参数,名称可以为value也可以任意设置
(下下张图备注中使用的${}表示的是拼接sql串,但不会进行jdbc类型转换,但如果是单个参数,名称必须为value)
注解方式:
没有了映射文件
只需要在接口定义的方法上直接写出sql语句:
模糊查询
如果是模糊查询有2种配置方式,推荐使用参数占位符的方式,字符串拼接很不安全。
你只需要在输入参数的地方自己手动加上%就可以了。
测试类中的方法:
注解方式:
没有了映射文件
只需要在接口定义的方法上直接写出sql语句,对于参数的写法使用#{}
条件查询
mybatis可以使用条件查询,需要在接口配置文件中进行处理
用where和if标签去动态增添语句,通过and的sql方式去动态拼接条件。
paremeterPype参数配置
这个标签属性,不仅可以设置为基本类型,比如Integer、String等,还可以使用自定义的实体类(POJO)类型,比如自定义一个包装了user的POJO类:
接口中定义方法为:
接口的配置文件中:
这个方法是遍历了一组id,去找寻id范围内的user
resultType参数配置
我们默认的配置,因为domain的类属性与数据库表中的column是一致的,所以会实现自动匹配封装(匹配时,mysql不区分大小写,所以单纯的驼峰命名与默认配置时一致的),但是如果不一致,会无法实现封装。
如果要自己取别名,而要其实现匹配封装,有2种方式。
a.需要在配置的语句中自己加上别名
用as的方式,把column属性与自己定义的名称一一对应。
b.由于上述方式过于具体,你需要在每一个使用了 别名的方法中更改,比较麻烦,所以还可以采用定义resultMap的方式
之后把所有的resultType更改为resultMap即可
一对一查询
有多种方式:
a.定义一个包含两个实体所需信息的实体,那么只需要在返回数据时更改returnType为这个综合了信息的实体即可。
b.使用resultMap去定义一对一映射的查询的结果(使用这种方式需要在一对一中,返回类型的一的那一方去添加另一方的对象,重点是重新定义接口类的配置)
注解方式:(一个账户对一个用户)
没有了映射文件
只需要在接口定义的方法上直接写出sql语句:
一对多查询
一个用户有多个账户,如果查询时该用户没有账户,仍然需要将该用户查询出来,所以用左外连接进行查询。
配置时,在一的一方的实体类中,添加多的一方的对象集合,并且修改配置文件
注解方式:(一个用户对多个账户)
没有了映射文件
只需要在接口定义的方法上直接写出sql语句:
多对多查询
用户可以有多个角色,一个角色可以对应多个用户
多对多其实就是双向的一对多关系,关键在于sql语句比较复杂(使用中间表),仍然是在主动方的实体类中,添加被动方的对象List集合。
另一方的反过来配置即可
注解配置:
多对多就是双向的一对多,同一对多中的配置。
延迟加载
一般在查询数据时,对于被动方的使用不是即时性的,所以不需要使用被动方数据时就可以使用懒加载来提高性能(查询单表比关联查询多表的速度快)
以一对一关系(账户对用户)的例子,配置用户延迟加载
a.使用association参数来配置延迟加载的部分
要使用还需要在SqlMapConfig.xml中添加延迟加载开启
b.还可以直接使用以前用过的collection标签来配置延迟加载,但是需要进行改动,使用select和column去实现新的映射
mybatis一级缓存
是SqlSession级别的缓存,只要SqlSession没有flush或close,它就存在
需要在配置方法时添加useCache参数
只要SqlSession没有进行flush和close,对同样的结果集进行查询时,只会执行一次数据库操作,第二次查询时不会向数据库发出sql语句,而是直接从一级缓存中查询。
SqlSession的修改添加删除commit,close都会清空一级缓存。
如果SqlSession执行commit操作,这样的目的是为了让缓存中存储的是最新的信息,避免脏读。
注解方式:
其实一级缓存是默认开启的,只是flush和close清空他,所以打开是不需要配置的。
二级缓存
是mapper映射级别的缓存,只要由同一个SqlSessionFactory创建的SqlSession都能共享缓存
需要到SqlMapConfig.xml去添加setttings设置
然后去映射文件中添加,cache标签就代表该映射将使用二级缓存
然后还需要在具体的语句上去使用useCache标签
测试类为:
基于注解的配置:
没有了映射文件
但是SqlMapConfig.xml中的setting开启也是需要进行的。
只是需要在持久层接口中,使用注解开启二级缓存
2. resources根目录下的SqlMapConfig.xml配置文件
一般头部是默认的mybatis的config约束
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
内部的configuration的配置细节已经在下面的代码中全部加上了备注
其中配置连接池的数据的信息,需要引入jdbcConfig.properties(也可以直接指定,写在properties中,以name value的形式,不过还是推荐使用配置文件)
为了方便配置,可以在typeAliases和mappers中使用package标签,实现实体类的别名指定和接口映射文件的路径指定。(typeAliases使用package是批量的别名定义,会扫描包下的所有类,必须银蛇文件名称相同,且放在同一个目录中。也可以用typeAlias去细节定义)
SqlMapConfig.xml属性配置
<configuration> <!--配置properties 可以在标签内部配置连接数据库的信息,也可以通过属性引用外部配置文件信息 resource属性 用于指定配置文件的位置,按照类路径的写法来写,必须存在于类路径下 url属性 是要求按照url的写法来写地址 URL:Uniform Resource Locator 统一资源定位符。它可以唯一地表示一个资源的位置 like:http://localhost:8080/StoreV5/Servlet 协议 主机 端口 URI URI:Uniform Resource Identifier 统一资源标识符。它可以在应用中惟一的定位一个资源 --> <properties url="file:///D:/WorkSpace/IDEAworkspace/mybatis_base/mybatis_dao/src/main/resources/jdbcConfig.properties"/> <!--<properties resource="jdbcConfig.properties"/>--> <!--使用typeAliases配置别名,它只能配置domain中类的别名--> <typeAliases> <!--<!–type属性指定实体类的全限定类名。alias属性指定别名,当指定了别名就不再区分大小写–>--> <!--<typeAlias type="com.lky.domain.User" alias="user"/>--> <!--用于指定要配置别名的包,当指定之后,该包下的实体类都会这册别名(类名,不区分大小写)--> <package name="com.lky.domain"/> </typeAliases> <!--配置环境--> <environments default="mysql55"> <!--配置mysql55环境--> <environment id="mysql55"> <!--配置事务--> <transactionManager type="JDBC"></transactionManager> <!--配置连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--配置映射文件位置--> <mappers> <!--<mapper resource="com/lky/dao/IUserDao.xml"/>--> <!--package标签用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource或者class了--> <package name="com.lky.dao"/> </mappers> </configuration>
MyBatis 在初始化时, 根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即:
type=”POOLED”: MyBatis 会创建 PooledDataSource 实例
type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例
type=”JNDI”: MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用
配置完pom.xml,接口的映射文件Dao.xml,总的配置文件SqlMapConfig.xml,和个人的数据库连接参数jdbcConfig.properties之后,就可以使用mybatis了。
使用mybatis的步骤(简单的从数据库查询所有User),如下
为了方便多个测试,可以使用Junit的@Before和@After方法,把资源创建和释放分开,更便于测试mybatis的各种配置和应用(其中@After方法常常与Mybatis事务提交所组合,在释放资源前,session.commit();其实事务开启的开关在openSession()方法中,可设置为true or false)
最后,给上Mybatis的官方使用文档,中文的
http://www.mybatis.org/mybatis-3/zh/getting-started.html
所有的细节设置都可以在其中学到,希望大家一起进步!