Mybatis 应用
1 Mybatis 入门与编码流程
2 mapper代理开发方式
3 全局配置文件
4 输入映射和输出映射
5 关联查询
6 延迟加载
7 动态SQL
8 Mybatis缓存
Mybatis 输入映射和输出映射
一、输入类型
1.1 parameterType(输入类型)
parameterType属性可以映射的输入参数Java类型有:简单类型、POJO类型、Map类型、List类型(数组)。
Map类型和POJO类型的用法类似,只示例POJO类型的相关配置。
List类型在动态SQL部分进行讲解。
POJO类型的输入参数设置
1、功能说明:实现 SELECT * FROM user where username like ‘%小明%’ 查询接口。
2、 相关代码实现
核心是使用.
获取POJO 中的属性,${} 获取数据。
定义包装对象QueryVO
public class QueryVO { private User user; }
Mapper文件
为何使用${}, 与#{}的区别是什么?
<!-- 使用包装类型查询用户 使用ognl从对象中取属性值,如果是包装对象可以使用.操作符来取内容部的属性 -->
<select id="findUserList" parameterType="queryVo" resultType="user">
SELECT * FROM user where username like '%${user.username}%'
</select>
Mapper接口
/*** 用户管理mapper */
public interface UserMapper {
//综合查询用户列表
public List<User> findUserList(QueryVo queryVo)throws Exception;
}
二、输出映射
2.1 resultType(输出类型)
使用resultType进行输出映射时,要求sql语句中查询的列名(列别名)和要映射的pojo的属性名一致。
注意:输出简单类型必须查询出来的结果集只有一列。
2.2 resultMap
如果sql查询列名和pojo的属性名可以不一致,通过resultMap将列名和属性名作一个对应关系,最终将查询结果映射到指定的pojo对象中。
resultType底层也是通过resultMap完成映射的。
1、 功能描述:
将以下sql的查询结果进行映射:
SELECT id id_,username username_,birthday birthday_ FROM user
2、 代码实现
2.2.1 resultMap
- 定义resultMap:将查询的列名和映射的pojo的属性名做一个对应关系
- type:指定查询结果要映射的pojo的类型 id:指定resultMap的唯一标示
2.2.2 id
表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个
- Property:表示User类的属性。
- Column:表示sql查询出来的字段名。
- Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
2.2.3 result
普通结果,即pojo的属性。
Mapper映射文件示例
<mapper namespace="com.kkb.mybatis.resultmap_01.mapper.UserMapper">
<!-- 定义resultMap:将查询的列名和映射的pojo的属性名做一个对应关系 -->
<!--type:指定查询结果要映射的pojo的类型 id:指定resultMap的唯一标示 -->
<resultMap type="com.kkb.mybatis.resultmap_01.po.User" id="userListResultMap">
<!-- id标签:映射查询结果的唯一列(主键列) column:查询sql的列名 property:映射结果的属性名 -->
<id column="id_" property="id"/>
<!-- result标签:映射查询结果的普通列 -->
<result column="username_" property="username"/>
<result column="birthday_" property="birthday"/>
</resultMap>
<select id="findUserListResultMap" resultMap="userListResultMap">
SELECT id id_, username username_, birthday birthday_
FROM user
</select>
</mapper>
三、 #{}和${}区别
3.1 类比JDBC 字符
- #{} :相当于JDBC SQL语句中的占位符? (PreparedStatement)
- ${} : 相当于JDBC SQL语句中的连接符合 + (Statement)
3.2 string类型的区别
- #{} : 进行输入映射的时候,会对参数进行类型解析(如果是String类型,那么SQL语句会自动加 上’’)
- ${} :进行输入映射的时候,将参数原样输出到SQL语句中
3.3 参数名称区别
- #{} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时。参数名称可以任意。
${}
: 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,${}中参数名称必须是value。
3.4 SQL 注入问题
${} :存在SQL注入问题 ,使用OR 1=1 关键字将查询条件忽略
四、 主键返回
插入操作后获取id: 添加selectKey标签实现主键返回。
- keyProperty:指定返回的主键,存储在pojo中的哪个属性
- order:selectKey标签中的sql的执行顺序,是相对与insert语句来说。由于mysql的自增原理,执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after。
- resultType:返回的主键对应的JAVA类型
- LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。
<insert id="insertUser" parameterType="com.kkb.mybatis.po.User">
<!-- selectKey将主键返回,需要再返回 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address});
</insert>