学习MyBatis必知必会(7)~注解开发、动态SQL
一、MyBatis的注解开发
- 开发中推荐是使用xml文件配置
1、配置映射关系【使用注解的方式】:
<!-- 全局的配置文件 -->
<configuration>
<!-- 2、关联映射文件/ 关联Mapper接口 -->
<mappers>
<!-- <mapper resource="com/shan/hello/mapper/UserMapper.xml"/>-->
<mapper class="com.shan.hello.mapper.UserMapper"/>
</mappers>
</configuration>
2、通过注解,把sql和映射写到Mapper接口:
public interface UserMapper {
@Insert("insert into t_user (name, salary) values (#{name}, #{salary});")
@Options(useGeneratedKeys = true,keyProperty = "id")
void save(User user);
@Delete("delete from t_user where id = #{id};")
void delete(Long id);
@Update("update t_user set name = #{name}, salary = #{salary} where id = #{id};")
void update(User user);
// void update(User user, Long id);//错误:myBatis默认只能传递一个参数
@Select("select id u_id, name as u_name, salary u_salary from t_user where id = #{id}")
@Results(id="BaseResultMap", value= {
@Result(column = "u_id",property = "id"),
@Result(column = "u_name",property = "name"),
@Result(column = "u_salary",property = "salary")
})
User get(Long id);
@Select("select id u_id, name as u_name, salary u_salary from t_user")
@ResultMap("BaseResultMap")
List<User> getListAll();
}
3、测试(这里以测试查询为例):
/* 测试查询 */
@Test
public void testGet() throws IOException {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.get(2L);
System.out.println(user);
//5、关闭资源
session.close();
}
二、动态SQL 【类似JSTL(java标准标签库)语法】
if
choose (when, otherwise)
trim (where, set)
foreach
其他(bind,sql,include)
1、if 举例:
<!-- 映射文件 -->
<select id="select" resultType="Employee">
select * from employee
<if test="minSalary != null">
where salary >= #{minSalary}
</if>
</select>
细节:在xml中 小于符合不能直接输入 < , 会被当做标签的开始标志,需要使用转义符号 <;
防止第一个查询条件是null,加上 where 1=1,然后其他查询条件接着and 写。
2、choose (when, otherwise) 举例:
<!-- 映射文件 -->
<select id="select" resultType="Employee">
select * from employee where 1=1
<if test="minSalary != null">
and salary >= #{minSalary}
</if>
<choose>
<when test="deptId > 0">and deptId = #{deptId}</when>
<otherwise>and deptId is not null</otherwise>
</choose>
</select>
3-1、trim (where, set)- where 举例:
解决sql拼接查询条件时第一个条件为null,而加上 where 1=1,导致不能进行索引查询,影响性能。
where 元素:判断查询条件是否有where关键字,若没有,则第一个查询条件之前要插入 where
若发现查询条件是以and/or开头,则会把第一个查询条件前的and/or 替换成 where
<!-- 映射文件 -->
<select id="select" resultType="Employee">
select * from employee
<where>
<if test="minSalary != null">
and salary >= #{minSalary}
</if>
<if test="maxSalary != null">
and salary <= #{maxSalary}
</if>
<choose>
<when test="deptId > 0">and deptId = #{deptId}</when>
<otherwise>and deptId is not null</otherwise>
</choose>
</where>
</select>
3-2、trim (where, set)-set 举例:
- 和where 类似,动态去掉最后一个逗号
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
3-3、trim (where, set)-trim :
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides="">
<!--trim 包含的动态 SQL-->
</trim>
□ prefix – 在这个字符串之前插入 prefix 属性值。
□ prefixOverrides – 并且字符串的内容以 prefixOverrides 中的内容开头(可以包含管道符号),那么使用 prefix 属性值替换内容的开头。
□ suffix – 在这个字符串之后插入 suffix 属性值。
□ suffixOverrides –并且字符串的内容以 suffixOverrides 中的内容结尾(可以包含管道符号),那么使用 suffix 属性值替换内容的结尾。
使用 where 等价于: 注意:此时 AND 后面有一个空格。
使用 set 等价于:
4、foreach 举例1:
/* Mapper接口 */
void batchDelete(@Param("ids")List<Long> ids);
<!-- 映射文件 -->
<!--
foreach 元素: collection属性:表示要迭代的集合或数组【的类型,若是通过Parm注解,可以直接写上Map中的key,而不用填写类型】
open属性:在集合迭代之前,要拼接的符号 close 属性:在集合迭代之后要拼接的符号
separator属性:迭代的元素之间的分割符号
item属性:每个被迭代的元素
index属性:迭代的索引
-->
<delete id="batchDelete">
delete from employee where id in
<foreach collection="ids" open="(" close=")" separator="," item="id">
#{id}
</foreach>
</delete>
■ foreach 举例2:
/* Mapper接口 */
void batchSave(@Param("emps")List<Employee>emps);
<!-- 映射文件 -->
<insert id="batchSave">
insert into employee (name, sn, salary) values
<foreach collection="emps" separator="," item="e">
(#{e.name}, #{e.sn}, #{e.salary})
</foreach>
</insert>
5、其他(bind,sql,include) 举例-高级分页查询:
■ sql,include 的例子:
<!-- 映射文件 -->
<mapper namespace="com.shan.hello.mapper.EmployeeMapper">
<sql id="base_where">
<where>
<if test="keyword != null">
<!--and name like #{%name%}; 要使用字符串函数concat进行拼接呀 -->
<!-- and name like concat('%', #{name}, '%') or sn like concat('%', #{sn},'%'); qo查询对象,也没有属性name,sn呀 -->
and (name like concat('%', #{keyword}, '%') or sn like concat('%', #{keyword}, '%'))
</if>
<if test="minSalary != null">
and salary >= #{minSalary}
</if>
<if test="maxSalary != null">
and salary <= #{maxSalary}
</if>
<if test="deptId > 0">
and deptId = #{deptId}
</if>
</where>
</sql>
<select id="queryForList" resultType="Employee">
select id, name, sn, salary from employee
<include refid="base_where"/>
</select>
<select id="queryForCount" resultType="int">
select count(id) from employee
<include refid="base_where"/>
</select>
</mapper>
■ bind(跟concat一样是用于拼接字符串) 的例子:
<if test="keyword != null">
<!--and name like #{%name%}; 要使用字符串函数concat进行拼接呀 -->
<!-- and name like concat('%', #{name}, '%') or sn like concat('%', #{sn},'%'); qo查询对象,也没有属性name,sn呀 -->
<!-- and (name like concat('%', #{keyword}, '%') or sn like concat('%', #{keyword}, '%')) -->
<bind name="keywordLike" value="'%' + keyword + '%'"/>
and (name like #{keywordLike} or sn like #{keywordLike})
</if>
学习MyBatis必知必会(7)~注解开发、动态SQL的更多相关文章
- 后端框架的学习----mybatis框架(7、使用注解开发)
7.使用注解开发 1.注解在接口上实现 /** * 查询用户 */ @Select("select * from user") public List<User> ge ...
- mybatis注解开发-动态SQL
实体类以及表结构 在mybatis-config.xml中注册mapper接口 -------------------------- 动态查询@SelectProvider EmployeeMappe ...
- [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)
http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- 学习《SQL必知必会(第4版)》中文PDF+英文PDF+代码++福达BenForta(作者)
不管是数据分析还是Web程序开发,都会接触到数据库,SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能. 推荐学习<SQL必知必会(第4版)>,内容丰富,文字简洁明快 ...
- 《MySQL必知必会》学习笔记——前言
前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...
- 必知必会之Java注解
必知必会之Java注解 目录 不定期更新中-- 元注解 @Documented @Indexed @Retention @Target 常用注解 @Deprecated @FunctionalInte ...
- 《SQL必知必会》学习笔记整理
简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...
- 《SQL必知必会》学习笔记(一)
这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...
- mysql学习--mysql必知必会1
例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...
随机推荐
- TKE用户故事 | 作业帮检索服务基于Fluid的计算存储分离实践
作者 吕亚霖,2019年加入作业帮,作业帮基础架构-架构研发团队负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 张浩然,2019年加入 ...
- 洛谷1052——过河(DP+状态压缩)
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- Java程序设计基础笔记 • 【第5章 循环结构】
全部章节 >>>> 本章目录 5.1 while循环结构 5.1.1 循环简介 5.1.2 while循环 5.1.3 while循环的使用 5.1.4 while循环的注 ...
- Java Springboot webSocket简单实现,调接口推送消息到客户端socket
Java Springboot webSocket简单实现,调接口推送消息到客户端socket 后台一般作为webSocket服务器,前台作为client.真实场景可能是后台程序在运行时(满足一定条件 ...
- Ranger-AdminServer安装Version2.0.0
Ranger-AdminServer安装, 对应的Ranger版本2.0.0. 1.安装规划 RangerAdmin安装依赖如下组件: mysql solr IP/机器名 安装软件 运行进程 dap2 ...
- Fences桌面图标分类
1.简介 Fences也称为栅栏桌面, 可以用来分类和组织桌面上的图标. Fences可以将不同的图标放到不同的容器当中, 还可以自由的设置这个容器,比如移动和拉伸等等. 这样图标分类后,桌面就整洁多 ...
- MATLAB 设置示波器颜色和行列
设置颜色 设置行列和图例 放大缩小显示
- python 之 pip、pypdf2 安装与卸载
pip是个啥? pip 是一个现代的,通用的 Python 包管理工具.提供了对 Python 包的查找.下载.安装.卸载的功能. 第一步:pip 下载:https://pypi.org/projec ...
- JMeter_分布式压测配置
前置条件 电脑A,电脑B,电脑C均安装相同版本的JMeter 和JDK.其中电脑A作为控制机,电脑B和电脑C作为施压机 电脑A IP:172.16.0.114 电脑B IP:172.16.0.115 ...
- git报错 error: cannot stat 'file': Permission denied
切换分支(git checkout xxx)时报错: error: cannot stat 'file': Permission denied 解决方法:退出编辑器.浏览器.资源管理器等,然后再切换就 ...