核心配置文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--mybatis配置文件中的约束-->
  3. <!DOCTYPE configuration
  4. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  5. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  6. <configuration>
  7. <!--设置类型的别名-->
  8. <typeAliases>
  9. <!--设置某个类型的别名-->
  10. <!--alias不设置,默认设置别名为类名,切不区分大小写-->
  11. <!-- <typeAlias type="cn.domian.User" alias="User"></typeAlias>-->
  12. <!--设置包下的所有类的别名,默认设置别名为类名-->
  13. <package name="cn.domian"/>
  14. </typeAliases>
  15. <plugins>
  16. <!-- 设置分页插件-->
  17. <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
  18. </plugins>
  19. <!-- 配置多个数据库的环境
  20. 属性:default多个环境中的其中一个环境的id
  21. 也就是说我们可以配置多套<environment>环境-->
  22. <environments default="development">
  23. <!--设置具体的环境
  24. id:表示连接数据库具体环境的唯一标识,不能重复
  25. -->
  26. <environment id="development">
  27. <!--
  28. transactionManager 事务管理器:设置事务管理方式
  29. type的值有JDBC和MANAGED
  30. JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,
  31. 它依赖从数据源获得的连接来管理事务作用域。
  32. 事务的提交和回滚需要手动处理
  33. MANAGED - 被管理,例如:spring
  34. -->
  35. <transactionManager type="JDBC"/>
  36. <!--
  37. dataSourcedataSource 数据源 连接数据库的信息
  38. dbcp | c3p0 | druid
  39. type="[UNPOOLED|POOLED|JNDI]"
  40. POOLED意思有连接池的连接
  41. UNPOOLED意思没有连接池的连接
  42. JNDI 使用上下文中的数据源
  43. -->
  44. <dataSource type="POOLED">
  45. <!--JDBC 驱动名称-->
  46. <property name="driver" value="com.mysql.jdbc.Driver"/>
  47. <!--url数据库的 JDBC URL地址-->
  48. <property name="url" value="jdbc:mysql:///manhan?useUnicode=yes&amp;characterEncoding=utf-8&amp;rewriteBatchedStatements=true"/>
  49. <property name="username" value="root"/>
  50. <property name="password" value="zax"/>
  51. <!--defaultTransactionIsolationLevel – 默认的连接事务隔离级别。&ndash;&gt;-->
  52. <!--<property name="defaultTransactionIsolationLevel" value=""/>-->
  53. <!--defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)&ndash;&gt;-->
  54. <!--<property name="efaultNetworkTimeout" value=""/>-->
  55. </dataSource>
  56. </environment>
  57. </environments>
  58. <!--引入映射文件-->
  59. <mappers>
  60. <!-- 使用相对于类路径的资源引用 -->
  61. <!-- <mapper resource="mapper/UserMapper.xml"/>-->
  62. <!-- 使用完全限定资源定位符(URL)
  63. 不推荐使用
  64. <mapper url="E:\JetBrains\mybatis学习\Mybatis-study\Mybatis-03\src\main\java\asia\xiaojiang\mybatis03\dao\UserMapper.xml"/>
  65. -->
  66. <!-- 使用映射器接口实现类的完全限定类名
  67. 使用注意点:
  68. 接口和其配置文件必须同名, 必须在同一个包下
  69. -->
  70. <!-- <mapper class="asia.xiaojiang.mybatis03.dao.UserMapper"/>
  71. -->
  72. <!--引入包下所有的映射文件
  73. 两个要求:
  74. 1.mapper接口和映射文件所在的包名要一致
  75. 2.mapper接口和映射文件名字一致
  76. -->
  77. <package name="cn.mapper"/>
  78. </mappers>
  79. </configuration>

映射文件:
<?xml version=”1.0” encoding=”utf-8”?>
<!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN”http://mybatis.org/dtd/mybatis-3-mapper.dtd"_>
**
<mapper namespace=”cn.mapper.UserMapper”>

_<insert id=”insertUser”>
insert user values(‘12121’,’2112’);
</insert>
</mapper>


  1. 加载核心配置文件
  2. 获取SqlSessionFactoryBuilder对象
  3. 通过SqlSessionFactoryBuilder对象获取SqlSessionFactory对象
  4. 再通过SqlSessionFactory对象获取SqlSession
  5. 通过SqlSession对象代理模式获取Mapper接口对象
  6. 调用Mapper对象中的方法执行sql语句
  7. SqlSession.commit方法提交事务

  1. Mapper接口初始在SQLSessionFactory注册的。
  2. Mapper接口注册在MapperRegistry类的HashMap中,key是mapper的接口类名,value是创建当前代理工厂。
  3. Mapper注册之后,可以从过SQLSession来获取get对象。
  4. SQLSession.getMapper运用了JDK动态代理,产生了目标Mapper接口的代理对象,动态代理的代理类是MapperProxy,实现了增删改查调用。



231ebc0bcee2413ba3dd49afabf6c964.png10882211-a81622050f9c887b.webp


