MyBatis框架——动态SQL
MyBatis 作为⼀个“半⾃动化”的 ORM 框架,需要开发者⼿动定义 SQL 语句。
在业务需求⽐较复杂的情 况下,⼿动拼接 SQL 语句的⼯作量会⾮常⼤,为了适⽤于不同的业务需求,往往需要做很多重复性的⼯作,这种⼯作对于开发者来讲⽐较耗费时间,同时也容易出错。
此时可以使用MyBatis框架提供的动态拼接SQL,不同条件查询时,可以复用同一条SQL语句。
示例:定义一个方法,通过某些(部分)属性来查询User对象
1、定义实体类User
package com.sunjian.entity; import java.util.List; /** * @author sunjian * @date 2020/3/22 9:59 */ public class User { private Integer id; private String username; private String password; private Integer age; private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + username + '\'' + ", password='" + password + '\'' + ", age=" + age + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
2、创建UserRepositoryDynamicSQL接口
package com.sunjian.repository; import com.sunjian.entity.User; import java.util.List; /** * @author sunjian * @date 2020/3/22 10:44 */ public interface UserRepositoryDynamicSQL { public User findUserByUser(User user); public void updateUser(User user); public List<User> findAllByUser(User user); }
3、创建UserRepositoryDynamicSQL.xml文件,编写查询SQL
<?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.sunjian.repository.UserRepositoryDynamicSQL"> <!-- if --> <!--<select id="findUserByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User">--> <!--select * from t_user--> <!--<where>--> <!--<if test="id != null">--> <!--id = #{id}--> <!--</if>--> <!--<if test="username != null">--> <!--and username = #{username}--> <!--</if>--> <!--<if test="password != null">--> <!--and password = #{password}--> <!--</if>--> <!--<if test="age != null">--> <!--and age = #{age}--> <!--</if>--> <!--</where>--> <!--</select>--> <!-- choose when --> <!--<select id="findUserByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User">--> <!--select * from t_user--> <!--<where>--> <!--<choose>--> <!--<when test="id != null">--> <!--id = #{id}--> <!--</when>--> <!--<when test="username != null">--> <!--and username = #{username}--> <!--</when>--> <!--<when test="password != null">--> <!--and password = #{password}--> <!--</when>--> <!--<when test="age != null">--> <!--and age = #{age}--> <!--</when>--> <!--</choose>--> <!--</where>--> <!--</select>--> <!-- trim --> <select id="findUserByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User"> select * from t_user <trim prefix="where" prefixOverrides="and"> <if test="id != null"> id = #{id} </if> <if test="username != null"> and username = #{username} </if> <if test="password != null"> and password = #{password} </if> <if test="age != null"> and age = #{age} </if> </trim> </select> <!-- set --> <update id="updateUser" parameterType="com.sunjian.entity.User"> update t_user <set> <if test="id != null"> id = #{id}, </if> <if test="username != null"> username = #{username}, </if> <if test="password != null"> password = #{password}, </if> <if test="age != null"> age = #{age} </if> </set> where id = #{id} </update> <!-- foreach --> <select id="findAllByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User"> select * from t_user <where> <foreach collection="ids" item="id" open="id in (" close=")" separator=","> #{id} </foreach> </where> </select> </mapper>
4、创建全局config.xml,注册UserRepository.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 打印SQL语句 --> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 开启延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"></setting> </settings> <!-- 配置 MyBatis 数据源 --> <environments default="development"> <environment id="development"> <!-- JDBC事务管理 --> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 注册 --> <mappers> <mapper resource="com/sunjian/repository/UserRepositoryDynamicSQL.xml"></mapper> </mappers> </configuration>
5、创建测试类,执行查询
package com.sunjian.test; import com.sunjian.entity.Order; import com.sunjian.entity.User; import com.sunjian.repository.OrderRepository; import com.sunjian.repository.UserRepositoryDynamicSQL; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * @author sunjian * @date 2020/3/22 10:20 */ public class TestDynamicSQL { public static void main(String[] args) { // Mapper 代理实现自定义接口 InputStream inputStream = User.class.getClassLoader().getResourceAsStream("config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取接口的处理对象 UserRepositoryDynamicSQL userRepositoryDynamicSQL = sqlSession.getMapper(UserRepositoryDynamicSQL.class); User user = new User(); user.setUsername("张三"); user.setPassword("321"); User user1 = userRepositoryDynamicSQL.findUserByUser(user); System.out.println(user1); User u = new User(); u.setId(2); u.setUsername("张三三"); u.setPassword("123"); userRepositoryDynamicSQL.updateUser(u); sqlSession.commit(); User user2 = userRepositoryDynamicSQL.findUserByUser(u); System.out.println(user2); List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(6); User u2 = new User(); u2.setIds(list); List<User> users = userRepositoryDynamicSQL.findAllByUser(u2); for(User us:users){ System.out.println(us); } } }
Opening JDBC Connection Created connection 1846406218. Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6e0dec4a] ==> Preparing: select * from t_user where age = ? ==> Parameters: 33(Integer) <== Columns: id, username, password, age <== Row: 2, 张三三, 123, 33 <== Total: 1 User{id=2, name='张三三', password='123', age=33} ==> Preparing: update t_user SET id = ?, username = ?, password = ? where id = ? ==> Parameters: 2(Integer), 张三三(String), 123(String), 2(Integer) <== Updates: 1 Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6e0dec4a] ==> Preparing: select * from t_user where id = ? and username = ? and password = ? ==> Parameters: 2(Integer), 张三三(String), 123(String) <== Columns: id, username, password, age <== Row: 2, 张三三, 123, 33 <== Total: 1 User{id=2, name='张三三', password='123', age=33} ==> Preparing: select * from t_user WHERE id in ( ? , ? , ? ) ==> Parameters: 1(Integer), 2(Integer), 6(Integer) <== Columns: id, username, password, age <== Row: 1, 张, 123, 88 <== Row: 2, 张三三, 123, 33 <== Row: 6, 张三, 123, 19 <== Total: 3 User{id=1, name='张', password='123', age=88} User{id=2, name='张三三', password='123', age=33} User{id=6, name='张三', password='123', age=19}
OK.
MyBatis框架——动态SQL的更多相关文章
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- java Mybatis框架动态SQL
1.if+where <select id="getgoods" resultType="Goods" > select * from goods ...
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- mybatis中的.xml文件总结——mybatis的动态sql
resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...
- MyBatis的动态SQL详解-各种标签使用
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...
- Java-MyBatis:MyBatis 3 动态 SQL
ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...
- JavaWeb_(Mybatis框架)动态sql_七
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
随机推荐
- git clone 新项目时,报error: RPC failed; curl 18 transfer closed with outstanding read data remaining
error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote en ...
- 良知VS野心,苹果为何要翻新手机?
前不久,苹果在大中华区推出了iPhone和iPad换机服务,消息一经发出便引发了果粉们的狂欢,那些丢弃在抽屉里的iPhone4S们看上去终于有着落了,也更坚定了"我是果粉,我骄傲" ...
- js中判断为false的情况
document.write((new Boolean())+"<br />"); document.write((new Boolean(" ...
- CentOS7用yum安装wget命令后仍然提示命令找不到的解决方法
需求:用的AWS实例自带的CentOS7用yum安装wget命令后扔提示命令找不到,后面用源码安装方式解决,下面先讲解决方法,疑问及知识点扩展最后写出 1.问题(因是mini版本系统,有些基本命令扔需 ...
- 自动化移动安全渗透测试框架:Mobile Security Framework
自动化移动安全渗透测试框架:Mobile Security Framework 译/Sphinx 测试开发社区 7月3日 Mobile Security Framework (移动安全框架) 是一 ...
- 手把手教你利用Jenkins持续集成iOS项目
前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段.用户们都是很挑剔的.如果一个公司的推广团队好不容易砸了重金推广了一个APP,好不容易有了一些用户,由于一次线上的bug导致一 ...
- CSRF之POST
最近重温<白帽子讲web安全>一书,看到第4章CSRF的时候,发现有个错误的地方,第116页底部的代码中有个坑,那段代码是运行不了的.原因是在form表单中有个<input type ...
- SQL语句中in not in exits not exits用法比较
exists (sql 如果返回结果集为真) not exists (sql 如果没有返回结果集为真) 如下: 表A ID NAME 1 A1 2 A2 3 A3 表B ID AID NAME 1 1 ...
- 难住了同事:Java 方法调用到底是传值还是传引用
Java 方法调用中的参数是值传递还是引用传递呢?相信每个做开发的同学都碰到过传这个问题,不光是做 Java 的同学,用 C#.Python 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...
- 【Python3】HTML基础
[web前端]HTML基础 一.BS模式 BS(Browser-Server)模式:顾名思义为浏览器-服务器的意思,对比的话类似我们PC上面浏览器使用的产品即为BS模式产品,例如google doc. ...