Mybatis映射文件
Mapper映射文件是Java实体类与数据库对象之间的桥梁,使用过程中一个Mapper文件对应一个数据库操作Dao接口
一、文件的约束
加载映射文件
<?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">
二、主配置引入
mybatis框架需要加载Mapper.xml映射文件,在主配置文件中添加映射
<mappers>
<mapper resource="com/fyl/mapper/NewsMapping.xml"/>
<mapper resource="com/fyl/mapper/UserMapping.xml"/>
</mappers>
三、元素节点
mapper 为元素的根节点
namespace:命名空间,一个namespace对应一个dao接口
<mapper namespace="com.fyl.mapper.UserMapping">
以<mapper>作为根节点,在根节点中支持9个元素,分别为
cache-给定命名空间的缓存配置。 cache-ref:其他命名空间缓存配置的引用 resultMap:是最复杂最强大的元素,用来描述如何从数据库结果集中来加载 requestMap: sql:可被其他语句引用的可重用语句块 insert:映射插入语句 update:映射更新语句 delete:映射删除语句 select:映射查询语句 |
四、常见属性
<select id="find" parameterType="int" resultType="com.fyl.entity.User">
select * from user where uid=#{uid}
</select>
1.id (必须配置)
id是命名空间的唯一标识符,可被用来代替这条语句,一个命名空间对应一个dao层接口,这个id相当与对应dao里面的某个方法,相当于某个方法的实现,因此id应该与方法名一致
2.parameterType(可选配置,默认为mybatis自动选择处理)
将要传入语句的参数的完全限定类名或别名,如果不配置,mybatis会通过ParameterType根据参数类型默认选择何时的typeHandler进行处理。ParameterType主要指定参数类型,可以是int,short,long,亦可以是复杂类型如类,集合等
3.resultType(返回数据类型)
返回期望类别类型的完全限定名或别名,集合的情况,是集合包含的类型,而不是集合本身。使用resultMap或resultType。
4.resultMap(复杂返回)
返回数据类型,命名引用外部的resultMap。返回map是MyBatis最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被解决了。使用resultMap或resultType,但不能同时使用
5. flushCache
若将其设置为true,不论语句什么时候被调用,都会导致缓存被清空,默认值:false
6.statementType(可选配置,默认为PREPARED)
STATEMENT<PREPARED或CALLABLE的一个,这会让MyBatis分别使用Statement,PreparedStatement或CallableStatement
7.KeyProperty(仅对insert有用, 默认:unset,)
唯一标识一个属性,MyBatis会通过getGenerateKeys的返回值后者通过insert语句selectKey子元素设置它的键值,如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
8.KeyColumn(仅对insert和update有用)
通过生成的键值设置表中的列名,这个设置尽在某些数据库是必须多的,当主键列不是表中的第一列的时候需要设置,如果希望得到过个生成的列,也可以是逗号分割的属性名称列表。
9.userGeneratekeys(默认为false)
仅对insert有用,令Mybatis使用jdbc的getGeneratedkeys方法来取出由数据库内部生成的主键(如mysql)管理数据库系统的自动递增字段。
10.Timeout(默认值为unset,依赖驱动)
这设置是在抛出异常之前,驱动程序等待数据库返回请求结果的描述,默认为unset(依赖驱动)
五、常见属性分析
(1)parameterType使用
Mybatis的传入参数parameterType类型分为:
基本数据类型:int,string,long,data
复杂数据类型:实体类和Map
如何获取参数中的值:
基本数据类型:#{参数}获取参数中的值
复杂数据类型:类是#{属性名},map中则是#{key}
注:传入多个参数如何写:
无论传入的参数是什么,最后mybatis都会将传入的转换为map的,既然这样,当传入多个参数是,直接map类型,然后mapper.xml通过#{map.key}来获取值即可,实现动态搜索,或多个参数查询
I :Dao层的函数方法
public User selectUser(String username,String password);
<select id=”selectUser”resultType=”User”>
Select * from user where username=#{0} and password=#{1}>
</select>
注:#{0}代表接收的是dao层的第一个参数,#{1}代表的是dao层的第二个参数
II: Map传多参数
DAO: public User selectUser(Map paramMap);
<select id=”selectUser” resultType=”User”>
Select * from user where username=#{username} and password=#{password}
</select>
Service:
Private User selectUser(){
Mao paramMap=new hashMap();
paramMap.put(“username”,”对应具体的参数值”);
paramMap.put(“password”,”对应具体的参数值“);
User user=xx.selectUser(paramMap);
III:基于注解(推荐)
public List<User> selectUser(@Param(“username”)String username, @Param(“password”)String password)
<select id=”selectUser” resultMap=”usermap”>
<select * from user where username=#{username} and password=#{password}
</select>
(2) resultType:
用于指定返回类型,指定的类型可以是基本类型,可以是类,注意类要写全名,并且如果返回是集合,返回类型为集合中泛型的类型
(3)resultMap:
resultMap和resultType作用类似,用于引导通过resultMap标签定义的映射类型,查询复杂数据,查询多个表数据映射到一个结果集当中。如果需要查询的只是一个表。可以简单定义实体类,实体代表数据库表中的一条记录,可以使用resultType;如果遇到一对多的问题,查询是需要查询多个表的列信息,那么便要使用resultMap
使用resultMap 里面的值为:resultMap标签的id
六、resultMap标签详解
配置resultMap标签
<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id=" " type=" ">
id :唯一的标识 type:映射的pojo对象
<id column=" " jdbcType=" " property=" " />
<result column=" " jdbcType=" " property=" "/>
<association property=" " javaType=" ">
<!--Property: pojo的一个对象属性-->
<!--javaType: pojo关联的pojo对象-->
<id column=" " jdbcType=" " property=" "/>
<!--Column: 关联pojo对象对应表的主键字段-->
<!--JdbcType:字段类型-->
<!--Property: 关联pojo对象的主键属性-->
<result column=" " jdbcType=" " property=" "/>
</association>
<!-- 集合中的property须为oftype定义的pojo对象的属性-->
<collection property=" " ofType=" ">
<!--Property: pojo的集合属性-->
<!--ofType: 集合中的pojo对象-->
<id column=" " jdbcType=" " property=" " />
<!--Column: 集合中pojo对象对应的表的主键字段-->
<!--jdbcType: 字段类型-->
<!--property: 集合中pojo对象的主键属性-->
<result column=" " jdbcType="字段类型" property=" " />
<!--Column: 可以为任意表的字段-->
<!-- Property: 集合中的pojo对象的属性-->
</collection>
</resultMap>
注:resultMap中对象属性类中的字段和前面的字段名字最好别重复,否则查询时会显示前面的值;
对象属性类中的字段要在sql语句中列出
七、#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其他名称。
${}表示拼接sql,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value
例:实现模糊查询:
第一种使用#{}完成
<select id=”queryUser” parameterType=”string”
resultType=”com.fyl.User”>
select * from user where username LIKE #{username}
</select>
测试:List<Object> list=sqlSession.selectList(“queryUser”,”%张%”);
第二种:使用${}完成
<select id=”queryUser” parameterType=”string”
resultType=”com.fyl.User”>
select * from user where username LIKE ‘%${value}%’
<select>
测试:List<Object> list=sqlSession.selectList(“queryUser”,”张”);
注:Mybatis使用order by 动态传参问题?
mybatis在使用order by 时,要使用$符号,而不是#符号。
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,如
order by #{id} 传入为id,解析为 order by ‘id’;
$将传入的值直接显示生成在sql中,如order by ${id}传入为id,解析为order by id;