//加载核心配置文件
_InputStream is = Resources._getResourceAsStream
(“mybatis-config.xml”);
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = ssfb.build(is);
//java程序和数据库之间的会话
//设置是否自动提交事务,默认是不自动提交
_SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过动态代理获取mapper接口的对象
_UserMapper mapper = sqlSession.getMapper(UserMapper.class);


SqlSessionFactoryBuilder
image.pngSqlSessionFactory
image.png
SqlSession
image.png
生命周期和作用域
image.png

动态sql标签

1.标签
也叫片段,在使用sql片段时使用include标签通过sql片段的id进行引用,sql片段的id在当前空间是唯一的,sql片段中也可以写其他的内容,只要符合语法规范都是可以的。

sql语句

引用sql语句

2.标签
根据where其后是否有sql,判断拼接 where,满足条件就拼接,否则不拼接。 可以自动去除多余的and和or
select from animal


and name = #{name}


3. 标签
类似于Java中的switch分支。只进入一个满足when的条件,如果所有when都不满足,则进入otherwise。
select
from animal


hobby = #{hobby} and name = #{name}


hobby = #{hobby}


name = #{name}


4.标签
用于遍历List、Map、Array , 属性如下:

  • collection:指定需要遍历的元素
  • item:遍历之后的每一项
  • separator:定义foreach里面语句的分隔符如“and”“or”“,”
  • open:以什么开始如“(”
  • close:以什么结尾如 “)”
  • index:map中代表key,数组中代表数组下标

5.标签
prefix: 在trim标签中内容前缀添加指定内容 如“and”“or”
suffix:在trim标签中内容后缀添加指定内容
prefixoverrides:在trim标签中内容前缀删除指定内容
suffixoverrides:在trim标签中内容后缀删除指定内容

缓存机制

03c3491e481640928d7d9daf83996e22.png
mybatis缓存机制:若连续执行两条相同的SQL语句,可以直接从缓存中获取,如果获取不到,再去数据库中查找。
缓存分为一级缓存、二级缓存、第三方缓存
(1)一级缓存:表示将数据存在SQLSession中,每次查询的时候都会开启一个会话,关闭后数据失效,默认是开启状态。
(2)二级缓存:全局范围的缓存,在SqlSession关闭后才会生效
(3)第三方缓存:继承第三方插件,来充当缓存的作用
一级缓存:

  1. 一级缓存是SQLSession级别缓存,在操作数据库时都需要构造SQLSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据,不同的SQLSession之间的缓存数据区域是互不影响的。
  2. 一级缓存的作用于是在同一个SQLSession,在同一个SQLSession中执行相同的两次SQL,第一次执行完毕在后会将数据写到缓存中,第二次从缓存中进行后去就不在数据库中查询,从而提高了效率,
  3. 当一个SQLSession结束后该SQLSession中的一级缓存也就不存在了,mybatis默认开启一级缓存。

二级缓存:

  1. 二级缓存是mapper级别缓存,多个SQLSession去操作同一个mapper的SQL语句,多个SQLSession操作都会存在二级缓存中,多个SQLSession共用二级缓存,二级缓存是跨SQLSession的。
  2. 二级缓存是多个SQLSession共享的,作用域是mapper下的同一个namespace。不同的SQLSession两次执行相同的namespace下的SQL最终能获取相同的SQL语句结果。

缓存顺序:
(1)一级缓存和二级缓存是不会同时存在的,因为二级缓存是在sqlSession关闭后生效的,如果一级缓存存在,那么意味着sqlSession还未关闭(一级缓存是在sqlSession关闭后失效),若二级缓存存在,意味着sqlSession已关闭,且不管一级、二级缓存存在哪个,在接下来的查询是从缓存中拿取数据,那侧面也可体现出一二级缓存不会同时存在
(2)先查二级缓存再查一级缓存最后查数据库
二级缓存标签的属性
image.png

Mybatis逆向工程:

导入依赖


<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>

<dependencies>

<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
</dependencies>
<configuration>

<verbose>true</verbose>

<overwrite>false</overwrite>

