Mybatis进阶(动态SQL)

文章目录

    • 1.动态SQL
        • 1.基本介绍
          • 1.为什么需要动态SQL
          • 2.基本说明
          • 3.动态SQL常用标签
        • 2.环境搭建
          • 1.新建子模块
          • 2.删除不必要的两个文件夹
          • 3.创建基本结构
          • 4.父模块的pom.xml
          • 5.jdbc.properties
          • 6.mybatis-config.xml
          • 7.MyBatisUtils.java
          • 8.MonsterMapper.java
          • 9.MonsterMapper.xml
          • 10.测试MonsterMapperTest.java
        • 3.动态SQL-if标签
          • 1.需求分析
          • 2.MonsterMapper.java添加@Param注解
          • 3.MonsterMapper.xml
          • 4.测试
        • 4.动态SQL-where标签
          • 1.需求分析
          • 2.MonsterMapper.java添加方法
          • 3.MonsterMapper.xml添加实现类
          • 4.测试
        • 5.动态SQL-choose标签
          • 1.需求分析
          • 2.MonsterMapper.java添加方法
          • 3.MonsterMapper.xml添加实现类
          • 4.测试
        • 6.动态SQL-foreach标签
          • 1.需求分析
          • 2.MonsterMapper.java添加方法
          • 3.MonsterMapper.xml添加实现类
          • 4.测试
        • 7.动态SQL-set标签(重点)
          • 1.需求分析
          • 2. MonsterMapper.java添加方法
          • 3.MonsterMapper.xml
          • 4.测试

1.动态SQL

1.基本介绍
1.为什么需要动态SQL

image-20240304161024014

2.基本说明

image-20240304161328438

3.动态SQL常用标签

image-20240304161355168

2.环境搭建
1.新建子模块

image-20240304161536794

2.删除不必要的两个文件夹

image-20240304161639688

3.创建基本结构

image-20240304162428796

