1 Mybatis动态SQL
Mybatis动态SQL
1. 注解开发
我们也可以使用注解的形式来进行开发,用注解来替换掉xml。 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 所以我们在实际企业开发中一般都是使用XML的形式。
1.1 步骤
①在核心配置文件中配置mapper接口所在的包名
<mappers>
<package name="com.sangeng.dao"></package>
</mappers>
②在接口对应方法上使用注解来配置需要执行的sql
public interface UserDao {
@Select("select * from user")
List<User> findAll();
@Insert("insert into user values(null,#{username},#{age},#{address})")
void insertUser(User user);
@Update("UPDATE USER SET age = #{age} , username = #{username},address = #{address} WHERE id = #{id}")
void updateUser(User user);
@Delete("delete from user where id = #{id}")
void deleteById(Integer id);
}
③和之前的一样获取Mapper调用方法即可
public static void main(String[] args) throws IOException {
//定义mybatis配置文件的路径
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserDao实现类对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用方法测试
List<User> userList = userDao.findAll();
System.out.println(userList);
//释放资源
sqlSession.close();
}
2.动态SQL
在实际开发中的SQL语句没有之前的这么简单,很多时候需要根据传入的参数情况动态的生成SQL语句。Mybatis提供了动态SQL相关的标签让我们使用。
2.1 if
可以使用if标签进行条件判断,条件成立才会把if标签中的内容拼接进sql语句中。
例如:
<select id="findByCondition" resultType="com.sangeng.pojo.User">
select * from user
where id = #{id}
<if test="username!=null">
and username = #{username}
</if>
</select>
如果参数username为null则执行的sql为:select * from user where id = ?
如果参数username不为null则执行的sql为:select * from user where id = ? and username = ?
注意:在test属性中表示参数的时候不需要写#{},写了会出问题。
2.2 trim
可以使用该标签动态的添加前缀或后缀,也可以使用该标签动态的消除前缀。
2.2.1 prefixOverrides属性
用来设置需要被清除的前缀,多个值可以用|分隔,注意|前后不要有空格。例如: and|or
例如:
<select id="findByCondition" resultType="com.sangeng.pojo.User">
select * from user
<trim prefixOverrides="and|or" >
and
</trim>
</select>
最终执行的sql为: select * from user
2.2.2 suffixOverrides属性
用来设置需要被清除的后缀,多个值可以用|分隔,注意|前后不要有空格。例如: and|or
例如:
<select id="findByCondition" resultType="com.sangeng.pojo.User">
select * from user
<trim suffixOverrides="like|and" >
where 1=1 like
</trim>
</select>
最终执行的sql为: select * from user 去掉了后缀like
2.2.3 prefix属性
用来设置动态添加的前缀,如果标签中有内容就会添加上设置的前缀
例如:
<select id="findByCondition" resultType="com.sangeng.pojo.User">
select * from user
<trim prefix="where" >
1=1
</trim>
</select>
最终执行的sql为:select * from user where 1=1 动态增加了前缀where
2.2.4 suffix属性
用来设置动态添加的后缀,如果标签中有内容就会添加上设置的后缀
<select id="findByCondition" resultType="com.sangeng.pojo.User">
select * from user
<trim suffix="1=1" >
where
</trim>
</select>
最终执行的sql为:select * from user where 1=1 动态增加了后缀1=1
2.2.5 动态添加前缀where 并且消除前缀and或者or
User findByCondition(@Param("id") Integer id,@Param("username") String username);
<select id="findByCondition" resultType="com.sangeng.pojo.User">
select * from user
<trim prefix="where" prefixOverrides="and|or" >
<if test="id!=null">
id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
</trim>
</select>
调用方法时如果传入的id和username为null则执行的SQL为:select * from user
调用方法时如果传入的id为null,username不为null,则执行的SQL为:select * from user where username = ?
2.2 where
where标签等价于:
<trim prefix="where" prefixOverrides="and|or" ></trim>
可以使用where标签动态的拼接where并且去除前缀的and或者or。
例如:
<select id="findByCondition" resultType="com.sangeng.pojo.User">
select * from user
<where>
<if test="id!=null">
id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
</where>
</select>
如果id和username都为null,则执行的sql为:**select * from user **
如果id为null,username不为null,则执行的sql为:**select * from user where username = ? **
2.3 set
set标签等价于
<trim prefix="set" suffixOverrides="," ></trim>
可以使用set标签动态的拼接set并且去除后缀的逗号。
例如:
<update id="updateUser">
UPDATE USER
<set>
<if test="username!=null">
username = #{username},
</if>
<if test="age!=null">
age = #{age},
</if>
<if test="address!=null">
address = #{address},
</if>
</set>
</update>
如果调用方法时传入的User对象的id为2,username不为null,其他属性都为null则最终执行的sql为:UPDATE USER SET username = ? where id = ?
2.4 foreach
可以使用foreach标签遍历集合或者数组类型的参数,获取其中的元素拿来动态的拼接SQL语句。
例如:
方法定义如下
List<User> findByIds(@Param("ids") Integer[] ids);
如果期望动态的根据实际传入的数组的长度拼接SQL语句。例如传入长度为4个数组最终执行的SQL为:
select * from User WHERE id in( ? , ? , ? , ?, ? )
则在xml映射文件中可以使用以下写法
<select id="findByIds" resultType="com.sangeng.pojo.User">
select * from User
<where>
<foreach collection="ids" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
collection:表示要遍历的参数。
open:表示遍历开始时拼接的语句
item:表示给当前遍历到的元素的取的名字
separator:表示每遍历完一次拼接的分隔符
close:表示最后一次遍历完拼接的语句
注意:如果方法参数是数组类型,默认的参数名是array,如果方法参数是list集合默认的参数名是list。建议遇到数组或者集合类型的参数统一使用@Param注解进行命名。
2.5 choose、when、otherwise
当我们不想使用所有的条件,而只是想从多个条件中选择一个使用时。可以使用choose系列标签。类似于java中的switch。
例如:
接口中方法定义如下
List<User> selectChose(User user);
期望:
如果user对象的id不为空时就通过id查询。
如果id为null,username不为null就通过username查询。
如果id和username都会null就查询id为3的用户
xml映射文件如下
<select id="selectChose" resultType="com.sangeng.pojo.User">
select * from user
<where>
<choose>
<when test="id!=null">
id = #{id}
</when>
<when test="username!=null">
username = #{username}
</when>
<otherwise>
id = 3
</otherwise>
</choose>
</where>
</select>
choose类似于java中的switch
when类似于java中的case
otherwise类似于java中的dufault
一个choose标签中最多只会有一个when中的判断成立。从上到下去进行判断。如果成立了就把标签体的内容拼接到sql中,并且不会进行其它when的判断和拼接。如果所有的when都不成立则拼接otherwise中的语句。
3. SQL片段抽取
我们在xml映射文件中编写SQL语句的时候可能会遇到重复的SQL片段。这种SQL片段我们可以使用sql标签来进行抽取。然后在需要使用的时候使用include标签进行使用。
例如:
<sql id="baseSelect" >id,username,age,address</sql>
<select id="findAll" resultType="com.sangeng.pojo.User">
select <include refid="baseSelect"/> from user
</select>
最终执行的sql为: select id,username,age,address from user
1 Mybatis动态SQL的更多相关文章
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- Mybatis动态SQL单一基础类型参数用if标签
Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
- Mybatis动态SQL简单了解 Mybatis简介(四)
动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ } Mybatis应用中,S ...
- mybatis原理分析学习记录,mybatis动态sql学习记录
以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...
- mybatis 动态sql和参数
mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...
- MyBatis动态SQL之一使用 if 标签和 choose标签
bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...
- MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
目录 0 一起来学习 mybatis 1 数据准备 2 if 标签 2.1 在 WHERE 条件中使用 if 标签 2.1.1 查询条件 2.1.2 动态 SQL 2.1.3 测试 2.2 在 UPD ...
随机推荐
- 构造器注入和 setter 依赖注入,那种方式更好?
每种方式都有它的缺点和优点.构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖.如果使用 XML 来描述依赖, Setter 注入的可读写会更强.经验法则是强制 ...
- IIS在ASP.NET Core下的两种部署模式
KestrelServer最大的优势体现在它的跨平台的能力,如果ASP.NET CORE应用只需要部署在Windows环境下,IIS也是不错的选择.ASP.NET CORE应用针对IIS具有两种部署模 ...
- css布局中左侧固定右侧自适应
float 单一层浮动法左侧固定成100px; 则核心代码 左侧:width:100px;float:left; 右侧 width:auto;margin-left:100px;绝大浏览器是没有任何问 ...
- jq easyui数据网络的分页过程
第一次写技术方面的文章,有点忐忑,总怕自己讲的不对误导别人.但是万事总有个开头,有不足错误之处,请各位读者老爷指出. 言归正传,最近刚进新公司,上头要求我先熟悉熟悉easyui这个组件库.在涉及到da ...
- html和css常见的一些问题总结
html 标签 一般在html有块级元素和行级元素,主要的块级元素有 div,p,h1-h6,ul,ol,li,dl,dt,dd,table,tr,th,td,有好记的办法,div,p,显示标题的,列 ...
- javascript 判断变量是否是数组(Array)
过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意...这个懊恼的行为,今天的文章跟大家分享下:javascript如何判断便是是数组. 1. ...
- H5的audio在ios系统的微信上不能自动播放的问题
前几天有个需求,要在H5页面中添加背景音乐,本以为很easy,却也踩了一些坑,废话不多说,进入正题: 撸完代码测试的时候才发现在安卓手机上背景音乐可以正常播放,但在iphone里的微信和safari中 ...
- 【uniapp 开发】智能温控开关 (环状图)
index.vue <template> <view> <view class="qiun-columns"> <uCharts id=& ...
- C语言,最大公约数---更相减损术
// 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...
- QT的MYSQL驱动库编译
QT的MYSQL驱动库编译 需要准备QT的源码Src,此次编译64位 在QTCreator中打开mysql.pro 修改两个pro 文件,下图为改好 1.mysql.pro TARGET = qsql ...