1 它用于指定mybatis映射文件的位置,可以直接实现接口的相应的库操作
2 引入映射文件的方法
- 使用类路径引入
<mappers>
<mapper resources="com/fhzheng/demo/mapper/UserMapper.xml" />
</mappers>
- 使用本地文件路径引入【不方便移植】
<mappers>
<mapper url="file:///d:/com/fhzheng/demo/mapper/UserMapper.xml"/>
</mappers>
- 使用接口类引入
<mappers>
<mapper class="com.fhzheng.demo.mapper.UserMapper" />
</mappers>
- 使用包名引入
<mappers>
<package name="com.fhzheng.demo.mapper" />
</mappers>
3 mapper文件
它体现了mybatis的强大
它十分重要
3.1 主要元素
<mapper>
<select>查询
<insert>插入
<delete>删除
<update>更新
<sql>用于定义一部分的SQL,然后被其它的语句引用,例如<include refid="selectCustomerListWhere"/>
<cache>给命名空间定义缓存
<cache-ref>缓存参数
<resultMap>结果集的描述,全限定名或是别名
</mapper>
3.2 insert后返回key
<insert id="addUser" parameterType="com.fhzheng.demo.po.User" keyProperty="userid" useGeneratedKeys="true">
insert into tb_user(username,jobs,phone)
values(#{username},#{jobs},#{phone})
</insert>
3.3 元素
在一个映射文件中,通常需要定义多个SQL语句,而这些SQL语句可能会有一些部分是相同的,如果每一次都重写,无意义,而且不易维护
可以将这些部分抽取出来,给一个id,然后形成一个节
<!-- 定义节 - ->
<sql id="customerCols">id,username,jobs,phone</sql>
<!-- 在select中引用该节 - ->
<select id="findCustomerById" parameterType="Integer" resultType="com.fhzheng.demo.po.Customer">
select <include refid="customerCols">
from tb_customer
where id=#{id}
</select>
3.4 常见节的定义
1 定义表的前缀名,方便项目组统一
2 定义要查询的表,方便替换
3 定义列集
4 定义查询条件集
4 如果有复杂的结果集,则要用resultMap来定义
它用于定义
映射规则
级联更新
定义类型转化器
常用子节点元素
<id/>主键列
<result/>注入到字段或是bean属性中的普通结果
<association property="" />用于一对一关联
<collection property-"" / >用于一对多关联
5 在默认情况下,程序在运行时会自动地将查询到的数据与需要返回的对象的属性进行匹配赋值(需要表中列名与对象的属性名称完全一致,同名覆盖)。而实际开发时,可能会不一致,这时,就需要resultMap来做映射处理
6 typeAliases别名配置意义
它配置的是一个包名,通常确定一个类的时候需要使用类的全限定名称,即带包路径的类名。
由于在mybatis中要频繁地用到类的全限定名称,为了方便使用,可以配置别名
完成这个配置之后,只需要写出类名即可。
SQL文件映射(mapper文件),几个顶级元素的配置: mapper元素:根节点只有一个属性namespace(命名空间)作用:
1:用于区分不同的mapper,全局唯一。
2:绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的完全限定名来查找对应的mapper配置,执行SQL语句,因此namespa
ce的命名必须和接口名相同。
----------------------------------------------------- namespace属性的要求: 1:namespace的命名必须和某个DAO接口同名,同属于DAO层, 故代码结构上,mapper映射文件个接口必须放在同一个包下。
2:在不同的mapper文件中,元素的id是可以相同的,MyBatis
是通过namespace和子元素的id联合区分的。接口中的方法和映射文件的SQL中的id一一对应。
----------------------------------------------------- cache:配置给定命名空间的缓存 cache-ref:从其它命名空间引用缓存配置 reaultMap:用来描述数据库结果集和对象的对应关系
sql:可以重用的SQL块,也可以被其它语句引用 insert:映射插入语句 updata:映射更新语句 delete:映射删除语句
select:映射查询语句resultMap的应用 resultType:直接表示返回类型 基础数据类型 复杂数据类型
resultMap:对外部resultMap的引用 应用场景 1:数据库的字段信息与属性不一致的情况
2:复杂的联表查询,可以自由地控制要展现的映射字段个数
================================== 其实返回的都是Map集合,当resultType返回user时候,MyBatis通过setter()方法自动进行关系映射赋值。返回resultMap时,则需要手动赋值,更自由。二者不能同时存在
================================== 设置resultMap的自动映射级别: resultMap的自动映射匹配的前提:字段名和属性名一致 resultMap的自动映射级别: 属性:
aotuMappingBehavior 值: PARTIAL(默认):自动匹配所有属性 NONE:关闭自动映射resultMap的自动映射三个匹配级别: 1:NONE:禁止自动匹配 2:PARTIAL:(默认)自动匹配所有属性
有内部嵌套(collection,association)的除外 3:FULL:自动匹配所有resultMap的基本配置项 resultMap的属性: id:它是resultMap的唯一标识 type:java实体类
resultMap的子元素 id:对应数据库中该行的主键id,设置此项可提高MyBatis的性能
result:映射到javaBean的某个简单类型属性 property: 映射数据库列的实体对象的属性
column:数据库列名或者别名 association:映射到javaBean的某个复杂类型属性如javaBean 1:
复杂的类型关联,一对一(一个实体类嵌套另一个实体类属性) 2:内部嵌套:映射一个嵌套javaBean属性 3:属性:
a:property: 映射数据库列的实体对象的属性 b:javaType:完整java类名或者别名
c:resultMap:应用外部的resultMap 4:子元素
id:同resultMap的id一样对应该javaBean表的主键 result: property:
映射数据库列的实体对象的属性 column:数据库列名或者别名
collection:映射到javaBean的某个复杂类型属性,例如集合1:复杂类型集合,一对多(一个实体类嵌套另一个实体类集合) 2:内部嵌套:映射一个嵌套结果集到一个列表 3:属性
property:映射数据库列的实体对象的属性 ofType : 完整的java类名或者别名(集合所包含的类型) resultMap
: 应用外部的resultMap,代码重用 4:子元素 id:同resultMap的id一样对应该javaBean表的主键
result: property: 映射数据库列的实体对象的属性 column:数据库列名或者别名 使用select完成单条件查询
select标签:及其属性: 1:id:命名空间的唯一标识符,与接口中的方法名相对应
2:parameterType:传入的SQL语句的参数类型的限定名或别名 基础数据类型:int String Date等,
只能传入一个,通过#{参数名}来获取传入值 复杂数据类型:java实体类,Map集合通过#{属性名}或#{Map的Key}获取传入值
3:resultType:SQL语句的返回值的完整类名或别名
2,3都支持内建的别名,大小写不区分。可以参考P37别名表#{userName}:userName和接口方法中传入的参数名是一样的
a:单参数入参 b:多参数之javaBean对象入参 c:多参数之Map集合入参使用insert完成增加操作 insert标签及其属性: 1:id:命名空间的唯一标识符,与接口中的方法名相对应
2:parameterType:传入的SQL语句的参数类型的限定名或别名 关于增删改的返回类型:
1:默认返回影响的行数,所以接口方法中的返回值类型要设置为int类型最好不要返回boolean。
2:insert,update,delete元素是没有返回属性resultType只有查询操作select才有相应的指定。
使用update完成增加操作 insert标签及其属性: 1:id:命名空间的唯一标识符,与接口中的方法名相对应
2:parameterType:传入的SQL语句的参数类型的限定名或别名1:对象入参 同insert用法相同,没有set赋值的属性,在表中为NULL显示,因此用参数入参可以解决此问题 2:参数入参,不写入参类型
1:接口方法入参要使用注解 2 : 映射SQL中用#{注解名}来获取参数值 附:超过4个参数最好封装为对象入参,多参入参,不写入参类型
参数固定的,最好直接多参数入参.int类型的入参都要使用包装类.DAO层接口的常见的返回类型 复杂数据类型:1:JAVA对象 2:Map集合 3:List集合 int类型:增删改更新操作,返回影响的行数
MyBatis参数的入参: 1:使用注解进行参数的传递 2:封装成对象入参 使用delete完成删除操作 insert标签及其属性:
1:id:命名空间的唯一标识符,与接口中的方法名相对应 2:parameterType:传入的SQL语句的参数类型的限定名或别名MyBatis的缓存 1:一级缓存 2:二级缓存
----------------------------- 二级缓存的配置: 1:MyBatis的全局cache配置 2:在Mapper XML文件中设置缓存,默认情况下:未开启 3:在Mapper XML文件配置支持cache后,需要对个别查询做调 整可以单独设置cache。
---------------------------------- 实际上,MyBatis的缓存很少用到,当面对一定规模的数据量时,内置的cache方式也派不上用场,我们一般会选择OS cache,mamer
cache等专 门的缓存服务器来做。因此,MyBatis专心做的还是SQL映射!
7 它的配置不区别大小写
8 if元素
<!--SQL片段 -->
<sql id="selectCustomerListWhere">
<where>
<!-- 判断cust_name不为空和空串 -->
<if test="cust_name != null and cust_name!='' " >
cust_name like "%"#{cust_name}"%"
</if>
<!-- 判断cust_name不为空和空串 另一种写法 -->
<if test="cust_name != null and cust_name!='' " >
cust_name like concat('%' ,#{cust_name} , '%')
</if>
<if test="cust_source != null" >
and cust_source = #{cust_source}
</if>
<if test="cust_industry != null" >
and cust_industry = #{cust_industry}
</if>
<if test="cust_level != null" >
and cust_level = #{cust_level}
</if>
</where>
</sql>
<if>元素使用 -->
<select id="findCustomerByNameAndJobs" parameterType="com.fhzheng.po.Customer"
resultType="com.fhzheng.po.Customer">
select * from t_customer **where 1=1**
<if test="username !=null and username !=''">
**and** username like concat('%',#{username},'%')
</if> <if test="jobs !=null and jobs !=''">
**and** jobs= #{jobs}
</if>
</select>
<!-- <trim>元素 -->
<select id="findCustomerByNameAndJobs" parameterType="com.fhzheng.po.Customer"
resultType="com.fhzheng.po.Customer">
select * from t_customer
<trim prefix="where" prefixOverrides="and">
<if test="username !=null and username !=''">
and username like concat('%',#{username}, '%')
</if>
<if test="jobs !=null and jobs !=''">
and jobs= #{jobs}
</if>
</trim>
</select>
9 choose,when,otherwise元素
<!--<choose>(<when>、<otherwise>)元素使用 -->
<select id="findCustomerByNameOrJobs" parameterType="com.fhzheng.po.Customer"
resultType="com.fhzheng.po.Customer">
select * from t_customer **where 1=1**
<choose>
<when test="username !=null and username !=''">
**and** username like concat('%',#{username}, '%')
</when>
<when test="jobs !=null and jobs !=''">
**and** jobs= #{jobs}
</when>
<otherwise>
**and** phone is not null
</otherwise>
</choose>
</select>
10 set元素
<!-- <set>元素 -->
<update id="updateCustomer" parameterType="com.fhzheng.po.Customer">
update t_customer
<set>
<if test="username !=null and username !=''">
username=#{username}**,**
</if>
<if test="jobs !=null and jobs !=''">
jobs=#{jobs}**,**
</if>
<if test="phone !=null and phone !=''">
phone=#{phone}**,**
</if>
</set>
**where id=#{id}**
</update>
11 foreach元素,一种用于数组和集合循环遍历的方式
<!--<foreach>元素使用 -->
<select id="findCustomerByIds" parameterType="List" resultType="com.fhzheng.po.Customer">
select * from t_customer where id **in**
**<foreach item="id" index="index" collection="list" open="(" separator="," close=")">
#{id}
</foreach>**
</select>
item配置是循环中当前的元素
index配置是当前元素在集合的位置下标
collection配置的是list传递过来的参数类型(首字小写),可以是array,list,collection,map等
open,close是前后包装,如括号
separator是间隔符
很容易弄错,要特别小心
12 bind元素,前面有别的实现方式
用这种绑定的方式,可以有效地防止sql注入
<!--<bind>元素的使用:**根据客户名模糊查询客户信息** -->
<select id="findCustomerByName" parameterType="com.fhzheng.po.Customer" resultType="com.fhzheng.po.Customer">
<!--_parameter.getUsername()也可直接写成传入的字段属性名,即username -->
<bind name="pattern_username" value="'%'+_parameter.getUsername()+'%'" />
select * from t_customer
where
username like #{pattern_username}
</select>
本文详细介绍了MyBatis映射文件的使用方法,包括如何引入映射文件、mapper文件的主要元素及其功能,如select、insert、delete、update、sql、cache等,以及resultMap的配置和使用。此外,还讲解了如何处理复杂结果集,别名配置的意义,以及各种SQL语句的标签属性和使用场景。
2326





