一、mapper动态代理
通常的架构中的持久层:dao接口,daoImpl实现类。
MyBatis持久成:dao接口,dao实现类(获取会话,调用sqlSession方法进行操作数据库)还有mapper.xml映射文件。
Mybatis持久层演变成mapper接口(dao接口)和mapper.xml映射文件。
**mapper动态代理开发的规范要求:
1、映射文件mapper.xml名字和接口名字一致。
2、映射文件的namespace要和接口的路径一致。
3、映射文件中的Statement的id要与接口的方法名一致。
4、映射文件的输入参数的类型:paramterType和接口的参数类型一致。
5、映射文件的输出结果 类型和接口的返回类型一致。
配置批量加载mapper的映射文件
<mappers>
<!-- 扫描包的方式 批量加载mapper -->
<package name="com.hpe.mapper"/>
</mappers>
二、mapper.xml详解
parameterType:输入参数类型:Java基本类型、实体类对象、hashMap
map传参:通过#{map的key}
设置值,如果找不到key,不会报错,取值为null
。
<select id="selectMap" parameterType="map" resultType="User" >
SELECT * FROM user WHERE sex = #{sex} AND address LIKE #{address}
</select>
多参数:无需指定参数类型
方法一:使用#{index}
来取值,从0
开始。
<select id="selectByParams" resultType="User" >
SELECT * FROM user WHERE sex = #{0} AND address LIKE #{1}
</select>
方法二:接口参数使用@Param(“key”),然后通过#{key}的方式取值。原理:把当前的参数封装到一个map中。
/**
*
* 方法描述:第一种多参数的查询
* @param sex
* @param address
* @return
*/
public List<User> selectByParams(@Param("sex")String sex, @Param("addr")String address);
--------------------------------------------------------
<select id="selectByParams" resultType="User" >
SELECT * FROM user WHERE sex = #{sex} AND address LIKE #{addr}
</select>
resultType:输出结果类型:Java基本类型、实体类对象、hashMap
实体类中属性名和数据库字段名不匹配问题
解决方法一:给sql查询的结果起别名
SELECT carId,name AS carName,userId FROM car
解决方法二:resultMap,可以解决属性名和字段名不一致问题;解决映射复杂类型的实体类问题。
<resultMap type="com.hpe.pojo.Car" id="carMap">
<!-- id:主键,唯一标识
column:数据库表中的字段名
property:实体类中的属性名
column和property是映射关系
-->
<id column="carId" property="carId" />
<!-- result:普通结果 -->
<result column="name" property="carName" />
<result column="userId" property="userId"/>
<!-- 如果字段名和属性名一致,可以省略 -->
</resultMap>
<select id="selectCar" resultMap="carMap">
SELECT * FROM car
</select>
if条件判断
当判断条件为整数类型时
<if test="age!=null and age!=0">
条件 :<where>
会去除多余的and、or
<select id="selectIf" parameterType="User" resultType="User">
SELECT * FROM user
<where>
<if test="sex!=null and sex!=''">
AND sex = #{sex}
</if>
<if test="address!=null and address!=''">
AND address LIKE #{address}
</if>
</where>
</select>
<set>
会去除多余的逗号
<update id="updateUser" parameterType="user">
UPDATE user
<set>
<if test="address!=null and address!=''">
address=#{address},
</if>
<if test="username!=null and username!=''">
username=#{username},
</if>
</set>
WHERE id=#{id}
</update>
<foreach></foreach>
循环
collection:传递过来的参数,可以是list、array(数组)、map的key、实体类中的属性
item:循环中的当前元素
index:当前元素的下标
open:循环的开始,以什么开始
close:循环的结束
separator:分隔符
<delete id="deleteByIds" parameterType="list">
DELETE FROM user WHERE id IN
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>