MyBatis注解及动态Sql
一、注解实现MyBatis配置
java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换Mapper配置文件。
package com.lhf.dao; import com.lhf.entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update; import java.util.List; public interface UserDao {
@Select("select * from user")
List<User> getAll();
@Delete("delete from user where id=#{id}")
int del(int id);
@Insert("insert into user values(default,#{name},#{pwd})")
int add(User user);
@Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
int modify(User user);
}
删除UserDaoMaper的xml文件,在dao层使用注解(select、delete、insert、update)来实现数据库的简单操作,这个效果与Xml文件的效果是一致的。上一篇中有介绍xml文件的配置
一定会有人问,这里方法内的参数一般都是一个,那如果是两个以及以上怎么办呢?那就需要我们的@Parm注解了,该注解的作用可以看成是给参数起别名:

MyBatis基本常用的注解大概就说这么多后续再补充
二、动态SQL
何为动态SQL,就是服务器根据用户请求从而选择性的发送SQL语句,最典型的就是修改了,一个表中有多个字段,如果用户只需修改其中一个即可,那我们的SQL语句就没办法确定要修改哪一个,以前的做法是再修改前先获取所有的字段信息,然后按照用户所做的修改一 一进行比对,最后统一进行修改。这样的话我们就需要再dao将所有的字段都修改一次了,这和删除以后再新增一个区别不大,而且浪费资源,所有才有了动态SQL的诞生,动态sql只能是在xml文件中进行配置
if : If标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件,它也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值。
<?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.lhf.dao.UserDao">
<update id="modify">
update user set
<if test="pwd!=null">
pwd=#{pwd}
</if>
where
<if test="id>0">
id=#{id}
</if>
</update>
</mapper>
类似于java中的if判断语句,test中为判断条件。
choose:上一部分的if标签提供了基本的条件判断,但是它无法实现if....else、if....else..... 的逻辑,要想实现这样的逻辑,就需要使用到choose when otherwise标签。choose元素中包含when和otherwise两个标签,一个choose中至少包含一个when,有0个或1个otherwise。
<select id="select" resultType="User">
select * from user where 1=1
<choose>
<when test="name!=null and name!=''">
and name=#{name}
</when>
<when test="id!=-1">
and id=#{id}
</when>
<otherwise>
and name="程序员"
</otherwise>
</choose>
</select>
where:Where标签的作用:如果该标签包含的元素有返回值,就插入一个where;如果where 后面的字符串是以and和or开头,就将它剔除。
<select id="select" resultType="User">
select * from user<!--使用了where标签,无需手动编写where条件-->
<where>
<choose>
<when test="name!=null and name!=''">
and name=#{name}
</when>
<when test="id!=-1">
and id=#{id}
</when>
<otherwise>
and name="程序员"
</otherwise>
</choose>
</where>
</select>
set:Set标签的作用:如果该标签包含的元素中有返回值,就插入一个set;如果set后面的字符串是以逗号结尾的,就把这个逗号剔除
<update id="modify" parameterType="User">
<!--如果参数类型是一个对象,那么sql语句中#{对象的属性名}-->
update user
<!--使用<set>标签替代set语句-->
<set>
<if test="name!=null and name !=''">
name=#{name},
</if>
</set>
where id=#{id}
</update>
trim:Where和set标签的功能都可以使用trim标签来实现。
<trim prefix="WHERE" prefixOverrides="AND|OR"> </trim>
<trim prefix="SET" suffixOverrides=","> </trim>
trim标签有如下属性:
prefix:当trim元素中包含内容时,会给内容增加prefix指定的前缀
prefixOverrides:当trim元素中包含内容时,会把内容中匹配的前缀去掉
suffix:当trim元素中包含内容时,会给内容增加suffix指定的后缀
suffixOverrides:当trim元素中包含内容时,会把内容中匹配的后缀去掉
foreach:可以生成一系列的值,这个标签主要用于SQL的in语句后面 foreach元素的属性主要有 item,index,collection,open,separator,close。
item:示集合中每一个元素进行迭代时的别名,
index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open:表示该语句以什么开始,
separator:表示在每次进行迭代之间以什么符号作为分隔 符,
close:表示该语句以什么结束
(1)foreach实现in集合
使用foreach元素可以in 集合|数组
1.foreach元素in array数组
接口方法如下:
//根据插入的id数组获取用户
List<User> findUserByIds(int[] ids);
在UserMapper.xml中新增select节点
<select id="findUserByIds" resultType="User">
select * from account
<!--此处必须使用array 不能使用参数名-->
<if test="array.length>0">
where id IN
<foreach collection="array" open="(" close=")" separator="," item="item">
#{item}<!--item此时表示数组中的元素-->
</foreach>
</if>
</select>
新增测试代码
@Test
public void test04(){
//检索id为3,5的用户
List<User> userByIds = mapper.findUserByIds(new int[]{3, 5});
System.out.println(userByIds);
}
2.foreach元素in 普通list集合
//根据插入的id集合获取用户
List<User> findUserByIds(List<Integer> lists);
修改select节点如下
<select id="findUserByIds" resultType="User">
select * from account
<!--此处必须使用list 不能使用参数名-->
<if test="list.size>0">
where id IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item}<!--item此时表示集合中的元素-->
</foreach>
</if>
</select>
测试代码如下
@Test
public void test04(){
//检索id为3,5的用户
List<Integer> lists=new ArrayList<>();
lists.add(3);
lists.add(5);
List<User> userByIds = mapper.findUserByIds(lists);
System.out.println(userByIds);
}
3.foreach元素in 自定义list集合
修改上述代码,将findUserByIds方法修改如下:
//根据插入的id集合获取用户
List<User> findUserByIds(List<User> lists);
修改select节点如下:
<select id="findUserByIds" resultType="User">
select * from account
<!--此处必须使用list 不能使用参数名-->
<if test="list.size>0">
where id IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item.id}<!--item此时表示集合中的元素User对象-->
</foreach>
</if>
</select>
修改测试代码如下:
@Test
public void test04(){
//检索id为3,5的用户
List<User> lists=new ArrayList<>();
User user=new User();
User user1=new User();
user.setId(3);
user1.setId(5);
lists.add(user);
lists.add(user1);
List<User> userByIds = mapper.findUserByIds(lists);
System.out.println(userByIds);
}
MyBatis注解及动态Sql的更多相关文章
- MyBatis注解配置动态SQL
MySQL创建表 DROP TABLE IF EXISTS `tb_employee`; CREATE TABLE `tb_employee` ( `id` int(11) NOT NULL AUTO ...
- MyBatis 注解使用动态SQL
使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能 ...
- mybatis注解开发-动态SQL
实体类以及表结构 在mybatis-config.xml中注册mapper接口 -------------------------- 动态查询@SelectProvider EmployeeMappe ...
- Mybatis之注解实现动态sql
通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- Mybatis入门之动态sql
Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...
- mybatis 详解------动态SQL
mybatis 详解------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...
- mybatis中的动态SQL
在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
随机推荐
- 【One by one系列】一步步学习TypeScript
TypeScript Quick Start 1.TypeScript是什么? TypeScript是ES6的超集. TS>ES7>ES6>ES5 Vue3.0已经宣布要支持ts,至 ...
- Python 三十个实践、建议和技巧
[导读]2020年,你又立了什么新的 Flag?新一年,我们先为大家准备 30 个非常优秀的 Python 实践技巧.希望这些诀窍能在实际工作中帮助大家,并且学到一些有用的知识. 1.使用 pytho ...
- PHP使用redis防止大并发下二次写入
php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写. $lock_k ...
- java求两个圆相交坐标
最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...
- Centos7.6部署rsyslog+loganalyzer+mysql日志管理服务器
参考来自: the_script :https://yq.aliyun.com/articles/675198 名山.深处:https://www.cnblogs.com/skychenjiajun/ ...
- 吴裕雄--天生自然Linux操作系统:Linux 系统启动过程
linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 . 用户登录系统. in ...
- 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对
1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...
- Tensorflow学习教程------lenet多标签分类
本文在上篇的基础上利用lenet进行多标签分类.五个分类标准,每个标准分两类.实际来说,本文所介绍的多标签分类属于多任务学习中的联合训练,具体代码如下. #coding:utf-8 import te ...
- upstream(负载均衡)
一.什么是负载均衡 负载均衡,顾名思义是指将负载尽量均衡的分摊到多个不同的服务器,以保证服务的可用性和可靠性,提供给客户更好的用户体验: 负载均衡的直接目标就是尽量发挥多个服务单元的整体效能,要实现这 ...
- c#为什么要用事物
一.事务的定义 所谓事务,它是一个操作集合,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.典型的例子就像从网上银行系统的帐户A转帐到帐户B,它经过两个阶段:1.从帐户A取出款项.2.把 ...