4.父模块的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>mybatis</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><name>Archetype - mybatis</name><url>http://maven.apache.org</url><modules><module>mybatis_quickstart</module><module>xml-mapper</module><module>dynamic-sql</module></modules><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!--如果设置scope为test,则只能在test包下使用--><scope>test</scope></dependency></dependencies><!--在父模块中的pom.xml文件中配置在build的时候要扫描的文件,解决某些类型文件拷贝到target目录失败的问题--><build><resources><resource><directory>src/main/java</directory><includes><!--在java文件夹下的多级目录下的xml文件--><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><!--在resources文件夹下的多级目录下的xml文件和properties文件--><include>**/*.xml</include><include>**/*.properties</include></includes></resource></resources></build>
</project>
5.jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
6.mybatis-config.xml
  • 配置com.sun.entity的类型别名
  • 引入com.sun.mapper里的Mapper.xml文件或者带注解的类
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--引入外部文件jdbc.properties--><properties resource="jdbc.properties"/><!--配置mybatis自带的日志,settings需要放到最前面--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--配置类型别名--><typeAliases><!--方式二:这样配置完了在这个包下的所有类都可以直接使用类名表示--><package name="com.sun.entity"/></typeAliases><environments default="development"><environment id="development"><!--配置事务管理器--><transactionManager type="JDBC"/><!--配置数据源--><dataSource type="POOLED"><!--配置驱动--><property name="driver" value="${jdbc.driver}"/><!--配置连接url--><!--1.jdbc:mysql:协议2.127.0.0.1:3306:指定连接mysql的ip+端口3.mybatis:连接的db4.useSSL:使用安全连接5.&amp;:表示&6.useUnicode=true:使用unicode,防止编码错误7.characterEncoding=UTF-8:字符集使用utf-8--><property name="url" value="${jdbc.url}"/><!--用户名--><property name="username" value="${jdbc.username}"/><!--密码--><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><!--包的方式引入含有Mapper.xml文件的类--><package name="com.sun.mapper"/></mappers></configuration>
7.MyBatisUtils.java
package com.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** @author 孙显圣* @version 1.0*/
public class MyBatisUtils {private static SqlSessionFactory sqlSessionFactory;//使用静态代码块初始化SqlSessionFactorystatic {try {//获取Mybatis配置文件的输入流String resource = "mybatis-config.xml";//默认是从类路径下获取资源,在maven中指的就是resources文件夹下,会映射到实际的工作目录InputStream resourceAsStream = Resources.getResourceAsStream(resource);//读取资源获取SessionFactory,可以理解为连接池sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {throw new RuntimeException(e);}}//编写方法返回SqlSessionpublic static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}
8.MonsterMapper.java
package com.sun.mapper;/*** 这个接口用于声明操作monster表的方法** @author 孙显圣* @version 1.0*/
public interface MonsterMapper {}
9.MonsterMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.MonsterMapper"></mapper>
10.测试MonsterMapperTest.java
package com.sun.mapper;import com.sun.entity.Monster;
import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author 孙显圣* @version 1.0*/
public class MonsterMapperTest {//两个属性private SqlSession sqlSession; //相当于连接private MonsterMapper monsterMapper;//编写方法完成初始化@Before //标注了Before之后表示了在执行目标测试方法前会执行该方法public void init() {//获取到sqlSessionsqlSession = MyBatisUtils.getSqlSession();//获取到MonsterMapper对象monsterMapper = sqlSession.getMapper(MonsterMapper.class);System.out.println(monsterMapper.getClass());}@Testpublic void test() {System.out.println("ttt");}}

image-20240304163252656

3.动态SQL-if标签
1.需求分析

image-20240304163531716

2.MonsterMapper.java添加@Param注解
package com.sun.mapper;import com.sun.entity.Monster;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** 这个接口用于声明操作monster表的方法** @author 孙显圣* @version 1.0*/
public interface MonsterMapper {//使用@Param("age")注解来使得动态sql的test域可以取出这个agepublic List<Monster> findMonsterByAge(@Param("age") Integer age);
}
3.MonsterMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.MonsterMapper"><!--public List<Monster> findMonsterByAge(Integer age);要求:当用户输入的值不大于0则输出所有妖怪--><select id="findMonsterByAge" resultType="Monster" parameterType="Integer">select * from monster where 1 = 1<!--这里的age是在参数中使用@Param注解取出的--><if test="age >= 0">and age > #{age}</if></select>
</mapper>
4.测试
    @Testpublic void findMonsterByAge() {List<Monster> list = monsterMapper.findMonsterByAge(10);for (Monster monster : list) {System.out.println(monster);}//关闭sqlsessionif (sqlSession != null) {sqlSession.close();}}
4.动态SQL-where标签
1.需求分析

image-20240304171800511

2.MonsterMapper.java添加方法
    public List<Monster> findMonsterByIdAndName(Monster monster);
3.MonsterMapper.xml添加实现类
    <!--public List<Monster> findMonsterByIdAndName(Monster monster);1.id小于0则不拼接,名字为空也不拼接2.where标签会自动清除没用的and3.如果传入的是对象,就不用使用@Param--><select id="findMonsterByIdAndName" resultType="Monster" parameterType="Monster">SELECT * FROM monster<where><if test="id >= 0">and id > #{id}</if><if test="name != null and name != ''">and `name` = #{name}</if></where></select>
4.测试
    @Testpublic void findMonsterByIdAndName() {Monster monster = new Monster();monster.setId(4);monster.setName("牛魔王");List<Monster> monsters = monsterMapper.findMonsterByIdAndName(monster);for (Monster monster1 : monsters) {System.out.println(monster1);}//关闭sqlsessionif (sqlSession != null) {sqlSession.close();}}

image-20240304185503494

5.动态SQL-choose标签
1.需求分析

当name不为空和id>0的时候有不同的操作

2.MonsterMapper.java添加方法
    public List<Monster> findMonsterByIdOrName_choose(Map<String, Object> map);
3.MonsterMapper.xml添加实现类
<!--    public List<Monster> findMonsterByIdOrName_choose(Map<String, Object> map);--><select id="findMonsterByIdOrName_choose" parameterType="map" resultType="Monster">select * from `monster`<choose><when test="name != null and name != ''">where `name` = #{name}</when><when test="id > 0">where `id` = #{id}</when><otherwise>where `salary` > 100</otherwise></choose></select>
4.测试
    @Testpublic void findMonsterByIdOrName_choose() {Map<String, Object> map = new HashMap<String, Object>();map.put("id", 2);map.put("name", "");List<Monster> list = monsterMapper.findMonsterByIdOrName_choose(map);for (Monster monster : list) {System.out.println(monster);}}
6.动态SQL-foreach标签
1.需求分析

查询id为1,2,3的妖怪

2.MonsterMapper.java添加方法
public List<Monster> findMonsterById_forEach(Map<String, Object> map);
3.MonsterMapper.xml添加实现类
    <select id="findMonsterById_forEach" parameterType="map" resultType="Monster">select * from `monster`<if test="ids != null and ids != ''"><where>id in<!--map中传入一个ids集合为[1,2,3]目标:id in (1,2,3)collection:要遍历的集合item:遍历的数据项open:开始标志close:结束标志separator:数据间隔--><foreach collection="ids" item="id" open="(" separator="," close=")"><!--  这里取出的是item里的id-->#{id}</foreach></where></if></select>
4.测试
    @Testpublic void findMonsterById_forEach() {Map<String, Object> map = new HashMap<String, Object>();List<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(2);ids.add(3);//添加一个集合key为idsList<Monster> list = monsterMapper.findMonsterById_forEach(map);for (Monster monster : list) {System.out.println(monster);}}
7.动态SQL-set标签(重点)
1.需求分析

image-20240305144952009

2. MonsterMapper.java添加方法
    public void updateMonster_set(Map<String, Object> map);
3.MonsterMapper.xml
    <!--根据id来对表进行修改,如果没有传值则不修改那个字段--><!--public void updateMonster_set(Map<String, Object> map);--><!--UPDATE monster , birthday = '2020-1-2', email = 'libai@qq.com', gender = 1, name = '李白', salary = 12.2 WHERE id = 3--><update id="updateMonster_set" parameterType="map">UPDATE monster<set><if test="age != null and age != ''">age = #{age},</if><if test="birthday != null and birthday != ''">birthday = #{birthday},</if><if test="gender != null and gender != ''">gender = #{gender},</if><if test="name != null and name != ''">name = #{name},</if><if test="salary != null and salary != ''">salary = #{salary},</if><if test="salary != null and salary != ''">salary = #{salary},</if></set>where id = #{id}</update>
4.测试
    @Testpublic void updateMonster_set() {Map<String, Object> map = new HashMap<String, Object>();map.put("id", 3);map.put("age", 22);map.put("gender", 1);monsterMapper.updateMonster_set(map);}

image-20240305160803238

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】力扣 239. 滑动窗口最大值

题干描述 给你一个整数数组 nums&#xff0c;有一个大小为 k **的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a; nums [1,3,-1,-3,5,3…

C++ 多态详解

文章目录 1. 多态的概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.3.1 虚函数重写的两个例外 2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 多态的原理3.1 虚函数表3.2多态的原理 4. 单继承和多继承关系的虚函数表4.1 单继…

OBSERVER(观察者)-- 对象行为模式

意图&#xff1a; 定义对象间地一种一对多地依赖关系&#xff0c;当一个对象地状态发生改变时&#xff0c;所有对于依赖于它的对象都得到通知并被自动更新。 别名&#xff1a; 依赖(Dependents), 发布-订阅(Publish-Subsribe) 动机&#xff1a; 将一个系统分割成一系列相互协…

【webrtc】MessageHandler 9: 基于线程的消息处理:执行Port销毁自己

Port::Port 构造的时候,就触发了一个异步操作,但是这个操作是要在 thread 里执行的,因此要通过post 消息 MSG_DESTROY_IF_DEAD 到thread跑:port的创建并米有要求在thread中 但是port的析构却在thread里 这是为啥呢?

C++--const成员及const取地址操作符重载

前言 今天我们来了解一下const成员的基本使用,以及const取地址重载的运用 来开始今天的学习 const成员 1.基本定义, 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数 隐含的*this指针&#xff0c;表明在该成员函…

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

Object类的公共方法面试问题及回答

1. 什么是 Object 类&#xff1f; 答&#xff1a; Object 类是 Java 中所有类的超类。每个类都使用 Object 作为树的根&#xff0c;所有对象&#xff08;包括数组&#xff09;都实现这个类的方法。 2. Object 类中有哪些重要的方法&#xff1f; 答&#xff1a; equals(Obje…

GPT3 终极指南(二)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第五章&#xff1a;GPT-3 作为企业创新的下一步 当一个新的创新或技术转变发生时&#xff0c;大公司通常是最后一个采纳的。它们的等级结构…

【学习vue 3.x】(五)VueRouter路由与Vuex状态管理

文章目录 章节介绍本章学习目标 路由的基本搭建与嵌套路由模式vue路由的搭建嵌套路由模式 动态路由模式与编程式路由模式动态路由模式编程式路由 命名路由与命名视图与路由元信息命名路由命名视图路由元信息 路由传递参数的多种方式及应用场景路由传参 详解route对象与router对…

【数学视野】Softmax 函数和 Gibbs 分布之间的数学桥梁

Softmax 函数和 Gibbs 分布之间的数学桥梁 文章目录 一、说明二、Softmax 函数的定义和组件三、从逻辑到多类的泛化3.1 连接到 Gibbs 分布3.2 统计力学背景3.3 切换到 Softmax 功能 四、优化和计算稳定性4.1 Softmax 的梯度4.2 链接到信息论 五、总结 一、说明 softmax 函数是各…

瘦身秘籍:如何使用 PyInstaller 打造超小型 Python 可执行文件

你是否曾经尝试过将你的 Python 程序打包成一个可执行文件&#xff0c;却发现生成的文件大得惊人&#xff1f;别担心&#xff0c;本文将教你如何使用 PyInstaller 尽可能减小生成的 onefile 大小&#xff0c;让你的程序轻盈如风&#xff01; 1. 使用虚拟环境 首先&#xff0c…

MyBatis(XML映射器操作)

文章目录 XML映射器操作&#xff08;XxxMapper.xml&#xff09;文件目录1.基本介绍1.优点2.常用顶级元素 2.环境配置1.在原来的父模块下创建一个子模块2.删除没用的两个文件夹3.创建基本目录4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.测试使用MonsterMapperTes…