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 文件 ...
随机推荐
- 吴裕雄--天生自然 R语言开发学习:聚类分析
#-------------------------------------------------------# # R in Action (2nd ed): Chapter 16 # # Clu ...
- SWUST OJ NBA Finals(0649)
NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128 Descri ...
- 对Java tutorial-examples中hello2核心代码分析
1.在hello2中有两个.java源文件分别是GreetingServlet.Java和ResponseServlet.jva文件主要对以下核心代码做主要分析. String username = ...
- 4-CSS规范
4.1 命名规范:4.1.1 css文件命名 reset.css 重置样式,重置元素默认样式,使得页面在所有浏览器中有统一的外观 global.css 全局样式,全站公用,定义页面基础样式(常见的公共 ...
- 从TP-Link到雷蛇,纷纷入局智能手机业到底想干什么?
"眼看他起朱楼,眼看他宴宾客,眼看他楼塌了",这句形容世态炎凉的话其实与智能手机市场更为相像.诺基亚的辉煌与没落.黑莓的强势与消声无迹.摩托罗拉的数次易手.小米的横空出世与 ...
- charles添加https支持
- RTL8812AU双频无线网卡在ubuntu19和20上的驱动安装
旧爱已去 疫情在家,突然邻居敲门说,我这网上不了,帮下忙呗兄弟:兄弟都叫了,哥就冒回险,口罩扎起,一顿xxxx,原来是路由器没插到wlan口,看他拉网线可怜,就把我台式机上无线网卡送给他了,这就是又送 ...
- iNeuOS工业互联平台,.NETCore开发的视频服务组件iNeuVideo,RTSP转WebSocket
目 录 1. 概述... 2 2. 将来集成到iNeuOS平台演示... 3 3. iNeuVideo结构... 3 4. iNeuVideo部署及 ...
- 从0到1,本地到远程git程序过程
从0到1,本地到远程git程序过程 切记一定要在需要提交代码的文件夹下git init,既是你使用了什么 tortoisegit什么工具,或者你在idea环境下已经add了,但是仍然需要你在当前文件夹 ...
- 造轮子系列(三): 一个简单快速的html虚拟语法树(AST)解析器
前言 虚拟语法树(Abstract Syntax Tree, AST)是解释器/编译器进行语法分析的基础, 也是众多前端编译工具的基础工具, 比如webpack, postcss, less等. 对于 ...