<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
</plugin>

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <!--
  7. targetRuntime :执行生成的逆向工程版本
  8. MyBatis3Simple:生成基本的CRUD(清新简洁版)只有增 删 改 查所有、查单条五个条件
  9. MyBatis3:生成带条件的CRUD(奢华尊享版)会生成xxxExample类
  10. -->
  11. <context id="testTables" targetRuntime="MyBatis3">
  12. <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
  13. <jdbcConnection driverClass="com.mysql.jdbc.Driver"
  14. connectionURL="jdbc:mysql:///k2502?useUnicode=yes&amp;characterEncoding=utf-8&amp;rewriteBatchedStatements=true"
  15. userId="root"
  16. password="zax">
  17. </jdbcConnection>
  18. <!--javaBean生成策略-->
  19. <javaModelGenerator targetPackage="com.kgc.domain" targetProject=".\src\main\java">
  20. <!-- enableSubPackages:是否使用子包 -->
  21. <property name="enableSubPackages" value="true"/>
  22. <!-- 解析数据库中的表反向生成的实体类,映射文件
  23. 数据库表字段名转换成实体类属性
  24. trimStrings:去除掉字段名前后的空格-->
  25. <property name="trimStrings" value="true"/>
  26. </javaModelGenerator>
  27. <!-- 映射文件生成策略-->
  28. <sqlMapGenerator targetPackage="com.kgc.dao" targetProject=".\src\main\java">
  29. <property name="enableSubPackages" value="true"/>
  30. </sqlMapGenerator>
  31. <!-- mapper接口生成策略 -->
  32. <javaClientGenerator type="XMLMAPPER" targetPackage="com.kgc.dao"
  33. targetProject=".\src\main\java">
  34. <property name="enableSubPackages" value="true"/>
  35. </javaClientGenerator>
  36. <!-- 指定逆向分析的表-->
  37. <!-- tableName为*时,可对应数据库下所有的表,此时不用写domainObjectName-->
  38. <!-- domainObjectName指定生成出来的实体类的类名-->
  39. <table tableName="grade" domainObjectName="Grade"/>
  40. <table tableName="student" domainObjectName="Student" />
  41. <!-- enableCountByExample="false"-->
  42. <!-- enableUpdateByExample="false"-->
  43. <!-- enableDeleteByExample="false"-->
  44. <!-- enableSelectByExample="false"-->
  45. <!-- selectByExampleQueryId="false"-->
  46. </context>
  47. </generatorConfiguration>

逆向工程自动生成的Example类

属性:
orderByClause:用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定。
distinct: 是用来指定是否要去重查询的,true为去重,false不去重。
oredCriteria:是用来指定查询条件的。
方法:
example.setOrderByClause(“字段名 ASC”); 添加升序排列条件,DESC为降序
example.setDistinct(false) 去除重复,boolean型,true为选择不重复的记录。


image.png
image.png
XXXExample example=new XXXExample();
用Example类对象调用createCriteria()方法获取一个Criteria对象
XXXExample.Criteria criteria = example.createCriteria();

  1. criteria.andXxxIsNull 添加字段xxx为null的条件
  2. criteria.andXxxIsNotNull 添加字段xxx不为null的条件
  3. criteria.andXxxEqualTo(value) 添加xxx字段等于value条件
  4. criteria.andXxxNotEqualTo(value) 添加xxx字段不等于value条件
  5. criteria.andXxxGreaterThan(value) 添加xxx字段大于value条件
  6. criteria.andXxxGreaterThanOrEqualTo(value) 添加xxx字段大于等于value条件
  7. criteria.andXxxLessThan(value) 添加xxx字段小于value条件
  8. criteria.andXxxLessThanOrEqualTo(value) 添加xxx字段小于等于value条件
  9. criteria.andXxxIn(List<?>) 添加xxx字段值在List<?>条件

用于批量删除、批量添加

  1. criteria.andXxxNotIn(List<?>) 添加xxx字段值不在List<?>条件
  2. criteria.andXxxLike(“%”+value+”%”) 添加xxx字段值为value的模糊查询条件
  3. criteria.andXxxNotLike(“%”+value+”%”) 添加xxx字段值不为value的模糊查询条件
  4. criteria.andXxxBetween(value1,value2) 添加xxx字段值在value1和value2之间条件
  5. criteria.andXxxNotBetween(value1,value2) 添加xxx字段值不在value1和value2之间条件

1.对应的 XXXExample.java 中添加两个属性,以及对于的 getter 和 setter 方法

  1. //开始查询的位置
  2. protected int startRow;
  3. //每页显示的行数
  4. protected int pageSize;
  5. public int getStartRow() {
  6. return startRow;
  7. }
  8. public void setStartRow(int startRow) {
  9. this.startRow = startRow;
  10. }
  11. public int getPageSize() {
  12. return pageSize;
  13. }
  14. public void setPageSize(int pageSize) {
  15. this.pageSize = pageSize;
  16. }

2.对应的xxxMapper.xml文件, id为selectByExample 的语句前加上

  1. <if test="startRow != null and pageSize != null and pageSize != 0">
  2. limit #{startRow},#{pageSize}
  3. </if>

image.png

逆向工程多表级联查询:

1.先创建一个类继承员工实体类
image.png
2.多对一映射关系,属性为部门实体类对象
如果一对多映射关系,属性为员工实体集合
image.png
3.在对应的员工mapper接口中添加一个新的方法用于多表联查
image.png
4.在对应的sql映射文件中添加sql语句
中间内容的sql直接复制id为selectByExample 的
image.png

分页插件分页:

1.导入依赖

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
2.在mybatis核心配置文件中配置插件
<plugins>

<plugin interceptor=”com.github.pagehelper.PageInterceptor”></plugin>
</plugins>
3.查询步骤之前开启分页
PageHelper.startPage(当前页码,每页显示数据的行数)
_// 把条件对象作为参数传入
_List sBG = mapper1.StudentAndGrade(se);
4.分页之后获取分页相关的数据
PageInfo page = new PageInfo<>(sBG, 导航分页的页码数);
image.png

映射文件转义符

  1. &lt; <
  2. &gt; >
  3. &lt;&gt; <>
  4. &amp; &
  5. &apos; '
  6. &quot; "