Mybatis详解

MyBatis中文手册

MyBatis中文网

 

Maven仓库

Maven Repository: Search/Browse/Explore

 

为什么需要Mybatis

MyBatis工作示意图

 传统方式(非MyBatis)

 

 

一、快速入门

 

1.Maven父子项目配置

父项目以多个子模块/子项目管理工程

父项目会管理多个子模块/子项目,将来父项目中的引入的依赖可以直接给子项目用

 

新建Maven项目后,将src文件夹删除

 

 

引入MyBatis依赖

 
  1. <dependencies>
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>8.0.23</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>junit</groupId>
  9. <artifactId>junit</artifactId>
  10. <version>4.13.1</version>
  11. <!--<scope>test</scope>-->
  12. </dependency>
  13. <dependency>
  14. <groupId>org.mybatis</groupId>
  15. <artifactId>mybatis</artifactId>
  16. <version>3.5.14</version>
  17. </dependency>
  18. </dependencies>
 
XML

scope标签

如果有一个scope-test表示该jar 的作用范围在test目录

创建子项目

子项目的pom.xml文件

artifactId子项目的名称

这里配置后,该模块可以使用/引用父项目的依赖

 

2.配置MyBatis-Config

作用:配置数据库连接/数据源

管理XXXMapper.xml

位置一定要放在resources文件中

名称不一定是MyBatis-Config,可以自己自定义

具体配置信息查看文档

入门_MyBatis中文网

配置外部配置文件db.properties

db.properties

 
  1. driver=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/mybatis2025?userSSL=true&useUnicode=true&characterEncoding=utf8
  3. username=root
  4. password=123456
 
XML

MyBatis-Config文件内容

 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 加载外部配置文件 -->
  7. <properties resource="db.properties"/>
  8. <environments default="development">
  9. <environment id="development">
  10. <transactionManager type="JDBC"/>
  11. <!-- 配置数据源 -->
  12. <dataSource type="POOLED">
  13. <property name="driver" value="${driver}"/>
  14. <property name="url" value="${url}"/>
  15. <property name="username" value="${username}"/>
  16. <property name="password" value="${password}"/>
  17. </dataSource>
  18. </environment>
  19. </environments>
  20. <mappers>
  21. <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  22. </mappers>
  23. </configuration>
 
XML

 

3.创建一个Monster对象 - 和数据库中的monster表对应

 

 

并参考数据库的中的字段定义monster对象

 
  1. CREATE TABLE `monster` (
  2. `id` INT NOT NULL AUTO_INCREMENT,
  3. `age` INT NOT NULL,
  4. `birthday` DATE DEFAULT NULL,
  5. `email` VARCHAR(255) NOT NULL ,
  6. `gender` TINYINT NOT NULL,
  7. `name` VARCHAR(255) NOT NULL,
  8. `salary` DOUBLE NOT NULL,
  9. PRIMARY KEY(`id`)
  10. ) CHARSET=utf8;
 
sql
 
  1. public class Monster {
  2. private Integer id;
  3. private String age;
  4. private Date birthday;
  5. private String email;
  6. private String gender;
  7. private String name;
  8. private String salary;
  9. .......
  10. }
 
java

 

4.创建一个MonsterMapper接口 - 该接口用于声明操作monster表的方法

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Monster;
  4.  
  5. public interface MonsterMapper {
  6. /**
  7. * 添加
  8. * @param monster
  9. */
  10. public void addMonster(Monster monster);
  11. }
 
java

 

创建MonsterMapper.xml

 

里面的配置参考文档中的模版

入门_MyBatis中文网

 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="org.mybatis.example.BlogMapper">
  6. <select id="selectBlog" resultType="Blog">
  7. select * from Blog where id = #{id}
  8. </select>
  9. </mapper>
 
