Mybatis进阶(动态SQL)

ops/2024/10/18 22:25:24/

文章目录

    • 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
mybatisconfigxml_102">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.ppmy.cn/ops/26892.html

相关文章

C++协程库封装

操作系统&#xff1a;ubuntu20.04LTS 头文件&#xff1a;<ucontext.h> 什么是协程 协程可以看作轻量级线程&#xff0c;相比于线程&#xff0c;协程的调度完全由用户控制。可以理解为程序员可以暂停执行或恢复执行的函数。将每个线程看作是一个子程序&#xff0c;或者…

2024年五一数学建模竞赛赛题浅析-助攻快速选题

题目 复杂性 技术需求 数据处理需求 主要难点 综合评估 A题 高 优化算法、图论、启发式搜索 几何数据解析和路径计算 设计有效的路径优化算法来最小化空程&#xff0c;处理几何布局的复杂性 2 B题 非常高 网络流优化、线性/非线性规划 大规模网络数据处理和流量…

PHP算命源码_最新测算塔罗源码_可以运营

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的&#xff0c;后端PHP&#xff0c;带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…

实验八智能手机互联网程序设计(微信程序方向)实验报告

请在上一次实验的基础之上完成“手机快速注册”页面、“企业用户注册”页面&#xff0c;并实现点击手机快速注册和企业用户注册后转跳至该页面在“手机快速注册”页面&#xff0c;输入框内输入内容并失去焦点后&#xff0c;下方的按钮会变化 在企业用户注册页面&#xff0c;用户…

MyBatis(XML映射器操作)

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

民航电子数据库:mysql与caedb(select语法差异)

目录 前言语法差异 前言 本篇记录mysql与民航电子数据库select语句的语法差异 语法差异 1、cae&#xff1a;date_add(date, INTERVAL num HOUR)函数中"num"不能为字段&#xff0c;只能是数值2、cae&#xff1a;date_add()函数中不能再使用函数或运算表达式&#xff…

使用Mybatis映射时间 DateTime ==> LocalDateTime

首先查看&#xff0c;数据库字段&#xff1a; 书写映射实体类对象VO&#xff1a; Data public class OrderListVO implements Serializable {private Integer orderId;private String memberName;private String orderNumber;private BigDecimal orderPrice;private String l…

Vue 3项目的基本结构

使用代码&#xff1a;npm create vitelatest创建vue项目 Vue 3项目的基本结构遵循Vue CLI创建的项目结构&#xff0c;或者使用Vite创建的项目结构。 以下是一个典型的Vue 3项目结构的概述&#xff1a; my-vue3-project/ ├── node_modules/ # 项目依赖 ├── p…