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 文件 ...
随机推荐
- (六)mybatis-spring集成完整版
mybatis-spring集成完整版 一.项目整体 mybatis接口层.mapper层 Service层 Test调用测试 二.自动生成代码-mybatis generator 主要修改: 接口. ...
- 在C代码调用C++代码
由于历史原因,以及不同开发人员的技术偏好,C语言和C++语言都有一些独有的非常有价值的项目,因而两种语言的互操作,充分利用前人造的轮子是一件非常有价值的事情. C++代码调用C代码很简单,只要分别在包 ...
- 4-CSS规范
4.1 命名规范:4.1.1 css文件命名 reset.css 重置样式,重置元素默认样式,使得页面在所有浏览器中有统一的外观 global.css 全局样式,全站公用,定义页面基础样式(常见的公共 ...
- react和vue
react整体的思路就是函数式,所以推崇纯组件,数据不可变,单向数据流,当然需要双向的地方也可以做到,比如结合redux-form,而vue是基于可变数据的,支持双向绑定.react组件的扩展一般是通 ...
- 将项目导入myeclipse后 tortoise svn 右键项目不能更新和提交
使用 tortoise svn客户端将svn服务器上的项目checkout之后正常,可以更新也可以提交:当将这个项目导入MyEclipse之后,不能更新和提交了只出现svn升级工作副本这一字样:网上搜 ...
- Java8-19-lambda 重构代码
通过本书的前七章,我们了解了Lambda和Stream API的强大威力. 你可能主要在新项目的代码中使用这些特性.如果你创建的是全新的Java项目,这是极好的时机,你可以轻装上阵,迅速地将新特性应用 ...
- jquery关于checkbox复选框是否被选中的问题
本人在项目中需要用到,判断哪些复选框被用户选中.自然而然想到用 if($('').attr('checked') == true) 但是不管有没有选,$('').attr('checked')返回的都 ...
- springboot java web开发工程师效率
基础好工具 idea iterm2 和 oh-my-zsh git 热加载 java web项目每次重启时间成本太大. 编程有一个过程很重要, 就是试验, 在一次次试验中探索, 积累素材优化调整程序模 ...
- Spring编译后没有xml配置文件解决方法
问题描述 在使用Maven来构建Spring项目的时候,使用下面代码来读取Spring配置文件. ClassPathXmlApplicationContext context = new ClassP ...
- 使用EventBus + Redis发布订阅模式提升业务执行性能
前言 最近一直奔波于面试,面了几家公司的研发.有让我受益颇多的面试经验,也有让我感觉浪费时间的面试经历~因为疫情原因,最近宅在家里也没事,就想着使用Redis配合事件总线去实现下具体的业务. 需求 一 ...