XML

  1. 是用于实现对应接口方法的文件。
  2. namespace 用于指定该 XML 文件与哪个接口相对应。
  3. id="addMonster" 对应接口的方法名。
  4. parameterType="com.hspedu.entity.Monster" 表示传入的形参类型为 com.hspedu.entity 包下的 Monster 类,且该类名可简写。
  5. 编写 SQL 语句时,建议先在 SQL工具 中完成并测试通过后再使用。
  6. 添加语句 - 建议表名和字段名带上反引号
  7. #{age},#{birthday},#{email},#{gender},#{name},#{salary}是从Monster对象传入的
 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.goodup.mapper.MonsterMapper">
  6. <insert id="addMonster" parameterType="com.goodup.entity.Monster">
  7. insert into `monster`(`age`, `birthday` , `email`,`gender`, `name`, `salary`) values (#{age},#{birthday},#{email},#{gender},#{name},#{salary});
  8. </insert>
  9. </mapper>
 
XML

 

 

 

 

5.在MyBatis-Config中配置关联Mapper.xml

如果快速复制全路径

 

 

6.创建一个工具类MyBatisUtils,快速得到sqlSession

 

 

Resources的选择

 

编写静态代码块-初始化sqlSessionFactory

 
  1. private static SqlSessionFactory sqlSessionFactory;
  2. static {
  3. try {
  4. //获取到配置文件mybatis-config.xml对应的inputStream
  5. //加载文件时,默认resources目录==》运行后的工作目录
  6. InputStream resourceAsStream = Resources.getResourceAsStream("mybaties-config.xml");
  7. sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
  8. System.out.println("sqlSessionFactory:"+sqlSessionFactory);
  9. } catch (IOException e) {
  10. throw new RuntimeException(e);
  11. }
  12. }
 
java

 

编写方法,返回sqlSession对象-会话

 
  1. public static SqlSession getSqlSession(){
  2. return sqlSessionFactory.openSession();
  3. }
 
java

 

7.获取到Mapper代理对象

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Monster;
  4. import com.goodup.util.MyBatisUtil;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8.  
  9. import java.util.Date;
  10.  
  11. public class MonsterMapperTest {
  12. private MonsterMapper monsterMapper;
  13. private SqlSession sqlSession;
  14.  
  15. @Before
  16. public void init(){
  17. sqlSession = MyBatisUtil.getSqlSession();
  18. monsterMapper = sqlSession.getMapper(MonsterMapper.class);
  19. }
  20. @Test
  21. public void testAddMonster(){
  22. Monster monster = new Monster();
  23. monster.setAge("18");
  24. monster.setBirthday(new Date());
  25. monster.setEmail("123@qq.com");
  26. monster.setGender("男");
  27. monster.setName("张三");
  28. monster.setSalary("10000");
  29. monsterMapper.addMonster(monster);
  30. sqlSession.commit();
  31. }
  32. }
 
java

运行将发生错误

原因是target中的MonsterMapper.xml文件不存在

 

解决方案

  • 方案一:在父工程的pom.xml加入build配置
 
  1. <build>
  2. <resources>
  3. <resource>
  4. <directory>
  5. src/main/java
  6. </directory>
  7. <includes>
  8. <include>**/*.xml</include>
  9. </includes>
  10. </resource>
  11. <resource>
  12. <directory>src/main/resources</directory>
  13. <includes>
  14. <include>**/*.xml</include>
  15. <include>**/*.properties</include>
  16. </includes>
  17. </resource>
  18. </resources>
  19. </build>
 
XML

 

  • 方案二:将com.goodup.mapper.MonsterMapper.xml移动到resources中

 @Before注解的含义

表示在执行目标测试方法前,会先执行该方法

 

 

如果增删改,需要提交事务

 

 

 

8.返回自增长id

参考文档中的两个属性

XML 映射器_MyBatis中文网

 

 

运行结果

 

9.删除

java.lang.Integer是java类型,可以简写成Integer

 
  1. <delete id="deleteMonster" parameterType="java.lang.Integer">
  2. delete from `monster` where `id` = #{id};
  3. </delete>
 
XML

 

测试

 
  1. @Test
  2. public void testDeleteMonster(){
  3. monsterMapper.deleteMonster(1);
  4. if(sqlSession != null){
  5. sqlSession.commit();
  6. sqlSession.close();
  7. }
  8. }
 
java

 

10.修改

在MonsterMapper接口中添加方法

在MonsterMapper.xml中添加update标签

 
  1. <update id="updateMonster" parameterType="com.goodup.entity.Monster">
  2. update `monster` set `age` = #{age},
  3. `birthday` = #{birthday},
  4. `email` = #{email},
  5. `gender` = #{gender},
  6. `name` = #{name},
  7. `salary` = #{salary}
  8. where `id` = #{id};
  9. </update>
 
XML

 

 

 

 

11.类型别名-缩写名字

参考官方文档

配置_MyBatis中文网

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
  <typeAlias alias="Section" type="domain.blog.Section"/>
  <typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>

 

12.查询

XML 映射器_MyBatis中文网

 

 

 

 

查询单个-根据id查询

 

 

查询所有-集合

在MonsterMapper接口中添加一个方法

在MonsterMapper.xml做出修改

 

测试

 

 

 

二、日志输出配置-查看执行的sql语句

文档跳转

配置_MyBatis中文网

 

日志信息

 

 

三、原生的Api和注解的方式

1.原生api的调用

 
  1. @Test
  2. public void testApi(){
  3. Monster monster = new Monster();
  4. monster.setAge("182");
  5. monster.setBirthday(new Date());
  6. monster.setEmail("123213@qq.com");
  7. monster.setGender("1");
  8. monster.setName("张三231");
  9. monster.setSalary("102330");
  10. int insert = sqlSession.insert("com.goodup.mapper.MonsterMapper.addMonster", monster);
  11. System.out.println("insert:" + insert);
  12. if(sqlSession != null){
  13. sqlSession.commit();
  14. sqlSession.close();
  15. }
  16. }
 
java

 

2.注解的方式操作-不用在xml文件中配置sql语句

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Monster;
  4. import org.apache.ibatis.annotations.Delete;
  5. import org.apache.ibatis.annotations.Insert;
  6. import org.apache.ibatis.annotations.Select;
  7. import org.apache.ibatis.annotations.Update;
  8.  
  9. public interface MonsterAnnotation {
  10. @Select("select * from monster where id = #{id}")
  11. public Monster getMonster(int id);
  12.  
  13.  
  14. @Insert("insert into monster(age,birthday,email,gender,name,salary) " +
  15. "values (#{age},#{birthday},#{email},#{gender},#{name},#{salary});")
  16. public void insertMonster(Monster monster);
  17.  
  18.  
  19. @Update("update monster set age=#{age},birthday=#{birthday}," +
  20. "email=#{email},gender=#{gender}," +
  21. "name=#{name},salary=#{salary} where id=#{id}")
  22. public void updateMonster(Monster monster);
  23.  
  24.  
  25. @Delete("delete from monster where id=#{id}")
  26. public void deleteMonster(int id);
  27. }
 
java

修改Mybatis-config.xml,对MonsterAnnotation进行注册

 

 

 

注意事项

如果在Config中不配置将会发生以下错误

 

@option

 

 

 

 

 

 

 

 

四、Mybatis-config.xml配置文件

 

官方文档

配置_MyBatis中文网

 

1.properties属性

数据库配置信息db.properties

 
  1. driver=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/mybatis2025?userSSL=true&useUnicode=true&characterEncoding=utf8
  3. username=root
  4. password=123456
 
java

 

在mybatis-config中引入外部db.properties

    <properties resource="db.properties"/>
XML
 
  1. <dataSource type="POOLED">
  2. <property name="driver" value="${driver}"/>
  3. <property name="url" value="${url}"/>
  4. <property name="username" value="${username}"/>
  5. <property name="password" value="${password}"/>
  6. </dataSource>
 
XML

如果运行后db.properties无法抵达target目录

 

 

 

 

需要在pom.xml中进行配置

 
  1. <resource>
  2. <directory>src/main/resources</directory>
  3. <includes>
  4. <include>**/*.xml</include>
  5. <include>**/*.properties</include>
  6. </includes>
  7. </resource>
 
XML

 

2.settings全局参数定义

配置_MyBatis中文网

 

3.typeAliases别名处理器

  • 别名作用:为 Java 类型命名简短名称,仅和 XML 配置相关,能减少类名重复部分。
  • 对 XML 文件的影响:若指定别名,Mapper相关的 XML 文件可进行简化处理。
  • 使用规则:指定别名后,仍能使用类的全名。

 

配置一个包

 
  1. <typeAliases>
  2. <package name="com.goodup.entity"/>
  3. </typeAliases>
 
XML

 

 

4.typeHandlers类型处理器

  • 功能:用于 Java 类型和 JDBC 类型之间的映射。
  • 默认情况:MyBatis 自身的映射基本能满足需求,一般无需重新定义,使用默认的即可,MyBatis 会自动进行 Java 和 JDBC 类型的转换。
  • 参考资料:Java 类型和 JDBC 类型的映射关系可查阅 MyBatis 手册,地址为配置_MyBatis中文网
  • 工作场景:MyBatis 在设置预处理语句(PreparedStatement)中的参数,或者从结果集中取出值时,都会借助类型处理器来处理相关类型。

配置_MyBatis中文网

 

5.environments环境

配置_MyBatis中文网

  1. resource 方式:用于注册 XXXMapper.xml 文件,是常用且已使用过的方式,通过在 <mappers> 标签下配置 <mapper resource="..."/> 来引入 Mapper.xml 文件。
  2. class 方式:适用于接口注解实现的情况。若采用注解方式,可不再使用 Mapper.xml 文件,但需要在 mybatis - config.xml 中注册含注解的类,形式为 <mapper class="..."/>,也已使用过。
  3. url 方式:通过外部路径注册,使用很少且不推荐,格式为 <mapper url="..."/>
  4. package 方式:直接配置 <package name="包名"/> 来注册指定包下的 Mapper,还需进行测试。

 

 

五、xml映射器

 

 

1.parameterType输入参数类型

传入pojo类型

以根据id或者name查询Monster为例

MonsterMapper.java

 
  1. //根据id或者名字查询
  2. public List<Monster> findByIdOrName(Monster monster);
 
java

MonsterMapper.xml

 
  1. <select id="findByIdOrName" parameterType="com.goodup.entity.Monster" resultType="com.goodup.entity.Monster">
  2. select * from monster where id=#{id} or name=#{name}
  3. </select>
 
XML

 

传入简单类型

查询name中包含''牛魔王"的妖怪

MonsterMapper中

 
  1. //根据名字查询
  2. public List<Monster> queryMonsterByName(String name);
 
java

MonsterMapper.xml文件中

 

 

 

 

2.传入HashMap-灵活增加查询属性

查询id>10并且salary大于40的Monster,传入参数是HashMap

MonsterMapper中

 public List<Monster> queryMonsterByIdANdSalary_PrameterHashMap(Map<String,Object> map);
java

MonsterMapper.xml文件中

 
  1. <select id="queryMonsterByIdANdSalary_PrameterHashMap" parameterType="java.util.Map" resultType="com.goodup.entity.Monster">
  2. select * from monster where id>#{id} and salary>#{salary}
  3. </select>
 
XML

 

测试

 
  1. @Test
  2. public void queryMonsterByIdANdSalary_PrameterHashMap(){
  3. Map<String,Object> map = new HashMap<>();
  4. map.put("id",10);
  5. map.put("salary",40);
  6. List<Monster> monsters = monsterMapper.queryMonsterByIdANdSalary_PrameterHashMap(map);
  7. for (Monster monster : monsters) {
  8. System.out.println(monster);
  9. }
  10. if(sqlSession!=null){
  11. sqlSession.close();
  12. }
  13. }
 
java

 

3.map返回类型

MonsterMapper中

public List<Map<String,Object>> queryMonsterByIdReturnMap(Map<String,Object> map);
java

MonsterMapper.xml文件中

 
  1. <select id="queryMonsterByIdReturnMap" parameterType="java.util.Map" resultType="java.util.Map">
  2. select * from monster where id>#{id} and salary>#{salary}
  3. </select>
 
XML

测试

 
  1. @Test
  2. public void queryMonsterByIdReturnMap() {
  3. Map<String, Object> map = new HashMap<>();
  4. map.put("id", 10);
  5. map.put("salary", 40);
  6. List<Map<String, Object>> mapList = monsterMapper.queryMonsterByIdReturnMap(map);
  7. for (Map<String, Object> map1 : mapList) {
  8. for (String s : map1.keySet()) {
  9. System.out.println(s + ":" + map1.get(s));
  10. }
  11. System.out.println("----------------");
  12. }
  13. if (sqlSession != null) {
  14. sqlSession.close();
  15. }
  16. }
 
java

 

 

 

 

 Monster对象将以键值对的形式返回

 

 

 

 

4.resultMap(结果集映射)

 

 

当实体类的属性和表的字段名不一致时,我们可以通过resultMap进行映射,从而屏蔽实体类属性名和表的字段名的不同

 
  1. create table `user`(
  2. `user_id` int not null auto_increment,
  3. `user_email` varchar(255) default '',
  4. `user_name` varchar(255) default '',
  5. primary key (`user_id`)
  6. )charset=utf8;
 
sql

创建实体类user(该实体类的属性和表的字段名不一致)

UserMapper接口

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.User;
  4.  
  5. import java.util.List;
  6.  
  7. public interface UserMapper {
  8. public List<User> queryUser();
  9. }
 
java

UserMapper.xml

 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
  6. <mapper namespace="com.goodup.mapper.UserMapper">
  7. <select id="queryUser" resultType="user" >
  8. select * from user
  9. </select>
  10. </mapper>
 
XML

测试-不使用resultmap

 
  1. @Test
  2. public void testQueryUser() {
  3. List<User> users = userMapper.queryUser();
  4. for (User user : users) {
  5. System.out.println(user);
  6. }
  7. if (sqlSession != null) {
  8. sqlSession.close();
  9. }
  10. }
 
java

 

如果字段名不同依旧按照原来resultType返回会出现以下结果

使用resultMap

property为实体类属性,colum为表字段名,user为返回的对象类型

 
  1. <mapper namespace="com.goodup.mapper.UserMapper">
  2. <resultMap id="userResultMap" type="User">
  3. <result property="useremail" column="user_email"/>
  4. <result property="username" column="user_name"/>
  5. </resultMap>
  6. <select id="queryUser" resultMap="userResultMap" >
  7. select * from user
  8. </select>
  9. </mapper>
 
XML

运行结果

 

注意事项和细节

  • 方式一(通用,复用性欠佳):在 SQL 语句中,通过AS关键字给表字段起别名,使别名与对象属性名一致。例如在查询用户信息时,将user_name别名为usernameuser_email别名为useremail,对应 SQL 语句为SELECT user_id,user_name AS username, user_email AS useremail FROM user
  • 方式二(MyBatis - Plus 专属,更简便)
    • 若实体字段名和表字段名不一致,使用@TableField注解来解决。
    • 若实体类名和表名不一致,使用@TableName注解来解决。

 

 

5.动态sql

 

 

 

 

 

文档地址动态 SQL_MyBatis中文网

 

if标签

查找大于指定年龄的Monster,如果输入age不大于0,则输入所有Monster

MonsterMapper.xml文件

 
  1. <select id="getMonsterListHigherAge" resultType="com.goodup.entity.Monster" parameterType="Integer">
  2. select * from monster where 1 = 1
  3. <if test="age != null and age > 0">
  4. and age > #{age}
  5. </if>
  6. </select>
 
XML

 

MonsterMapper接口

public List<Monster> getMonsterListHigherAge(Integer age);
java

where标签

需求:

查询id 大于20 的,并且名字是“何杰”的所有妖怪

如果名字为空,或者输入的id小于0,则不拼接sql语句

MonsterMapper.xml文件

 
  1. <select id="getMonsterListByIdAndName" resultType="com.goodup.entity.Monster" parameterType="com.goodup.entity.Monster">
  2. select * from monster
  3. <where>
  4. <if test="id >= 0">
  5. and id > #{id}
  6. </if>
  7. <if test="name != null and name != ''">
  8. and name = #{name}
  9. </if>
  10. </where>
  11. </select>
 
XML

MonsterMapper接口

    public List<Monster> getMonsterListByIdAndName(Monster monster);
java

 

 

 

如果入参是对象,test 表达式中,直接使用对象的属性名即可

 

where标签,会在组织动态sql时,加上where

mybatis底层where标签自动去掉多余的and

 

 

choose标签-类似Java中的Switch语句

需求:

如果给的name不为空,就按名字查询monster

如果指定的id>0,就按id查询monster

如果前面两个条件都不满足,就默认查询salary>30000

MonsterMapper.xml文件

 

 
  1. <select id="getMonsterListByIdAndName_choose" resultType="com.goodup.entity.Monster" parameterType="Map">
  2. select * from monster
  3. <where>
  4. <choose>
  5. <when test="name != null and name != ''">
  6. and name = #{name}
  7. </when>
  8. <when test="id > 0">
  9. and id = #{id}
  10. </when>
  11. <otherwise>
  12. and salary > 30000
  13. </otherwise>
  14. </choose>
  15. </where>
  16. </select>
 
XML

MonsterMapper接口

    public List<Monster> getMonsterListByIdAndName_choose(Map<String,Object> map);
java

 

 

 

foreach标签

查询id为33,55,77的妖怪 

 

 

MonsterMapper.xml文件

 
  1. <select id="getMonsterListById_foreach" resultType="com.goodup.entity.Monster" parameterType="Map">
  2. select * from monster
  3. <where> id in
  4. <foreach collection="ids" item="id" open="(" close=")" separator=",">
  5. #{id}
  6. </foreach>
  7. </where>
  8. </select>
 
XML

MonsterMapper接口

public List<Monster> getMonsterListById_foreach(Map<String,Object> map);
java

测试

 
  1. public void getMonsterListById_foreach(){
  2. Map<String,Object> map = new HashMap<>();
  3. List<Integer> ids = new ArrayList<>();
  4. ids.add(33);
  5. ids.add(55);
  6. ids.add(77);
  7. map.put("ids",ids);
  8. List<Monster> monsterListById_foreach = monsterMapper.getMonsterListById_foreach(map);
  9. for (Monster monster1 : monsterListById_foreach) {
  10. System.out.println(monster1);
  11. }
  12. if(sqlSession != null){
  13. sqlSession.close();
  14. }
  15. }
 
java

运行结果

 

 

 

trim标签

可以替换一些关键字-可以做到where标签的功能,比where标签更强大

where等价trim的功能按名字查询妖怪,如果sql语句开头有and  |  or  就替换成where

 
  1. <trim prefix="WHERE" prefixOverrides="AND |OR ">
  2. ...
  3. </trim>
 
XML

需求如果开头有goodup或者and或者or,改成where

MonsterMapper.xml文件

 
  1. <select id="getMonsterListByIdAndName_trim" resultType="com.goodup.entity.Monster" parameterType="Map">
  2. select * from monster
  3. <trim prefix="where" prefixOverrides="and |or |goodup ">
  4. <if test=" id != null and id >= 0">
  5. goodup id > #{id}
  6. </if>
  7. <if test="name != null and name != ''">
  8. and name = #{name}
  9. </if>
  10. </trim>
  11. </select>
 
XML

MonsterMapper接口

  public List<Monster> getMonsterListByIdAndName_trim(Map<String,Object> map);
java

测试

 
  1. @Test
  2. public void getMonsterListByIdAndName_trim(){
  3. Map<String,Object> map = new HashMap<>();
  4. map.put("id",20);
  5. map.put("name","");
  6. List<Monster> monsterListByIdAndName_trim = monsterMapper.getMonsterListByIdAndName_trim(map);
  7. for (Monster monster1 : monsterListByIdAndName_trim) {
  8. System.out.println(monster1);
  9. }
  10. if(sqlSession != null){
  11. sqlSession.close();
  12. }
  13. }
 
java

 

 

 

 

set标签-重点

与set标签等价的trim标签

 
  1. <trim prefix="SET" suffixOverrides=",">
  2. ...
  3. </trim>
 
XML

请对指定id的妖怪进行修改,如果没有设置新的属性,则保持原来的值

MonsterMapper.xml文件

 
  1. <update id="updateMonster" parameterType="com.goodup.entity.Monster" >
  2. update monster
  3. <set>
  4. <if test="name != null and name != ''">
  5. name = #{name},
  6. </if>
  7. <if test="age != null and age > 0">
  8. age = #{age},
  9. </if>
  10. <if test="salary != null and salary > 0">
  11. salary = #{salary},
  12. </if>
  13. <if test="email != null and email != ''">
  14. email = #{email},
  15. </if>
  16. <if test="gender != null and gender != ''">
  17. gender = #{gender},
  18. </if>
  19. <if test="birthday != null and birthday != ''">
  20. birthday = #{birthday},
  21. </if>
  22. </set>
  23. where id = #{id}
  24. </update>
 
XML

MonsterMapper接口

    public void updateMonster(Monster monster);
java

 

 

什么时候用@Param

在 MyBatis 中,是否需要使用 @Param 注解,取决于你的参数传递情况以及 MyBatis 的版本:

1. 单参数(无 @Param 也能工作的场景)

如果 Mapper 方法只有一个参数,且参数类型是基本类型(如 intInteger)或简单对象(如 String),MyBatis 会自动将参数名识别为 param1(或根据参数类型推断),此时不需要 @Param

在你提供的代码中:

java

public List<Monster> getMonsterListHigherAge(Integer age);

方法只有一个参数 Integer age,因此 MyBatis 能自动识别这个参数,不需要额外用 @Param 显式指定参数名。

2. 多参数(必须用 @Param 的场景)

如果 Mapper 方法有多个参数,MyBatis 无法自动识别每个参数的含义,此时必须用 @Param 为每个参数指定 “逻辑名”,才能在 XML 中通过 ${paramName} 或 #{paramName} 引用参数。

例如:

java

 
  1. // 多参数必须用 @Param
  2. List<Monster> findByAgeAndName(@Param("age") Integer age, @Param("name") String name);
 
总结

你的代码中是单参数,MyBatis 能自动识别,因此不需要 @Param。只有多参数时,才必须用 @Param 显式指定参数名。

 

 

六、映射关系

 官方文档

XML 映射器_MyBatis中文网

1.一对一

例子-Person(人) --- IDCard(身份证)

创建Person表和idcard表

 
  1. -- 创建mybatis_idencard表
  2. create table idencard
  3. (
  4. id int primary key auto_increment,
  5. card_sn varchar(32) not null default ''
  6. )charset utf8;
  7.  
  8. -- 创建person表
  9. create table person
  10. (
  11. id int primary key auto_increment,
  12. name varchar(32) not null default '',
  13. card_id int,
  14. foreign key (card_id) references idencard(id)
  15. );
  16.  
  17. insert into idencard values (1,'1111111111111110');
  18. insert into person values (1,'张三',1);
 
sql

 

 

 

创建entity实体对象

IdenCard

Person

IdenCardMapper接口对象

 

 

 

IdenCardMapper.xml文件

 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.goodup.mapper.IdenCardMapper">
  6. <select id="getIdenCardById" resultType="IdenCard" parameterType="Integer">
  7. select * from idencard where id=#{id}
  8. </select>
  9. </mapper>
 
XML

 

第一种方法-使用多表联查sql语句

创建PersonMapper.java和PersonMapper.xml文件 - 涉及到级联

PersonMapper.java

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Person;
  4.  
  5. public interface PersonMapper {
  6. //根据id获取人信息
  7. public Person getPersonById(Integer id);
  8. }
 
java

PersonMapper.xml文件

 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.goodup.mapper.PersonMapper">
  6. <resultMap id="resultPersonMap" type="Person">
  7. <id property="id" column="id"/>
  8. <result property="name" column="name"/>
  9. <association property="card" javaType="IdenCard" >
  10. <result property="id" column="id"/>
  11. <result property="card_sn" column="card_sn"/>
  12. </association>
  13. </resultMap>
  14. <select id="getPersonById" resultMap="resultPersonMap" parameterType="Integer">
  15. select * from person,idencard where person.id = #{id} and person.card_id = idencard.id;
  16. </select>
  17. </mapper>
 
XML
  • 属性及含义
    • property="card":表示Person对象的card属性。
    • javaType="IdenCard":表示card属性的类型为IdenCard
    • column="id":关联的是查询语句SELECT * FROM person, idencard WHERE person.id=1 AND person.card_id = idencard.id返回的字段。

测试

 

 

 

第二种方式(推荐) - 使用多次单表操作

可以复用已经写好的方法

 

PersonMapper.xml文件

 
  1. <resultMap id="resultPersonMap2" type="Person">
  2. <id property="id" column="id"/>
  3. <result property="name" column="name"/>
  4. <association property="card" javaType="IdenCard"
  5. column="card_id"
  6. select="com.goodup.mapper.IdenCardMapper.getIdenCardById">
  7. </association>
  8. </resultMap>
  9. <select id="getPersonById2" resultMap="resultPersonMap2" parameterType="Integer">
  10. select * from person where id=#{id}
  11. </select>
 
XML
  1. 核心思想:将多表联查分解为单表操作,简洁且易于维护。
  2. 优势:可复用已写好的方法(组合方式)。
  3. property="card":表示 Person 对象的 card 属性。
  4. column="card_id":关联的是 SELECT * FROM person WHERE id = #{id} 语句返回的 card_id 字段。
  5. 返回的字段card_id 信息/数据 作为getIdenCardById入参

测试

 

 

 

 

第三种方式-注解方式

PersonMapperAnnotation接口

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Person;
  4. import org.apache.ibatis.annotations.One;
  5. import org.apache.ibatis.annotations.Result;
  6. import org.apache.ibatis.annotations.Results;
  7. import org.apache.ibatis.annotations.Select;
  8.  
  9. public interface PersonMapperAnnotation {
  10. @Select("select * from person where id=#{id}")
  11. @Results(
  12. {
  13. @Result(
  14. id = true,
  15. property = "id",
  16. column = "id"
  17. ),
  18. @Result(
  19. property = "name",
  20. column = "name"
  21. ),
  22. @Result(
  23. property = "card",
  24. column = "card_id",
  25. one = @One(select = "com.goodup.mapper.IdenCardMapper.getIdenCardById")
  26. )
  27. }
  28. )
  29. public Person getPersonById(Integer id);
  30. }
 
java

测试

 

 

 

 

2.多对一 - 需要使用collection标签

 

  • 基本介绍:多对 1 是基本映射关系,也可理解为 1 对多。像 User 与 Pet 的关系,一个用户能养多只宠物;Dep 和 Emp 的关系,一个部门可有多个员工。
  • User---Pet :一个用户可以养多只宠物
  • Dept---Emp :一个部门可以有多个员工
  • 双向的多对一关系:双向的多对一关系,它比单向的复杂,实际项目开发中会用到。双向多对一即通过一方(如 User)能查询到另一方(如 Pet),反过来通过另一方(Pet)也能级联查询到一方(User)的信息。另外,多对多关系可在多对 1 基础上扩展得到。

双向的多对一关系实例  Pet 和 User

建表Pet表和User表

 
  1. create table mybatis_user(
  2. id int primary key auto_increment,
  3. name varchar(32) not null default ''
  4. )charset=utf8;
  5. create table mybatis_pet(
  6. id int primary key auto_increment,
  7. nickname varchar(32) not null default '',
  8. user_id int,
  9. foreign key (user_id) references mybatis_user(id)
  10. )charset=utf8;
  11.  
  12. insert into mybatis_user values (NULL,'宋江'),(NULL,'张飞');
  13. insert into mybatis_pet values (1,'黑背',1),(2,'小哈',1),(3,'波斯猫',2),(4,'贵妃猫',2);
 
sql

实体类Entity

Pet类

 
  1. package com.goodup.entity;
  2.  
  3. public class Pet {
  4. private Integer id;
  5. private String nickname;
  6. private User user;
  7.  
  8. .....get set toString 省略
  9. }
 
java

User类

 
  1. package com.goodup.entity;
  2.  
  3. import java.util.List;
  4.  
  5. public class User {
  6. private Integer id;
  7. private String name;
  8. private List<Pet> pets;
  9.  
  10. .....get set toString 省略
  11. }
 
java

 

 

UserMapper.java接口和UserMapper.xml

UserMapper.java接口

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.User;
  4.  
  5. public interface UserMapper {
  6. User getUserById(Integer id);
  7. }
 
java

UserMapper.xml

 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.goodup.mapper.UserMapper">
  6. <resultMap id="UserResultMap" type="User">
  7. <id property="id" column="id"/>
  8. <result property="name" column="name"/>
  9. <collection property="pets" ofType="Pet" column="id" select="com.goodup.mapper.PetMapper.getPetListByUserId"/>
  10. </resultMap>
  11. <select id="getUserById" parameterType="Integer" resultMap="UserResultMap">
  12. select * from mybatis_user where id=#{id}
  13. </select>
  14. </mapper>
 
XML

 

collection标签解读

当执行 SQL 查询后,需要将查询结果映射到 Java 对象,且对象之间存在一对多关系时,就可以使用<collection>标签。比如,从数据库中查询用户信息,同时需要获取该用户下的所有宠物信息,将这些信息映射到User对象(包含List<Pet>类型的属性来存储员工信息)。

常见属性

  • property:指定要映射的对象属性名称,该属性是必须的。例如,在User类中有一个List<Pet>类型的属性名为pets,那么property的值就应该设置为pets。
  • ofType:指定集合中元素的类型。比如上述employees集合中元素是Pet对象,那么ofType就设置为Pet类的全限定名,如com.example.domain.Pet 。
  • select:指定用来加载关联对象的子查询语句的 id。使用这种方式,MyBatis 会先执行主查询,然后根据主查询的结果,再去执行子查询来加载关联对象。例如,先查询部门信息,再根据部门 id 去查询该部门的员工信息。
  • column:指定将主查询结果中的哪些列作为子查询的参数。当使用select属性进行子查询时,需要通过column指定传递给子查询的参数。比如,主查询结果中有列,子查询需要根据这个id来查询员工信息,那么column就设置为id。
  • fetchType:指定加载关联对象的方式,取值为eager(立即加载)和lazy(延迟加载) 。如果设置为lazy,只有在真正访问到关联对象时,才会执行子查询去加载数据。

PetMapper.java接口和PetMapper.xml

PetMapper.java接口

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Pet;
  4.  
  5. import java.util.List;
  6.  
  7. public interface PetMapper {
  8. List<Pet> getPetListByUserId(Integer userId);
  9. Pet getPetById(Integer id);
  10. }
 
java

PetMapper.xml

 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.goodup.mapper.PetMapper">
  6. <resultMap id="PetResultMap" type="Pet">
  7. <id property="id" column="id"/>
  8. <result property="name" column="name"/>
  9. <association property="user" javaType="User" column="user_id" select="com.goodup.mapper.UserMapper.getUserById"/>
  10. </resultMap>
  11. <select id="getPetListByUserId" parameterType="Integer" resultMap="PetResultMap">
  12. select * from mybatis_pet where user_id = #{userId};
  13. </select>
  14.  
  15. <select id="getPetById" parameterType="Integer" resultMap="PetResultMap">
  16. select * from mybatis_pet where id = #{id};
  17. </select>
  18. </mapper>
 
XML

测试

测试UserMapper

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Pet;
  4. import com.goodup.entity.User;
  5. import com.goodup.util.MyBatisUtil;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9.  
  10. import java.util.List;
  11.  
  12. public class UserTest {
  13. private SqlSession sqlSession;
  14. private UserMapper userMapper;
  15.  
  16. @Before
  17. public void init(){
  18. sqlSession = MyBatisUtil.getSqlSession();
  19. userMapper = sqlSession.getMapper(UserMapper.class);
  20. }
  21.  
  22. @Test
  23. public void testGetUserById(){
  24. User user = userMapper.getUserById(1);
  25. System.out.println("用户名:" + user.getName());
  26. List<Pet> pets = user.getPets();
  27. for(Pet pet : pets){
  28. System.out.println("宠物名:" + pet.getNickname());
  29. }
  30. System.out.println("========================");
  31. if(sqlSession != null){
  32. sqlSession.close();
  33. }
  34. }
  35. }
 
java

测试PetMapper

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Pet;
  4. import com.goodup.entity.User;
  5. import com.goodup.util.MyBatisUtil;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9.  
  10. import java.util.List;
  11.  
  12. public class PetMapperTest {
  13. private SqlSession sqlSession;
  14. private PetMapper petMapper;
  15.  
  16. @Before
  17. public void init(){
  18. sqlSession = MyBatisUtil.getSqlSession();
  19. petMapper = sqlSession.getMapper(PetMapper.class);
  20. }
  21.  
  22.  
  23. public void testGetPetListByUserId(){
  24. List<Pet> petList = petMapper.getPetListByUserId(1);
  25. for(Pet pet : petList){
  26. System.out.println("宠物名:" + pet.getNickname());
  27. }
  28. }
  29.  
  30. @Test
  31. public void testGetPetById(){
  32. Pet pet = petMapper.getPetById(1);
  33. User user = pet.getUser();
  34. System.out.println("宠物名:" + pet.getNickname());
  35. System.out.println("用户姓名:" + user.getName());
  36. }
  37. }
 
java

 

 

 

toString的问题

如果直接打印User或者Pet对象会报栈溢出错误

 

注解方式

UserMapperAnnotation接口

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Pet;
  4. import com.goodup.entity.User;
  5. import org.apache.ibatis.annotations.Many;
  6. import org.apache.ibatis.annotations.Result;
  7. import org.apache.ibatis.annotations.Results;
  8. import org.apache.ibatis.annotations.Select;
  9.  
  10. import java.util.List;
  11.  
  12. public interface UserMapperAnnotation {
  13. @Results({
  14. @Result(id = true, property = "id", column = "id"),
  15. @Result(property = "name", column = "name"),
  16. @Result(property = "pets", column = "id", javaType = List.class, many = @Many(select = "com.goodup.mapper.PetMapperAnnotation.getPetListByUserId"))
  17. })
  18. @Select("select * from mybatis_user where id=#{id}")
  19. User getUserById(Integer id);
  20. }
 
java

PetMapperAnnotation接口

 
  1. package com.goodup.mapper;
  2.  
  3. import com.goodup.entity.Pet;
  4. import org.apache.ibatis.annotations.One;
  5. import org.apache.ibatis.annotations.Result;
  6. import org.apache.ibatis.annotations.Results;
  7. import org.apache.ibatis.annotations.Select;
  8.  
  9. import java.util.List;
  10.  
  11. public interface PetMapperAnnotation {
  12. @Results(
  13. {
  14. @Result(id = true, property = "id", column = "id"),
  15. @Result(property = "nickname", column = "nickname"),
  16. @Result(property = "user", column = "user_id",one = @One(select = "com.goodup.mapper.UserMapperAnnotation.getUserById"))
  17. }
  18. )
  19. @Select(value = "select * from mybatis_pet where user_id = #{userId};")
  20. List<Pet> getPetListByUserId(Integer userId);
  21.  
  22.  
  23. @Results(
  24. {
  25. @Result(id = true, property = "id", column = "id"),
  26. @Result(property = "nickname", column = "nickname"),
  27. @Result(property = "user", column = "user_id",one = @One(select = "com.goodup.mapper.UserMapperAnnotation.getUserById"))
  28. }
  29. )
  30. @Select(value = "select * from mybatis_pet where id = #{id};")
  31. Pet getPetById(Integer id);
  32. }
 
java

 

 

ResultMap复用

 

 

 

 

 

 

 

 

 

 

七、缓存-提高检索效率

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。

默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

<cache/>
XML

 

1一级缓存

MyBatis 默认启用一级缓存(本地缓存 /local Cache),该缓存为 SqlSession 级别。当同一个 SqlSession 接口对象调用相同的 select 语句时,会直接从缓存中获取数据,无需再次查询数据库。

 

一级缓存原理图

 

 

id号相同就会是一条sql语句

 
  1. @Test
  2. public void findById(){
  3. //一条sql语句
  4. Monster monster = monsterMapper.findById(19);
  5. System.out.println(monster);
  6. Monster monster1 = monsterMapper.findById(19);
  7. System.out.println(monster1);
  8. }
 
java

 

id号不同

 

 

 

一级缓存执行流程

默认情况下先走的是CachingExecutor

第一次查询

 

第二次查询相同id

 

一级缓存存储结构

存放了两个数据的情况

 

一级缓存失效的几种情况

sqlSession关闭后再查询
 
  1. @Test
  2. public void findById(){
  3. //一条sql语句
  4. Monster monster = monsterMapper.findById(19);
  5. System.out.println(monster);
  6.  
  7. //关闭sqlSession
  8. sqlSession.close();
  9. sqlSession = MyBatisUtil.getSqlSession();
  10. monsterMapper = sqlSession.getMapper(MonsterMapper.class);
  11.  
  12. Monster monster1 = monsterMapper.findById(19);
  13. System.out.println(monster1);
  14. }
 
java

 

执行sqlSession.clearCache()使一级缓存失效

 

 
  1. @Test
  2. public void findById2(){
  3. //一条sql语句
  4. Monster monster = monsterMapper.findById(19);
  5. System.out.println(monster);
  6.  
  7. sqlSession.clearCache();
  8.  
  9. Monster monster1 = monsterMapper.findById(19);
  10. System.out.println(monster1);
  11. }
 
java

对同一个Entity对象进行修改
 
  1. @Test
  2. public void findById3(){
  3. //一条sql语句
  4. Monster monster = monsterMapper.findById(19);
  5. System.out.println(monster);
  6.  
  7. sqlSession.clearCache();
  8.  
  9. monster.setName("zhangli");
  10. //更新后,缓存清空
  11. monsterMapper.updateMonster(monster);
  12.  
  13. Monster monster2 = monsterMapper.findById(19);
  14. System.out.println(monster2);
  15. }
 
java

 

 

2.二级缓存

  1. 二级缓存与一级缓存的目的一致,都是用于提升检索效率的技术。
  2. 二者最主要的区别在于作用域范围:一级缓存作用域为SqlSession会话级别,仅在一次会话内有效;二级缓存作用域是全局范围,对不同的会话都能发挥作用。

二级缓存的工作原理

二级缓存工作原理图

二级缓存quick start

配置文件setting对缓存的设置

使用二级缓存时Entity类实现序列化接口,因为二级缓存可能使用到序列化技术

在对应的XXXMapper.xml中设置二级缓存的策略

XML 映射器_MyBatis中文网

 
  1. <cache
  2. eviction="FIFO"
  3. flushInterval="30000"
  4. size="360"
  5. readOnly="true"/>
 
XML
  • eviction="FIFO":采用先进先出的缓存淘汰策略,后续会详细说明。
  • flushInterval="30000":每 30000 毫秒(即 30 秒)刷新一次缓存,以此保证与数据库数据一致。
  • size:二级缓存最多可保存 360 个对象,若超出数量,就会启用 FIFO 策略进行处理,该属性默认值为 1024。
  • readOnly:设置为只读模式,目的是提高缓存使用效率。建议设置成true,这样可以提升效率,如果有修改操作,设置成false,默认是false

 

默认的清除策略是 LRU。

flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。

size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。

 

 

当配置了二级缓存后再进行   sqlsession关闭再查询

 

 

 

二级缓存的执行流程

 

二级缓存注意事项和使用陷阱

全局性地开启或关闭所有映射器配置文件中已配置的任何缓存

不在映射文件中配置二级缓存

 

直接在配置方法上指定

 

 

mybatis刷新二级缓存的设置

flushCache

 

mybatis的一级缓存和二级缓存执行顺序

缓存的执行顺序:二级缓存-->一级缓存-->数据库

第一查询后关闭sqlSession,再连续查询两次   观察数据是从哪里取出

细节说明

不会出现一级缓存和二级缓存中有同一个数据,因为二级缓存是在一级缓存关闭之后才有的

第一次是从数据库拿到, 后两次是从一级缓存中拿到

 

 

3.ehcache缓存

Ehcache配置文件ehcache.xml - 请叫我刀刀 - 博客园

引入ehcache依赖

mybatis-config.xml中开启二级缓存

加入ehcache.xml配置文件

 

Java Ehcache缓存的timeToIdleSeconds和timeToLiveSeconds区别

Java Ehcache缓存的timeToIdleSeconds和timeToLiveSeconds区别 - TaoBye

 

 

在XXXMapper.xml文件中启用Ehcache

ehcache细节

缓存用hashMap存储

 

Mybatis笔记_mybatis <>-CSDN博客

 

为什么需要Mybatis

一、快速入门

1.Maven父子项目配置

新建Maven项目后,将src文件夹删除

引入MyBatis依赖

创建子项目

2.配置MyBatis-Config

3.创建一个Monster对象 - 和数据库中的monster表对应

4.创建一个MonsterMapper接口 - 该接口用于声明操作monster表的方法

5.在MyBatis-Config中配置关联Mapper.xml

6.创建一个工具类MyBatisUtils,快速得到sqlSession

7.获取到Mapper代理对象

8.返回自增长id

9.删除

10.修改

11.类型别名-缩写名字

12.查询

查询单个-根据id查询

查询所有-集合

二、日志输出配置-查看执行的sql语句

三、原生的Api和注解的方式

1.原生api的调用

2.注解的方式操作-不用在xml文件中配置sql语句

四、Mybatis-config.xml配置文件

1.properties属性

2.settings全局参数定义

3.typeAliases别名处理器

4.typeHandlers类型处理器

5.environments环境

五、xml映射器

1.parameterType输入参数类型

2.传入HashMap-灵活增加查询属性

3.map返回类型

4.resultMap(结果集映射)

使用resultMap

5.动态sql

if标签

where标签

choose标签-类似Java中的Switch语句

foreach标签

trim标签

set标签-重点

什么时候用@Param

1. 单参数(无 @Param 也能工作的场景)

2. 多参数(必须用 @Param 的场景)

总结

六、映射关系

1.一对一

第一种方法-使用多表联查sql语句

第二种方式(推荐) - 使用多次单表操作

第三种方式-注解方式

2.多对一 - 需要使用collection标签

常见属性

toString的问题

注解方式

七、缓存-提高检索效率

1一级缓存

一级缓存执行流程

一级缓存存储结构

一级缓存失效的几种情况

sqlSession关闭后再查询

执行sqlSession.clearCache()使一级缓存失效

对同一个Entity对象进行修改

2.二级缓存

二级缓存的工作原理

二级缓存quick start

配置文件setting对缓存的设置

使用二级缓存时Entity类实现序列化接口,因为二级缓存可能使用到序列化技术

在对应的XXXMapper.xml中设置二级缓存的策略

二级缓存的执行流程

二级缓存注意事项和使用陷阱

mybatis的一级缓存和二级缓存执行顺序

细节说明

3.ehcache缓存

引入ehcache依赖

Java Ehcache缓存的timeToIdleSeconds和timeToLiveSeconds区别

在XXXMapper.xml文件中启用Ehcache

ehcache细节

posted @ 2025-12-09 13:44  CharyGao  阅读(1)  评论(0)    收藏  举报