1、SQL映射文件,顶级元素配置
mapper:映射文件的根元素节点,只有一个namespace(命名接口),用于区分不同mapper,全局唯一。绑定dao接口,即面向接口编程,当namespace绑定某一接口之后,可以不用写该接口的实现类。
cache:配置给定命名空间的缓存
cache-ref:从其他命名空间引用缓存配置。
resultMap:用来描述数据库结果集和对象的对应关系
sql:可以重用的SQL块,也可以被其他语句引用
insert:映射插入语句
update:映射更新语句
delete:映射删除语句
select:映射查询语句
关于MyBatis的SQL映射文件中的mapper元素的namespace属性有以下要求:
- namespace的命名必须跟某个DAO接口同名,同属于DAO层,映射文件与DAO接口应防放置在同一package下,并且习惯都是以Mapper结尾。
- 在不同的mapper文件中,子元素的id可以相同,MyBatis通过namespace和子元素的id联合区分,接口中的方法与映射文件中SQL语句id应一一对应
2、使用select完成单条件查询
<select id="getUserListByUserName" resultType="User" paramterType="string">
select * from user where userName like CONCAT ('%',#{userName},'%')
</select>
select元素属性
id:命名空间中的唯一标识符,可以被用来引用这条语句
parameterType:表示查询语句传入参数的类型的完全限定名或别名,它支持基础数据类型和复杂数据类型。在上面的例子中使用的是基础数据类
型“string”,这是一个别名,代表String,属于一个内建的类
型别名。
resultType:查询语句返回结果类型的完全限定名或别名。别名的使用方式与parameterType是一样的。
别名 | 映射类型 | 别名 | 映射类型 |
string |
String | double | Double |
byte | Byte | float | Float |
long | Long | boolean | Boolean |
short | Short | date | Date |
int | Integer | map | Map |
integer | Integer | hashmap | HashMap |
arraylist | ArrayList | list | List |
3、MyBaits多条件查询:
3.1、parameterType传参类型可以为任何类型,该属性可以不写。当传入一个参数为基本数据类型时,可以通过#{}来获取传入的值,也可以通过#{下标}来
获取,也可使用${value}获取。当传入
为多个基本数据类型时只能用#{下标}获取,下标从0开始。
例:
接口:
public List<User> getUserListByParam(String username,Integer roleId);
Mapper映射文件:
<select id="getUserListByParam" resultType="User" >
select * from smbms_user where username like CONCAT('%',#{0},'%') and userRole=#{1}
</select>
3.2、使用实体类,将参数封装成对象传入。#{}中的参数名需要与对象的属性名一致。
接口:
public List<User> getUserListByUser(User user);
Mapper映射文件:
<select id="getUserListByUser" resultType="User" parameterType="User">
select * from smbms_user where username like CONCAT('%',#{userName},'%') and userRole=#{userRole}
</select>
3.3、使用Map集合,将参数存入Map集合进行传递。#{}中参数名需要与Map集合中的键名一致
接口:
public List<User> getUserListByUserMap(Map<String, String> map);
Mapper映射文件:
<select id="getUserListByUserMap" resultType="User"
parameterType="map">
select * from smbms_user where username like CONCAT('%',#{userName},'%') and userRole=#{userRole}
</select>
3.4、使用@Param注解传递多个参数。使用@Param注解封装的参数小括号中参数名需要与#{}中参数名一致。
接口:
public List<User> getUserListByParam(@Param("userName")String username,@Param("userRole")Integer roleId);
Mapper映射文件:
<select id="getUserListByParam" resultType="User" >
select * from smbms_user where username like CONCAT('%',#{userName},'%') and userRole=#{userRole}
</select>
4、${}和#{}获取参数的区别
4.1、#{}会将参数转化成String类型进行处理(特殊字符会进行转义),${}不会。
4.2、使用#{}会进行预处理,也就是表示使用PreparedStatement进行执行SQL语句,可以有效的防止sql注入,但是${}不会。
4.3、一般在进行排序order by的时候使用${},${value}(只有单个参数时使用${value}可以获取到参数值,多个参数依然使用对象属性或Map集合的键名)
4.4、在能使用#{}的时候就不要去用${}。