写点什么

mybatis 常用注解(绝对经典),java 程序设计教程张延军课后答案

作者:Java高工P7
  • 2021 年 11 月 10 日
  • 本文字数:3073 字

    阅读完需:约 10 分钟

3、trim (where, set)

//prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它的作用是移除所有指定在 prefixOverrides 属性中的内容,并且插入 prefix 属性中指定的内容。


<trim prefix="WHERE" prefixOverrides="AND |OR ">


...


</trim>


//set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号


<trim prefix="SET" suffixOverrides=",">


...


</trim>

4、foreach

//collection="要遍历的集合"


//item = "可以在元素体内使用的集合项"


//index = "索引"


//open = "开始字符串"


//separator = "分隔符"


//close = "结束字符串"


<select id="selectUser" resultType="User">


SELECT *


FROM User


WHERE ID in


<foreach item="item" index="index" c


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


ollection="list"


open="(" separator="," close=")">


#{item}


</foreach>


</select>

5、bind

//bind 可以创建一个变量并将其绑定到上下文


<select id="selectUser" resultType="user">


<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />


SELECT * FROM User


WHERE name LIKE #{pattern}


</select>

6、xml 中的 timestamp 比较

第一种写法:


原符号 < <= > >= & ' "


替换符号 < <= > >= & ' "


例如:sql 如下:


create_date_time >= #{startTime} and create_date_time <= #{endTime}


第二种写法:


大于等于


<![CDATA[ >= ]]>


小于等于


<![CDATA[ <= ]]>


例如:sql 如下:


create_date_time <![CDATA[ >= ]]> #{startTime} and create_date_time <![CDATA[ <= ]]> #{endTime}


<select id="getUser"


resultType="java.lang.String" >


select name from user


where birthday < TO_TIMESTAMP(#{start}, 'yyyy-mm-dd hh24:mi:ss')


and birthday >= TO_TIMESTAMP(#{end}, 'yyyy-mm-dd hh24:mi:ss') order by start desc LIMIT 1;


</select>

7、@Param

@Param 是 MyBatis 所提供的(org.apache.ibatis.annotations.Param),作为 Dao 层的注解,作用是用于传递参数,从而可以与 SQL 中的的字段名相对应,一般在 2=<参数数<=5 时使用最佳。


(1)原始的方法


当只有一个参数时,没什么好说的,传进去一个值也只有一个参数可以匹配。当存在多个参数时,传进去的值就区分不开了,这时可以考虑用 Map,例如接口


public List<Role> findRoleByMap(Map<String, Object> parameter);


<select id="findRoleByMap" parameterType="map" resultType="role">


SELECT id,name FROM t_role


WHERE roleName=#{roleName}


AND note=#{note}


<select>


(2) 使用 @Param


很明显上面的缺点就在于可读性差,每次必须阅读他的键,才能明白其中的作用,并且不能限定其传递的数据类型,下面是使用 @Param 的情况,需要将接口改为


public List<Role> findRoleByAnnotation(@Param("roleName") String roleName, @Param("note") String note);


这样我们就可以直接传入对应的值了。


当然也可以使用 Java Bean 来传递多个参数,定义一个 POJO


public class RoleParam {


private String roleName;


private String note;


/getter 和 setter/


}


此时接口就变为


public List<Role> findRoleByBean(RoleParam role);


这样对应的 xml 文件与 1 处的区别就在于 id 和 parameterType 发生了变化,id 对应的方法和 parameterType 对应该类的权限定名。


而使用更多的场景可能是这样的,对应多个 POJO


public List<Role> findRoleByMix(@Param("roleP") RoleParam role, @Param("permissionP") PermissionParam permission);


这样就可以进行如下映射


<select id="findRoleByMix" resultType="role">


SELECT id,name FROM t_role


WHERE roleName=#{roleP.roleName}


AND note=#{rolep.note}


AND level=#{permissionP.level}


<select>


注意此时并不需要写出 parameterType 属性,Mybatis 会进行自动搜索。


(3)总结


  1. 当你不使用 @Param 注解来声明参数时,必须使用使用 #{}方式;

  2. 便于传多个参数;

  3. 类似于别名之类的功能;


三、批量插入




<?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" >


<mapper namespace="com.center.manager.mapper.FundMapper">


<insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">


insert into fund


( id,fund_name,fund_code,date_x,data_y,create_by,create_date,update_by,update_date,remarks,del_flag)


values


<foreach collection="list" item="item" index="index" separator=",">


(


#{item.id},


#{item.fundName},


#{item.fundCode},


#{item.dateX},


#{item.dataY},


#{item.createBy},


#{item.createDate},


#{item.updateBy},


#{item.updateDate},


#{item.remarks},


#{item.delFlag}


)


</foreach>


</insert>


</mapper>


四、useGeneratedKeys 参数



1、在 settings 元素中设置 useGeneratedKeys 参数

对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置 useGeneratedKeys 参数值为 true,在执行添加记录之后可以获取到数据库自动生成的主键 ID。


实际上,在 settings 元素中设置 useGeneratedKeys 是一个全局参数,但是只会对接口映射器产生影响,对 xml 映射器不起效。


<settings>


<!--


允许 JDBC 支持自动生成主键,需要驱动兼容。


如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 -->


<setting name="useGeneratedKeys" value="true" />


</settings>


此时,在接口映射中添加记录之后将返回主键 ID。


public interface UserMapper {


// 受全局 useGeneratedKeys 参数控制,添加记录之后将返回主键 id


@Insert("insert into user(id,name,age) values(#{id},#{name},#{age})")


Integer insertUser(User user);


}


另外,在 settings 元素中设置的全局 useGeneratedKeys 参数对于 xml 映射器无效。如果希望在 xml 映射器中执行添加记录之后返回主键 ID,则必须在 xml 映射器中明确设置 useGeneratedKeys 参数值为 true。

?2、在 xml 映射器中配置 useGeneratedKeys 参数


<insert id="insertUser" parameterType="com.guor.bean.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">


insert into user(id,name,age) values(#{id},#{name},#{age})


</insert>


xml 映射器中配置的 useGeneratedKeys 参数只会对 xml 映射器产生影响,且在 settings 元素中设置的全局 useGeneratedKeys 参数值对于 xml 映射器不产生任何作用。

?3、在接口映射器中设置 useGeneratedKeys 参数

// 设置 useGeneratedKeys 为 true,返回数据库自动生成的记录主键 id


@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")


@Insert("insert into user(id,name,age) values(#{id},#{name},#{age})")


Integer insertUser(User user);


请注意如果此时在接口映射器中又明确设置了 useGeneratedKeys 参数,那么注解映射器中的 useGeneratedKeys 参数值将覆盖 settings 元素中设置的全局 useGeneratedKeys 参数值。


举个例子:先在 settings 元素中设置全局 useGeneratedKeys 参数值为 true,再在接口映射器中设置 useGeneratedKeys 参数值为 false,添加记录之后将不能返回注解 ID。?


五、MyBatis xml 文件中 postgres 数据库字符串转 timestamp 写法




<select id="getName" resultType="java.lang.String" >


SELECT name


FROM user


WHERE birthdaey < TO_TIMESTAMP(#{start}, 'yyyy-mm-dd hh24:mi:ss')


AND birthdaey >= TO_TIMESTAMP(#{end}, 'yyyy-mm-dd hh24:mi:ss')


ORDER BY birthdaey DESC


LIMIT 1;


</select>

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
mybatis常用注解(绝对经典),java程序设计教程张延军课后答案