Mybatis mapper文件配置
mapper文件的创建
虽然我叫它为mapper文件,只是他只是一个有着约束的xml文件,它的约束如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
我们可以在resource条件下去创建这么一个mapper文件,亦可以遵循mybatis代理模式的要求把mapper集中管理起来,甚至你可以从本地或者网络可连接的任何地址创建这么一个mapper文件,这里就不得不说一个在我们使用mybatis时最开始设置的核心配置文件(我习惯写成mybatis-config.xml,以下用mybatis-config指代)中设置mappers标签时如何为它指定资源。
在mybatis-config下:
<mappers>
<!--相对位置引用-->
<mapper resource="与本文件所在的相对位置"/>
<!--绝对位置引用,那么只要能访问到,都可以引用,但是现在通用非分布式项目估计跨盘区都不可能-->
<mapper resource="绝对路径"/>
<!--既然所有的操作都对应着类,那么通过类的位置自然也可以确定mapper位置,
所以这种方式需要mapper文件必须和class在一个包下,同时命名一致-->
<mapper class="包名+class名"/>
<!--s上面三种方式都是单个文件引入,但在实际开发时不可能只有一个mapper文件,这需要我们把所有mapper都丢到dao层,然后通过dao层下和mapper同名的class自动映射-->
<package name="com.elvis.dao"/>
</mappers>
以上即是mapper文件创建和mybatis-config引用mapper时的配置。
mapper文件内部标签
1.cache – 该命名空间的缓存配置。虽然缓存有很多知识点,但对于这个标签却没什么讲的,放在之后缓存里来说。
2.cache-ref – 引用其它命名空间的缓存配置。
3.resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。这是mybatis mapper文件配置的重中之重,因为一般我们查询对象不永远只是简单基本数据类型和String,或者单一的HashMap,List,对于数据库我们知道有着三种对应关系,即:一对一、一对多、多对多,比如一个班级必然有不止一个的学生,而一个学生很难同时属于多个班级,这就是一对多,那么我们输出一个班级的信息时,我们的作为承接数据的实体类就很可能会包含学生的信息,那么这个pojo对象里面很可能就会有一个List或者Set类型的属性来承接他所有的学生信息,那么这种情况下<select resultType=“xxx.xxx.ClassInfo”>是不能成功接收数据的,那么则需要更改使用resultMap=“自定义的resultMap标签id”;
以下就是resultMap标签下的属性和子标签的内容:
- id 属性:唯一标识resultMap
- type 属性:用来指明返回为哪一个pojo对象,例如返回班级信息,那么就指明type=“com.elvis.pojo.ClassInfo”,当然mybatis-config配置了别名可以省略包名
- autoMapper 属性:查询结果是否自动映射到pojo的相对应的属性中,默认为true,如果设为false那么则需要以下两个标签手动设置
- id 子标签:主要形式为 <id property=“pojo里面的属性” column=“查询结果里的列名(不是表格的列名)”>,这是用来表名你的查询结果的主键,一(多)对多踩过的大坑,必写之!
- result 子标签:形式 <result property=“pojo里面的属性” column=“查询结果里的列名(不是表格的列名)”>,非主键设置映射
- association 子标签:形式 <association property=“pojo里面的属性” javaType=“pojo”>,主要用于1对1的关系,例如一个班级只能有一个班主任,一个班主任一般也只任职一个班级,班主任是一个Teacher的对象,那么班级信息承接的类可能就会有班主任的信息 即paivate Teacher chargerTeacher;所以javaType=“com.elvis.pojo.Teacher”;除此之外,这个标签是允许套娃的,那么像上述标签也有可能适用于Teacher这个类。
- collection 子标签:适用于1对多的关系,基本和association一样,不同的是它不是在JavaType中指明pojo,而是在ofType这个属性中,新版mybatis,还要求加入JavaType来指明集合的类型,比如班级信息下我写的是 List<Student> students,那么必须写上javaType=“java.util.List”,同样支持套娃;除此之外,多对多没有单独的标签,其实多对多也无非可以理解为是用着共通的一对多,之后单独贴源码讲一对多和多对多
4.sql – 抽取出可被其它语句引用的可重用语句块。
5.insert – 映射插入语句。
- id 属性:唯一标识(和方法名一致)
- parameterType 属性:设置参数类型,多参数且非注解下需要按照指定格式填写
- resultType 属性:插入这个无所谓,直接不写或者int(Integer),当然mysql脏读的话得设置
6.update – 映射更新语句,基本和insert 一样
7.delete – 映射删除语句。
8.select – 映射查询语句。
${}和#{}的区别
例如这么一个select标签:
<select id="getStudentById" resultType="Student">
select * from Student where StudentID=${id}
</select >
<select id="getStudentById" resultType="Student">
select * from Student where StudentID=#{id}
</select >
当把一个学生学号(2016032082)作为参数传过来的时候,这两条语句都可以查询出结果(其实不能,因为我的学士学号在数据库中类型是varchar2,如果是number则可以查询出来),不同的是在控制台输出的sql有所差异:
${id}时:select * from Student where StudentID=2016032082
#{id}时:select * from Student where StudentID=?
那么区别就很明显了,当使用#{}时,mybatis把它当做了一个占位符来处理,而${}时则把它当成了拼接符,很类似于前端中的el表达式,所以不提倡${},因为不防侧漏,咳咳,不防注入啊!
动态sql
十分类似于前端使用的C标签,具体使用请转 https://blog.csdn.net/qq_41910359/article/details/116870419.