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&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-Plushttps://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.51. 只有TIMESTAMP⽀持⾃动更新2. ⼀个表只能有⼀列设置⾃动更新3. 不允许同时存在两个列, 其中⼀列设置了DEFAULT CURRENT_TIMESTAMP, 另⼀个设置了ONUPDATE CURRENT_TIMESTAMPMySQL >=5.6.51. TIMESTAMP 和DATETIME都⽀持⾃动更新,且可以有多列
2)引⼊MyBatis 和 MySQL驱动依赖
3)数据库配置
4)准备前端代码
前端代码要严格注意字符和格式!
5)编写后端代码
此处使用注解的方法编写SQL
MessageInfo
MessageInfoMapper
MessageInfoService
MessageInfoController
6)测试
接口:127.0.0.1:8080/messagewall.html
祝你也能找到自己爱的人!