MyBatis条记
MyBatis介绍
MyBatis 是一个长期层框架
- 前身是ibatis, 在ibatis3.x 时,更名为MyBatis
- MyBatis 在java 和sql 之间提供更机动的映射方案
- mybatis 可以将对数据表的操纵(sql,方法)等等直接剥离,写到xml 配置文件,实现和java
代码的解耦
- mybatis 通过SQL 操纵DB, 建库建表的工作必要程序员完成
相关文档
MyBatis 中文手册、
https://mybatis.org/mybatis-3/zh/index.html
https://mybatis.net.cn/
为什么必要MyBatis?
- 传统jdbc连接数据库必要本身编写,不同一标准
- 程序不是OOP的方式编写的
- SQL语句是写在程序中,属于硬编码,没有解耦
- mybatis 可以将对数据表的操纵(sql,方法)等等直接剥离,写到xml 配置文件,实现和java
代码的解耦
- MyBatis 是一个长期层框架所以它同一
- MyBatis 是OOP方式操纵数据库
MyBatis案例
实体类- @Setter
- @Getter
- @AllArgsConstructor
- @NoArgsConstructor
- @ToString
- public class Monk {
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Integer id;
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String nickname;
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String skill;
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String grade;
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Double salary;
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String birthTime;
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Date entry;
- }
复制代码 mapper接口
- 只是一个接口
- 该接口用于声明操纵monster表的方法
- 这些方法可以通过注解或者xml文件实现
- public interface MonkMapper {
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>void addMonk(Monk monk);
- }
复制代码 mapper.xml
- 这是一个mapper xml 文件
- 该文件可以去实现对应的接口的方法
- namespace 指定该xml文件和哪个接口对应
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.code_study.mapper.MonkMapper">
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><insert id="addMonk" parameterType="Monk">
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> INSERT INTO `monk`
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>(`nickname`,`skill`,`grade`,`salary`,`birthTime`,`entry`)
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> VALUES(#{nickname},#{skill},#{grade},#{salary},#{birthTime},#{entry})
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers></insert>
- </mapper>
复制代码 原生的API和注解的方式
Mybatis原生的API调用
添加
- @Test
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public void myBatisNativeCrud(){
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> Monk monk = new Monk();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setBirthTime("1999-9-9 10:11:02");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> Calendar instance = Calendar.getInstance();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> instance.set(Calendar.YEAR,2020);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> instance.set(Calendar.MONTH,Calendar.OCTOBER);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> instance.set(Calendar.DAY_OF_MONTH,15);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> Date time = instance.getTime();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setEntry(time);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setGrade("大宗师");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setNickname("法海");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setSalary(200.5);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setSkill("大威天龙");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> int insert = sqlSession.insert("com.code_study.mapper.MonkMapper.addMonk", monk);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> System.out.println("insert~~" + insert);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> System.out.println("操作成功");
- }
复制代码 删除
- <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>@Test
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public void myBatisNativeCrud(){
- <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers><mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>int delete = sqlSession.delete("com.code_study.mapper.MonkMapper.deleteMonk", 6);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> System.out.println("delete~~" + delete);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> System.out.println("操作成功");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>}
复制代码 修改
- @Test
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public void myBatisNativeCrud(){
- <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers><mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers> Monk monk = new Monk();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setBirthTime("1999-9-9 10:11:02");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> Calendar instance = Calendar.getInstance();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> instance.set(Calendar.YEAR,2020);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> instance.set(Calendar.MONTH,Calendar.OCTOBER);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> instance.set(Calendar.DAY_OF_MONTH,15);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> Date time = instance.getTime();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setEntry(time);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setGrade("大宗师");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setNickname("法海");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setSalary(200.5);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setSkill("乾坤大挪移");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> monk.setId(8);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> int update = sqlSession.update("com.code_study.mapper.MonkMapper.updateMonk", monk);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> System.out.println("update~~" + update);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> System.out.println("操作成功");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>}
复制代码 查询
- @Test
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public void myBatisNativeCrud(){
- <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers><mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>List<Monk> monks =
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>sqlSession.selectList("com.code_study.mapper.MonkMapper.findAllMonk");
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> for (Monk monk : monks) {
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>System.out.println("monk= "+ monk);
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> }
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> if (sqlSession != null){
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>sqlSession.commit();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>sqlSession.close();
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> }
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>}
复制代码 Mybatis注解的方式操纵
添加
- /*
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>useGeneratedKeys = true : 表示可以返回自增长的值
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>keyProperty = "id"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>: 表示 自增值对应对象的哪个属性
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>keyColumn = "id"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> : 表示 自增值对应表的哪个字段
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>如果 keyProperty = "id" 和 keyColumn = "id" 一致,可以只保留 keyProperty = "id"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers> */
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Insert(value = "INSERT INTO `monk` " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>(`nickname`,`skill`,`grade`,`salary`,`birthTime`,`entry`) " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> VALUES(#{nickname},#{skill},#{grade},#{salary},#{birthTime},#{entry})")
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>void addMonk(Monk monk);
复制代码 删除
- @Delete(value = " DELETE FROM `monk` WHERE id = #{id}")
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>void deleteMonk(Integer id);
复制代码 修改
- @Update(value = " UPDATE `monk` " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> SET `nickname`=#{nickname}, " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>`skill`=#{skill}, " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>`grade`=#{grade}, " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>`salary`=#{salary}, " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>`birthTime`=#{birthTime}, " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>`entry`=#{entry} " +
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> WHERE id = #{id}")
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>void updateMonk(Monk monk);
复制代码 查询单个
- //查询-根据id
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Select(value = " select * from `monk` where id = #{id}")
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Monk getMonkById(Integer id);
复制代码 查询多个
- //查询所有的Monster
- @Select(value = "<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>select * from `monk`")
- List<Monk> findAllMonk();
复制代码 mybatis-config.xml配置文件详解
根本介绍
- mybatis 的焦点配置文件(mybatis-config.xml),好比配置jdbc 连接信息,注册mapper
等等
properties 属性
- 通过该属性,可以指定一个外部的jdbc.properties 文件,引入我们的jdbc 连接信息
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
复制代码 settings 全局参数界说
- 是MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
typeAliases 别名处理器
- 别名是为Java 类型命名一个短名字。它只和XML 配置有关,用来减少类名重复的部分
- 如果指定了别名,我们的MappperXxxx.xml 文件就可以做相应的简化处理
- 注意指定别名后,照旧可以利用全名的
- 可以直接指向包,这样包下的所有类都是取类名作为别名
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
复制代码 typeHandlers 类型处理器
- MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
- 用于java 类型和jdbc 类型映射
- Mybatis 的映射根本已经满足,不太必要重新界说
- 这个我们利用默认即可,也就是mybatis 会主动的将java 和jdbc 类型进行转换.
environments 环境
resource 注册Mapper 文件:
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 class:接口注解实现
- <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>
复制代码 url:外部路径,利用很少,不推荐
- <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>
复制代码 package 方式注册
- <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>
复制代码 XxxMapper.xml<mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers>SQL映射文件
根本介绍
<mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers>MyBatis 的真正强大在于它的语句映射(在XxxMapper.xml 配置), 由于它的异常强大, 如
果拿它跟具有雷同功能的JDBC 代码进行对比,你会立即发现省掉了将近95% 的代码。
MyBatis 致力于减少利用成本,让用户能更专注于SQL 代码。
SQL 映射文件常用的几个顶级元素
- cache – 该命名空间的缓存配置。
- cache-ref – 引用别的命名空间的缓存配置。
- resultMap – 形貌怎样从数据库结果集中加载对象,是最复杂也是最强大的元素。
- parameterType - 将会传入这条语句的参数的类全限定名或别名
- sql – 可被别的语句引用的可重用语句块。
- insert – 映射插入语句。
- update – 映射更新语句。
- delete – 映射删除语句。
- select – 映射查询语句。
parameterType(输入参数类型)
- 传入简单类型,好比按照id 查Monster
- 传入POJO 类型,查询时必要有多个筛选条件
- 当有多个条件时,传入的参数就是Pojo 类型的Java 对象
- 当传入的参数类是String 时,也可以利用${} 来接收参数
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>SELECT * FROM `monk` WHERE `nickname` LIKE '%${name}%'
复制代码
- 传入的是List 时,resultType=“T”类型
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>SELECT * FROM `monk` WHERE `id` = #{id} OR `nickname` = #{nickname}
复制代码 传入HashMap
- HashMap 传入参数更加机动,好比可以机动的增长查询的属性,而不受限于Monster 这
个Pojo 属性本身
- parameterType="map"
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>SELECT * FROM `monk` WHERE `id` > #{id} AND `salary` > #{salary}
复制代码 传入和返回HashMap
- parameterType="map"
- resultType="map"
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>SELECT * FROM `monk` WHERE `id` > #{id} AND `salary` > #{salary}<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 resultMap(结果集映射)
根本介绍
<mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers>当实体类的属性和表的字段名字不一致时,我们可以通过resultMap 进行映射,从而屏蔽
实体类属性名和表的字段名的不同.(作用)
案例
- public interface UserMapper {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//查询所有的User<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public List findAllUser();}
复制代码-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers> SELECT * FROM `user`
复制代码 动态SQL语句
根本介绍
- 在一个现实的项目中,sql 语句往往是比较复杂的
- 为了满足更加复杂的业务需求,MyBatis 的筹划者,提供了动态天生SQL 的功能。
- 动态SQL 是MyBatis 的强大特性之一
- 利用JDBC 或别的类似的框架,根据不同条件拼接SQL 语句非常贫苦,比方拼接时要
- 确保不能忘记添加必要的空格,还要注意去掉列表末了一个列名的逗号等
- SQL 映射语句中的强大的动态SQL 语言, 可以很好的办理这个问题.
- 最重要的是办理一些普通的SQL无法处理的带有复杂逻辑的语句
动态SQL 常用标签
动态SQL 提供了如下几种常用的标签,类似我们Java 的控制语句:
- if [判定]
- where [拼接where 子句]
- choose/when/otherwise [类似java 的switch 语句, 注意是单分支]
- foreach [类似in ]
- trim [更换关键字/定制元素的功能]
- set [在update 的set 中,可以保证进入set 标签的属性被修改,而没有进入set 的,保
持原来的值]
if [判定]
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>SELECT * FROM `monk` WHERE 1 = 1
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> AND id > #{id}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
复制代码 where [拼接where 子句]
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>SELECT * FROM `monk`
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>AND id > #{id}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>AND `nickname` = #{nic kname}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
复制代码 choose/when/otherwise [类似java 的switch 语句, 注意是单分支]
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>select * from `monk`
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>where nickname = #{nickname}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>where id = #{id}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>where salary > 10000
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
复制代码 foreach [类似in ]
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers> SELECT * FROM `monk`
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>id IN
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>#{id}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 trim [更换关键字/定制元素的功能]-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> SELECT * FROM `monk`
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>ZY id > #{id}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>AND `nickname` = #{nickname}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
复制代码 set [在update 的set 中,可以保证进入set 标签的属性被修改,而没有进入set 的,保
持原来的值]映射关系一对一
根本介绍
- 项目中1 对1 的关系是一个根本的映射关系,好比
erson(人) --- IDCard(身份证
映射方式
- 通过配置XxxMapper.xml 实现1 对1 [配置方式]
- 通过注解的方式实现1 对1 [注解方式]
映射方式一:配置Mapper.xml实现
- 通过配置XxxMapper.xml 的方式,实现级联查询,通过person 可以获取到对应的idencard 信息
接口:- public interface PersonMapper {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过Person 的id 获取到Person,包括这个Person 关联的IdenCard 对象<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Person getPersonById(Integer id);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过Person 的id 获取到Person,包括这个Person 管理的IdenCard 对象,方式2<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Person getPersonById2(Integer id);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过Person 的id 获取到Person<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Person getPerson(Integer id);}
复制代码- public interface IdenCardMapper {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//根据id 获取到身份证序列号<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>IdenCard getIdenCardById(Integer id);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过IdenCard 的id 获取到Person<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>IdenCard getIdenCardAndPerson(Integer id);}
复制代码 mapper.xml:
通过person 可以获取到对应的idencard 信息
方式一 :多表联查
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> select *<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>from `person` join `idencard` on person.card_id = idencard.id<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>where person.id = #{id}
复制代码 方式二:分解成单表操纵
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>SELECT * FROM `person` where `id` = #{id}
复制代码 映射方式二:注解实现
- public interface PersonMapperAnnotation {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Select(value = "SELECT * FROM `person` where `id` = #{id}")<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Results({
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(id = true,property = "id",column = "id"),
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(property = "name",column = "name"),
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(property = "card",column = "card_id",
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> one = @One(select = "com.code_study.mapper.IdenCardMapperAnnotation.getIdenCardById"))<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>})<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Person getPersonById(Integer id);}
复制代码
映射关系多对一
根本介绍
- 项目中多对1 的关系是一个根本的映射关系, 多对1, 也可以理解成是1 对多.
- User --- Pet: 一个用户可以养多只宠物
- Dep ---Emp : 一个部门可以有多个员工
映射方式
- 通过配置XxxMapper.xml 实现1 对1 [配置方式]
- 通过注解的方式实现1 对1 [注解方式]
映射方式一:配置Mapper.xml实现
接口:- public interface UserMapper {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过id 获取User 对象<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public User getUserById(Integer id);}
复制代码- public interface PetMapper {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过User 的id 来获取pet 对象,可能有多个,因此利用List 接收<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public List getPetByUserId(Integer userId);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过pet 的id 获取Pet 对象<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public Pet getPetById(Integer id);}
复制代码 mapper.xml-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> SELECT * FROM `mybatis_pet` WHERE user_id = #{userId}
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>select * from `mybatis_pet` where id = #{id}<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>SELECT * from `mybatis_user` WHERE id = #{id}
复制代码 说明:
- 多对一时,resultMap中 collection 标签表示集合
- 在 collection 标签中 属性 ofType 表示集合中存放的数据类型
- 双向多对一时,toString应该去掉,避免栈溢出
- resultMap中 select 标签表示复用这个目的方法,推荐利用,这样提高代码的复用性,将多表拆解成单表
映射方式二:注解实现
- public interface UserMapperAnnotation {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过id 获取User 对象
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> @Select(value = "SELECT * from `mybatis_user` WHERE id = #{id}")<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Results({
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(id = true,property = "id",column = "id"),
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(property = "name",column = "name"),
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(property = "pets",column = "id",
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> many = @Many(select = "com.code_study.mapper.PetMapperAnnotation.getPetByUserId"))<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>})<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public User getUserById(Integer id);}
复制代码- public interface PetMapperAnnotation {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过User 的id 来获取pet 对象,可能有多个,因此利用List 接收<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Select(value = "SELECT * FROM `mybatis_pet` WHERE user_id = #{userId}")<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Results(id = "PetResultMap",value = {
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(id = true,property = "id",column = "id"),
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(property = "nickname",column = "nickname"),
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>@Result(property = "user",column = "user_id",
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> one = @One(select = "com.code_study.mapper.UserMapperAnnotation.getUserById"))<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>})<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>List getPetByUserId(Integer userId);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//通过pet 的id 获取Pet 对象<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@Select(value = " select * from `mybatis_pet` where id = #{id}")<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>@ResultMap(value = "PetResultMap")<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Pet getPetById(Integer id);}
复制代码
- @Results(id = "
etResultMap"...)可以给@Results设置一个 id 用来复用代码
- 在下面就进行了@Results 的复用
- //通过pet 的id 获取Pet 对象 <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>@Select(value = " select * from `mybatis_pet` where id = #{id}") <mappers>
- <mappers>
- <mappers>
- <package name="com.cody_study.mapper"/>
- </mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
- </mappers><mapper />
- </mappers>@ResultMap(value = "PetResultMap")<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Pet getPetById(Integer id);
复制代码 MyBatis缓存
根本介绍
- MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。
相关文档
一级缓存
- 默认情况下,mybatis 是启用一级缓存的/本地缓存/local Cache,它是SqlSession 级别的。
- 同一个SqlSession 接口对象调用了雷同的select 语句,会直接从缓存里面获取,而不是再
去查询数据库
一级缓存原理图
一级缓存失效的情况
- 关闭sqlSession 会话后, 再次查询,会到数据库查询
- 当实行sqlSession.clearCache() 会使一级缓存失效
- 当对同一个monster 修改,该对象在一级缓存会失效
二级缓存
- 二级缓存和一级缓存都是为了提高检索服从的技能
- 最大的区别就是作用域的范围不一样,一级缓存的作用域是sqlSession 会话级别,在一次
会话有效,而二级缓存作用域是全局范围,针对不同的会话都有效
二级缓存原理图
二级缓存配置
<mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers>1.在mybatis-config.xml中 全局性的开启缓存
<mappers>
<mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
</mappers>
<mappers>
<mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
</mappers>
<mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers>2.利用二级缓存时entity 类实现序列化接口(serializable),由于二级缓存可能利用到序列化技能
<mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers><mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers>*大部分情况不必要这样配置,只是某些第三方缓存库必要序列化到磁盘!
<mappers>
<mappers>
<mappers>
<package name="com.cody_study.mapper"/>
</mappers><mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
</mappers><mapper />
</mappers>3.再对应的XxxMapper.xml中设置二级缓存的计谋-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> SELECT * FROM `monster` WHERE id = #{id}<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 注意事项
- 表示创建了FIFO 的计谋,每隔30 秒刷新一次,最多存放360 个对象而且返回的对象被认为是只读的。
- eviction:缓存的回收计谋
- flushInterval:时间隔断,单位是毫秒,
- size:引用数目,内存大就多配置点,要记住你缓存的对象数目和你运行环境的可用内存
- 资源数目。默认值是1024
- readOnly:true,只读
四大计谋
- LRU – 最近最少利用:移除最长时间不被利用的对象。
- FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
- SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
- WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象
怎样禁用二级缓存
方式一
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
复制代码 方式二
在XxxMapper.xml文件中不配做
方式三
直接在XxxMapper.xml文件对应的方法上 设置属性 useCache=false-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> SELECT * FROM `monster`<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 一级缓存和二级缓存的实行顺序
- 缓存实行顺序是:二级缓存-->一级缓存-->数据库
- 当我们关闭了一级缓存的时候,如果配置了二级缓存,那么一级缓存的数据会放入二级缓存中
- 不会出现一级缓存和二级缓存中有同一个数据。由于二级缓存(数据)是在一级缓存关闭之后才有的
第三方缓存框架---EhCache
根本介绍
- EhCache 是一个纯Java 的缓存框架,具有快速、精干等特点
- MyBatis 有本身默认的二级缓存(前面我们已经利用过了),但是在现实项目中,往往利用
的是更加专业的第三方缓存产品作为MyBatis 的二级缓存,EhCache 就是非常优秀的缓存
产品
配置利用第三方缓存框架
添加依赖
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>net.sf.ehcache
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> ehcache-core
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> 2.6.11
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>org.slf4j
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> slf4j-api
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> 1.7.25
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>org.mybatis.caches
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> mybatis-ehcache
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> 1.2.1<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 在XxxMapper.xml文件中启用EhCache
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> SELECT * FROM `monster` WHERE id = #{id}<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 怎样理解EhCache 和MyBatis 缓存的关系
- MyBatis 提供了一个接口Cacheorg.apache.ibatis.cache.Cache
- 只要实现了该Cache 接口,就可以作为二级缓存产品和MyBatis 整合利用,Ehcache 就
是实现了该接口
- MyBatis 默认情况(即一级缓存)是利用的PerpetualCache 类实现Cache 接口的,是焦点类
- 当我们利用了Ehcahce 后,就是EhcacheCache 类实现Cache 接口的,是焦点类.
- 缓存的本质就是Map
手写MyBatis底层机制
读取配置文件,得到数据库连接
思绪
- 引入必要的依赖
- 必要写一个本身的config.xml文件,在里面配置一些信息,driver,url ,password,username
- 必要编写Configuration类,对 本身的config.xml文件 进行解析,得到一个数据库连接
实现
- 必要写一个本身的config.xml文件,在里面配置一些信息,driver,url ,password,username
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码
- 必要编写Configuration类,对 本身的config.xml文件 进行解析,得到一个数据库连接
编写实行器,输入SQL语句,完成操纵
思绪
- 必要写一个实体类,对应monster表
- 编写接口executor
- 实现接口,编写本身的实行器
- 必要一个 本身的Configuration类 返回连接,通过连接对数据库进行操纵
实现
- @Setter@Getter@ToString@NoArgsConstructor@AllArgsConstructorpublic class Monster {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Integer id;<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Integer age;<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String name;<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String email;<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Date birthday;<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private double salary;<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Integer gender;}
复制代码- public interface Executor {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public T query(String statement,Object parameter);}
复制代码
- 必要一个 本身的Configuration类 返回连接,通过连接对数据库进行操纵
将Sqlsession封装到实行器
思绪
- 必要写本身的Sqlsession类,它是搭建连接和实行器之间的桥梁,里面封装有 实行器 和 配置文件 以及 操纵DB 的具体方法
- 写一个selectOne方法 ,SelectOne() 返回一条记录,一条记录对应一个Monster对象
实现
- 必要写本身的Sqlsession类,它是搭建连接和实行器之间的桥梁,里面封装有 实行器 和 配置文件 以及 操纵DB 的具体方法
- public class ZySqlSession {//搭建连接和实行器之间的桥梁<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//实行器<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Executor executor = new ZyExecutor();<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//配置<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private ZyConfiguration zyConfiguration = new ZyConfiguration();<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//操纵DB 的具体方法<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//SelectOne 返回一条记录-对象<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public T selectOne(String statement,Object parameter){
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> return executor.query(statement,parameter);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>}}
复制代码
- 写一个selectOne方法 ,SelectOne() 返回一条记录,一条记录对应一个Monster对象
- //操纵DB 的具体方法<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//SelectOne 返回一条记录-对象<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public T selectOne(String statement,Object parameter){
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> return executor.query(statement,parameter);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>}
复制代码
开发Mapper接口和Mapper.xml
思绪
- 编写MonsterMapper接口,里面有方法getMonsterById(Integer id)根据id返回一个monster对象
- 在resources下编写对应的monsterMapper.xml(简化:由于在resources 编译时会在类路径下比较好写)
- monsterMapper.xml 编写具体的sql语句,并指定语句类型,id,resultType(和原生Mybatis一样)
实现
- 编写MonsterMapper接口,里面有方法getMonsterById(Integer id)根据id返回一个monster对象
- public interface MonsterMapper {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public Monster getMonsterById(Integer id);}
复制代码
- 在resources下编写对应的monsterMapper.xml(简化:由于在resources 编译时会在类路径下比较好写)
- monsterMapper.xml 编写具体的sql语句,并指定语句类型,id,resultType(和原生Mybatis一样)
-
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>SELECT * FROM monster WHERE id = ?<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>
复制代码 开发MapperBean,可以和Mapper接口相映射
思绪
- 开发 Function类 ,用于记录对应的Mapper的方法信息,好比sql类型,方法名,实行的sql语句,返回类型,入参类型
- 开发 MapperBean类,记录接口信息和接口下的所有方法
- Function类 对应 monsterMapper.xml中的信息
- MapperBean类 对应 MonsterMapper 接口中的信息
实现
- 开发 Function类 ,用于记录对应的Mapper的方法信息,好比sql类型,方法名,实行的sql语句,返回类型,入参类型
- //对应 monsterMapper.xml中的信息public class Function {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String sqlType;//sql类型,好比select,insert,update,delete<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String funcName;//方法名<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String sql;//实行的sql语句<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private Object resultType;//返回类型<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String parameterType;//入参类型}
复制代码
- 开发 MapperBean类,记录接口信息和接口下的所有方法
- //对应 MonsterMapper 接口中的信息public class MapperBean {<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private String interfaceName;//接口名<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>//<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>接口下的所有方法<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>private List functions;}
复制代码
- Function类 对应 monsterMapper.xml中的信息
- MapperBean类 对应 MonsterMapper 接口中的信息
在Configuration中解析MapperXML获取MapperBean对象
思绪
- 在Configuration 添加方法readMapper(String path)
- 通过 path 读取接口对应的Mapper方法
- 保存接口下所有的方法信息
- 封装成 MapperBean对象
实现
- 在Configuration 添加方法readMapper(String path)
- 通过 path 读取接口对应的Mapper方法
- 保存接口下所有的方法信息
- 封装成 MapperBean对象
动态代理Mapper方法
思绪
- 在SqlSession中添加方法 getMapper 输入一个Class类型,返回mapper的动态代理对象
- 编写动态代理类 实现 InvocationHandler 接口
- 取出mapperBean的functions 遍历
- 判定 当前要实行的方法和function.getFunctionName是否一致
- 调用方法返回 动态代理对象
- 编写SqlSessionFactory 会话工厂,可以返回SqlSession
实现
- 编写动态代理类 实现 InvocationHandler 接口
- 在SqlSession中添加方法 getMapper 输入一个Class类型,返回mapper的动态代理对象
- //返回mapper的动态代理对象<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>public T getMapper(Class clazz){
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> return (T) Proxy.newProxyInstance(
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>clazz.getClassLoader(),
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>new Class[]{clazz},
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/>
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/><mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>new ZyMapperProxy(zyConfiguration,clazz,this));<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>}
复制代码
- 取出mapperBean的functions 遍历
- 判定 当前要实行的方法和function.getFunctionName是否一致
- 调用方法返回 动态代理对象
- 编写SqlSessionFactory 会话工厂,可以返回SqlSession
- public class ZySqlSessionFactory {
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> public static ZySqlSession open(){
- <mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers><properties resource="jdbc.properties"/> return new ZySqlSession();<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>}}
复制代码 测试
- @Testpublic void openSession(){<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>ZySqlSession zySqlSession = ZySqlSessionFactory.openSession();<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>System.out.println("zySqlSession= "+zySqlSession);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>MonsterMapper mapper = zySqlSession.getMapper(MonsterMapper.class);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>Monster monster = mapper.getMonsterById(1);<mappers>
- <mapper resource="com/code_study/mapper/MonsterMapper.xml"/>
- </mappers>System.out.println("monster= "+monster);}
复制代码 本文学习内容来自韩顺平老师的课程
仅供个人参考学习
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |