当前位置: 首页 > article >正文

Mybatis02

动态SQL

动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接

<if>标签

填写个人信息或注册账号时,一般需要填写很多信息,其中包括, 必填字段 和 非必填字段 
对于不确定字段的传入,就需 动态标签 来判断了
数据库准备——>
数据库:  mybatis_test                           列:  userinfo

xml 实现: 

       注意:待选项需要有默认值

设置 age:

未设置 age:

注意 test 中的 gender,是传⼊对象中的属性,不是数据库字段

注解 实现: 

把上⾯SQL(包括标签), 使⽤ <script></script> 标签括起来就可以(不太推荐)

标签和注解可以相互替代,但此处使用注解太过麻烦,所以以下省略该方法的演示

<trim>标签

之前的插⼊用户功能,只是有⼀个 gender 字段可能是选填项,如果有 多个字段 ,⼀般考虑使⽤标签结合标签,对多个字段都采取动态⽣成的方式
1)此时可以看到,语句末端带有一个 “)”,并不美观
2)如果只有 username 是必填项,其他项都没填,此时SQL语句是
      insert into userinfo ( username,) values ( #{username},)
      明显可以看到语句中带有一个 “,” ,此时语句不能通过
标签中有如下属性:
•  prefix:表示整个语句块,以prefix的值作为前缀
suffix:表示整个语句块,以suffix的值作为后缀
prefixOverrides:表示整个语句块要去除掉的前缀
suffixOverrides:表示整个语句块要去除掉的后缀
在以上 sql 动态解析时,会将第⼀个 部分做如下处理:
基于 prefix 配置,开始部分加上 “(”
基于 suffix 配置,结束部分加上  “)”
多个 组织的语句都以  “,”     结尾,在最后拼接好的字符串还会以 “,”   结尾,会基于 suffixOverrides 配置去掉最后⼀个   “,”
注意 <if test="username !=null"> 中的 username 是传⼊对象的属性

<where>标签

系统会根据我们的筛选条件, 动态组装where 条件

根据属性做where条件查询,⽤⼾对象中属性不为 null 的,都为查询条件
<where> 只会在⼦元素有内容的情况下才插⼊where⼦句,⽽且会⾃动去除⼦句的开头的AND或OR
以上标签也可以使⽤ <trim prefix="where" prefixOverrides="and"> 替换, 但是此种
情况下, 当⼦元素都没有内容时, where关键字也会保留
以下是一种不太正式的写法:

<set>标签

根据传⼊的⽤⼾对象属性来更新⽤⼾数据,可以使⽤标签来指定动态内容

<set> :动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号. (⽤于update语句中)
以上标签也可以使⽤ <trim prefix="set" suffixOverrides=","> 替换

<foreach>标签

对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
item:遍历时的每⼀个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
根据多个 id ,删除用户数据:

<include>标签

在xml映射⽂件中配置的SQL,有时可能会存在很多重复的⽚段,此时就会存在很多冗余的代码
我们可以对重复的代码⽚段进⾏抽取,将其通过 <sql> 标签封装到⼀个SQL⽚段,然后再通过
<include> 标签进⾏引⽤——>
<sql> :定义可重⽤的SQL⽚段
<include> :通过属性 refid ,指定包含的SQL⽚段

使用插件生成 XML

1)引入插件

<plugin>
   <groupId>org.mybatis.generator</groupId>
   <artifactId>mybatis-generator-maven-plugin</artifactId>
   <version>1.3.5</version>
   <configuration>
      <!--generator配置⽂件所在位置-->
      <configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
      <overwrite>true</overwrite>
      <verbose>true</verbose>
   </configuration>
   <dependencies>
      <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>8.0.33</version>
      </dependency>
   </dependencies>
</plugin>

该插件通常在项目初始化的时候使用

如果指定生成文件的目录,生成的代码会覆盖之前的代码

2)添加generator.xml并修改

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置⽣成器 -->
<generatorConfiguration>
    <!-- ⼀个数据库⼀个context -->
    <context id="MysqlTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!--去除注释-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--数据库链接信息-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/java_blog_spring?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"
                        userId="root"
                        password="root">
        </jdbcConnection>
        <!-- ⽣成实体类 -->
        <javaModelGenerator targetPackage="com.example.demo.model" targetProject="src/main/java" >
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- ⽣成mapxml⽂件 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources" >
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- ⽣成mapxml对应client,也就是接⼝dao -->
        <javaClientGenerator targetPackage="com.example.demo.mapper" targetProject="src/main/java" type="XMLMAPPER" >
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- table可以有多个,每个数据库中的表都可以写⼀个table,tableName表示要匹
       配的数据库表,也可以在tableName属性中通过使⽤%通配符来匹配所有数据库表,只有匹配的表才会
       ⾃动⽣成⽂件 -->
        <table tableName="user">
            <property name="useActualColumnNames" value="false" />
            <!-- 数据库表主键 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true"
            />
        </table>
    </context>
</generatorConfiguration>

3)⽣成⽂件

Mybatis-Plus

简介 | MyBatis-Plusicon-default.png?t=O83Ahttps://baomidou.com/introduce/1)引入依赖

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
   <version>3.5.5</version>
</dependency>

2)配置SQL

#数据库连接配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver

3)编码

此时可以看到 Mybatis-Plus 提供的方法

表白墙

1)数据准备

create database crush;
use crush;
DROP TABLE IF EXISTS message_info;
 CREATE TABLE `message_info` (
 `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
 `from` VARCHAR ( 127 ) NOT NULL,
 `to` VARCHAR ( 127 ) NOT NULL,
 `message` VARCHAR ( 256 ) NOT NULL,
 `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
 `create_time` DATETIME DEFAULT now(),
 `update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
ON UPDATE now(): 当数据发⽣更新操作时, ⾃动把该列的值设置为now(),
now() 可以替换成其他获取时间的标识符, ⽐如: CURRENT_TIMESTAMP(), LOCALTIME()等
MySQL <5.6.5
1. 只有TIMESTAMP⽀持⾃动更新
2. ⼀个表只能有⼀列设置⾃动更新
3. 不允许同时存在两个列, 其中⼀列设置了DEFAULT CURRENT_TIMESTAMP, 另⼀个设置了ON
UPDATE CURRENT_TIMESTAMP
MySQL >=5.6.5
1. TIMESTAMP 和DATETIME都⽀持⾃动更新,且可以有多列

2)引⼊MyBatis 和 MySQL驱动依赖

3)数据库配置

4)准备前端代码

前端代码要严格注意字符和格式!

5)编写后端代码

此处使用注解的方法编写SQL

MessageInfo

 

MessageInfoMapper

MessageInfoService

 MessageInfoController

6)测试

接口:127.0.0.1:8080/messagewall.html

祝你也能找到自己爱的人!


http://www.kler.cn/a/465551.html

相关文章:

  • Linux驱动开发(18):linux驱动并发与竞态
  • 对计网大题的一些指正(中间介绍一下CDM的原理和应用)
  • Python 数据结构揭秘:栈与队列
  • 力扣--494.目标和
  • 现代光学基础6
  • 软考 高级 架构师 第十 章软件工程3
  • 保护网站日常安全,网站监测能提供哪方面的帮助
  • 【剑指Offer刷题系列】判断对称二叉树
  • MySQL图形化界面工具--DataGrip
  • 高效自携式潜水装备,助力水下探索|鼎跃安全
  • windows C#-使用委托
  • 目标检测初始
  • 写好Prompt的一些原则总结
  • 【pytorch】现代循环神经网络-2
  • flutter 专题二十七 Flutter自动路由插件auto_route详解
  • 如何在 VSCode 中配置 C++ 开发环境:详细教程
  • Flutter Android修改应用名称、应用图片、应用启动画面
  • Redis Cluster集群模式
  • Java Web开发基础——Java Web项目的结构与组织
  • MCU+可编程逻辑:从Microchip、TI C2000到AG32
  • 使用 Docker 安装 Redis
  • 【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析
  • 大数据-267 实时数仓 - ODS Lambda架构 Kappa架构 核心思想
  • cesium小知识:Geocoder 详解示例
  • Predicting Human Scanpaths in Visual Question Answering
  • JMeter + Grafana +InfluxDB性能监控 (一)