MyBatis实战笔记
一、前言知识介绍
1.ORM框架
对数据库的表和POJO(Plain Ordinary Java Object)Java对象的做映射的框架。常见的有hibernate (ssh)、JPA - Spring Data JPA、mybatis。
2.MyBatis的优点
- 支持自定义 SQL、存储过程以及高级映射
- 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
- 通过简单的 XML 或注解来配置和映射 Java对象 到 数据库中的记录
- 官方学习地址:https://mybatis.org/mybatis-3/
3.底层原理
- 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心
- SqlSessionFactory 的实例通过 SqlSessionFactoryBuilder 获得
- SqlSessionFactoryBuilder 可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例
- 工厂设计模式里面 需要获取SqlSession ,里面提供了在数据库执行 SQL 命令所需的所有方法
二、项目环境搭建
1.创建maven项目
2.相关配置逻辑
具体项目结构
- 在pom.xml中添加相关依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 使用JDBC链接mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
- 创建mybatis配置文件:config.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>
<!--配置数据连接的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/xdclass?useUnicode=true&characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="xdclass.net"/>
</dataSource>
</environment>
</environments>
<!--配置mapper映射文件:VideoMapper.xml-->
<mappers>
<mapper resource="mapper/VideoMapper.xml"/>
</mappers>
</configuration>
- 实现驼峰映射:在该文件中添加映射配置
<!--下划线自动映射驼峰字段,加在文件顶部,即configuration的第一个配置-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
- 存放sql文件,实现增删改查业务:VideoMapper.xml
<?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">
<!--
namespace: 名称空间,一般需要保持全局唯一, 最好是和dao层的java接口一致,
可以映射 sql语句 到对应的方法名称和参数、返回类型
mybatis是使用接口动态代理
-->
<mapper namespace="net.xdclass.online_class.dao.VideoMapper">
<!--
statement sql
id: 当前mapper下需要唯一
resultType : sql查询结果集的封装
-->
<select id="selectById" resultType="net.xdclass.online_class.domain.Video">
select * from video where id = #{video_id}
</select>
</mapper>
-
常用配置可去官方文档:https://mybatis.org/mybatis-3/zh/configuration.html#
parameterType用来指定传入参数的类型,包括基本数据类型和引用数据类型,但最主要的配置是Java自定义对象;
ResultType用来指定返回参数的类型,与传入参数的类型相同。
可以通过在config中配置文件中配置typeAlias实现给类取别名,以简化Java自定义对象的配置。
<!-- 配置别名 -->
<typeAliases>
<package name="net.xdclass.online_class.domain"/>
</typeAliases>
xml文件简化配置
<select id="selectById" resultType="Video">
select * from video where id = #{video_id}
</select>
jdbcType可实现将java类型映射为数据库类型(当字段可为NULL时,才需要指定),指定的是需要映射的数据库类型,注意是指定传入参数的数据类型。
<!--左边字段对应数据库,右边字段对应实体类 -->
set
title = #{title,jdbcType=VARCHAR},
summary = #{summary,jdbcType=VARCHAR},
三、具体业务逻辑实现
1.项目结构
常见的src目录结构
controller 存放控制器;service 存放业务接口;impl 存放业务接口或数据访问接口实现类;
dao 存放数据访问接口;domain 存放实体类;util 存放工具类;config 存放配置
- 创建实体类:Video
package net.xdclass.online_class.domain;
import java.util.Date;
/**
* 视频类
*/
public class Video {
/**
* 主键
*/
private int id;
/**
* 视频标题
*/
private String title;
/**
* 视频详情
*/
private String summary;
/**
*视频封面图
*/
private String coverImg;
/**
* 价格
*/
private int price;
/**
* 创建时间
*/
private Date createTime;
/**
* 评分
*/
private double point;
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getCoverImg() {
return coverImg;
}
public void setCoverImg(String coverImg) {
this.coverImg = coverImg;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public double getPoint() {
return point;
}
public void setPoint(double point) {
this.point = point;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Video{" +
"id=" + id +
", title='" + title + '\'' +
", summary='" + summary + '\'' +
", coverImg='" + coverImg + '\'' +
", price=" + price +
", createTime=" + createTime +
", point=" + point +
'}';
}
}
- 创建数据访问接口:VideoMapper
package net.xdclass.online_class.dao;
import net.xdclass.online_class.domain.Video;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface VideoMapper {
/**
* 根据视频id查找视频对象
* @param videoId
* @return
*/
//@Param注解的作用是给参数取别名,在xml中可以直接使用别名来引用该参数
Video selectById(@Param("video_id") int videoId);
/**
* 查询全部视频列表
* @return
*/
List<Video> selectListByXML();
/**
* 查询全部视频列表
* @return
*/
@Select("select * from video")
List<Video> selectList();
}
- 创建启动类:SqlSessionDemo
2.实现逻辑
sql映射方法有两种,一种是通过编写.xml配置文件来存放sql的查询语句;一种是在dao层接口中,通过注解来直接映射
package net.xdclass.online_class;
import net.xdclass.online_class.dao.VideoMapper;
import net.xdclass.online_class.domain.Video;
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;
import java.util.List;
public class SqlSessionDemo {
public static void main(String [] args) throws IOException {
//配置文件路径
String resouce = "config/mybatis-config.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resouce);
//构建Session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Session
try(SqlSession sqlSession = sqlSessionFactory.openSession(true)){
//获取Mapper接口的实现类对象
VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
//调用方法
Video video = videoMapper.selectById(42);
//通过xml配置文件来实现映射
System.out.println(video.toString());
//通过注解实现映射
List<Video> videoList = videoMapper.selectList();
// List<Video> videoList = videoMapper.selectListByXML();
System.out.println(videoList.toString());
}
}
}
程序执行过程1,通过xml文件来实现映射:首先执行启动类SqlSessionDemo-------->通过session获得mapper接口对象------->调用dao层中mapper接口中的方法selectById------->将传入的id映射到VideoMapper.xml中执行sql语句--------->将结果通过resultType映射成Video实体类型------->打印输出。
程序执行过程2,通过注解来实现映射:首先执行启动类SqlSessionDemo-------->通过session获得mapper接口对象------->调用dao层中mapper接口中的方法selectList------->通过注解实现映射( @Select("select * from video"))------->打印输出。(适用于sql简单,没有过多的表关联)
3.配置打印sql功能
在pom.xml中配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
配置日志输出文件:在resources目录下创建log4j.properties文件
log4j.rootLogger=ERROR, stdout
log4j.logger.net.xdclass=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
4.实现多条件查询
在VideoMapper.xml文件中配置sql查询语句
<select id="selectByPointAndTitleLike" resultType="net.xdclass.online_class.domain.Video">
select * from video where point=#{point} and title like concat('%', #{title},'%')
</select>
在dao层的VideoMapper接口中添加查询方法
//多参数查询:由评分与标题模糊查询
List<Video> selectByPointAndTitleLike(@Param("point") double point,@Param("title") String title);
@Param("指定参数名") 用来为指定的参数起别名。
在启动类SqlSession中调用并打印
//多参数查询
List<Video> videoList1 = videoMapper.selectByPointAndTitleLike(8.7,"HTML");
System.out.println(videoList1.toString());
5.实现新增记录
在VideoMapper.xml中添加sql语句
<!--jdbcType用来防止当参数无取值时,将java类型映射成数据库类型-->
<insert id="add" parameterType="net.xdclass.online_class.domain.Video">
INSERT INTO `video` ( `title`, `summary`, `cover_img`, `price`, `create_time`, `point`)
VALUES
(#{title,jdbcType=VARCHAR},#{summary,jdbcType=VARCHAR},#{coverImg,jdbcType=VARCHAR},#{price,jdbcType=INTEGER},
#{createTime,jdbcType=TIMESTAMP},#{point,jdbcType=DOUBLE});
</insert>
在 VideoMapper接口中添加方法
/**
* 新增一条视频记录
* @param video
* @return
*/
int add(Video video);
在启动类中调用执行
//新增一条视频记录
Video video1 = new Video();
video1.setTitle("java核心技术");
video1.setSummary("java核心技术视频");
video1.setCoverImg("www.xdclass.net/cover.jpg");
video1.setPrice(100);
video1.setPoint(8.8);
System.out.println(videoMapper.add(video1));
System.out.println(video1.toString());//新增成功后会返回主键id
6.批量插入多条记录
通过foreach循环语句来实现
在VideoMapper.xml中添加sql语句
<!--批量插入-->
<insert id="addBatch" parameterType="net.xdclass.online_class.domain.Video" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
INSERT INTO `video` ( `title`, `summary`, `cover_img`, `price`, `create_time`, `point`)
VALUES
<foreach collection="list" item="video" separator=",">
(#{video.title,jdbcType=VARCHAR},#{video.summary,jdbcType=VARCHAR},#{video.coverImg,jdbcType=VARCHAR},
#{video.price,jdbcType=INTEGER},
#{video.createTime,jdbcType=TIMESTAMP},#{video.point,jdbcType=DOUBLE})
</foreach>
</insert>
在 VideoMapper接口中添加方法
/**
* 增加视频信息
* @param list
* @return
* /
int addBatch(List<Video> video);
在启动类中调用批量新增的方法
//批量新增
Video video2 = new Video();
video2.setTitle("python核心技术");
video2.setSummary("python核心技术视频");
video2.setCoverImg("www.xdclass.net/python.jpg");
video2.setPrice(9900);
video2.setPoint(9.0);
Video video3 = new Video();
video3.setTitle("c++核心技术");
video3.setSummary("c++核心技术视频");
video3.setCoverImg("www.xdclass.net/c++.jpg");
video3.setPrice(8800);
video3.setPoint(8.5);
List<Video> videoList2 = new ArrayList<>();//存放要新增的视频对象
videoList2.add(video2);//将视频对象添加到列表中
videoList2.add(video3);
System.out.println(videoMapper.addBatch(videoList2));//调用方法实现批量新增
System.out.println(videoList2.toString());
7.更新语法
建数据库表的语句
CREATE TABLE `video` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(524) DEFAULT NULL COMMENT '视频标题',
`summary` varchar(1026) DEFAULT NULL COMMENT '概述',
`cover_img` varchar(524) DEFAULT NULL COMMENT '封面图',
`price` int(11) DEFAULT NULL COMMENT '价格,分',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`point` double(11,2) DEFAULT '8.70' COMMENT '默认8.7,最高10分',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `video` (`id`, `title`, `summary`, `cover_img`, `price`, `create_time`, `point`)
VALUES
(30,'互联网架构之JAVA虚拟机JVM零基础到高级实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-mawen.png',3980,'2021-06-24 22:14:00',9.10),
(31,'权限框架Shiro+SpringBoot2.x零基础到高级实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Shiro/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Shiro/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-shiro.png',2980,'2021-06-24 22:14:00',8.90),
(32,'新版Maven3.5+Nexus私服搭建全套核心技术','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-mawen.png',1980,'2021-03-04 22:14:00',8.90),
(33,'JavaScript核心基础到进阶之路','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/javascript/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/javascript/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-JavaScript.png',2980,'2021-03-04 22:14:00',8.80),
(34,'HTML5+CSS3前端开发教程flex布局项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/HTML5%2BCSS3/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/HTML5%2BCSS3/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-HTML5%2BCSS3-flex.png',3980,'2021-07-04 22:14:00',8.80),
(35,'HTML5+CSS3电商项目综合实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Html5%2Bcss3%2Bjs%E7%94%B5%E5%95%86%E7%BB%BC%E5%90%88%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Html5%2Bcss3%2Bjs%E7%94%B5%E5%95%86%E7%BB%BC%E5%90%88%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-HTML5%2BCSS3.png',3980,'2021-08-04 22:14:00',8.70),
(36,'20年录制ES6教程ES7ES8实战应用','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/ES6/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/ES6/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-es6.png',3980,'2021-08-04 22:14:00',8.70),
(37,'20年微服务Dubbo+SpringBoot2.X优惠券项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Springboot%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BC%98%E6%83%A0%E5%88%B8%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Springboot%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BC%98%E6%83%A0%E5%88%B8%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-Springboot.png',14880,'2021-08-07 22:14:00',9.10),
(38,'20年Linux/Centos7视频教程零基础入门到高实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Linux/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/Linux/gw-linux.png',3980,'2021-08-17 22:14:00',9.10),
(39,'20年全新React零基础到单页面项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/React/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/React/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-react.png',6980,'2021-08-17 22:14:00',9.10),
(40,'全新微信小程序零基础到项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-%E5%B0%8F%E7%A8%8B%E5%BA%8F.png',5980,'2021-01-18 22:14:00',9.10),
(41,'玩转搜索框架ElasticSearch7.x实战','https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7_detail.jpeg','https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7.png',4880,'2021-01-10 22:14:00',8.70),
(42,'全新elementUI项目实战教程Vue整合Echarts后台权限','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Element/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/Element/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-elemenui.png',5980,'2021-01-10 22:14:00',8.70),
(43,'20年Python3.7零基础入门到爬虫实战','https://file.xdclass.net/video/2020/Python/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/Python/gw-python.png',3980,'2021-01-10 22:14:00',8.90),
(44,'2020版全新JDK8~JDK13全套新特性教程','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/JDK8/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/JDK8/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-JDK.png',3980,'2021-01-10 22:14:00',9.30),
(45,'Docker实战视频教程入门到高级dockerfile/compose-Harbor','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-docker.png',5980,'2021-01-10 22:14:00',9.30),
(46,'新版javase零基础到高级教程小白自学编程','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E6%96%B0%E7%89%88javase/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/%E6%96%B0%E7%89%88javase/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-javase.png',3980,'2021-01-24 22:14:00',8.80),
(47,'Nodejs教程零基础入门到项目实战前端视频教程','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E8%AF%A6%E6%83%85%E5%9B%BE-node.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-node.png',6980,'2021-01-24 22:14:00',8.90);
在VideoMapper.xml中添加sql语句
<update id="updateVideo" parameterType="net.xdclass.online_class.domain.Video">
UPDATE video
<!--左边字段对应数据库,右边字段对应实体类 -->
set
title = #{title,jdbcType=VARCHAR},
summary = #{summary,jdbcType=VARCHAR},
cover_img = #{coverImg,jdbcType=VARCHAR},
price = #{price,jdbcType=INTEGER},
id = #{id,jdbcType=INTEGER},
point = #{point,jdbcType=INTEGER},
create_time = now()
WHERE
id = #{id}
</update>
在 VideoMapper接口中添加方法
//更新
int updateVideo(Video video);
在启动类中调用批量新增的方法
//更新
video3.setId(42);
video3.setTitle("C++核心技术11111");
videoMapper.updateVideo(video3);
System.out.println(video3.toString());
8.动态更新
if else标签实现:在test中编写查询条件(填写java类型),标签中填写要执行的操作
通过trim标签来规范sql语句:prefix来指定语句前缀头,suffixOverrides来指定语句覆盖后缀尾。
- 在.xml文件中编写sql语句
id指定Mapper接口中的方法名,parameterType指定返回的类型
<update id="updateVideoSelective" parameterType="net.xdclass.online_class.domain.Video">
update video
<trim prefix="set" suffixOverrides=",">
<if test="title != null "> title = #{title,jdbcType=VARCHAR},</if>
<if test="summary != null "> summary = #{summary,jdbcType=VARCHAR},</if>
<if test="coverImg != null "> cover_img = #{coverImg,jdbcType=VARCHAR},</if>
<if test="price != 0 "> price = #{price,jdbcType=INTEGER},</if>
<if test="createTime !=null "> create_time = #{createTime,jdbcType=TIMESTAMP},</if>
<!-- 特别注意: 一定要看pojo类里面的是基本数据类型,还是包装数据类型-->
<if test="point != null "> point = #{point,jdbcType=DOUBLE},</if>
</trim>
where
id = #{id}
</update>
Mapper接口
//选择性更新
int updateVideoSelective(Video video);
启动类
//调用方法
Video video = videoMapper.selectById(42);
//通过xml配置文件来实现映射
System.out.println(video.toString());
//更新
video.setTitle("22222222222222222222");
System.out.println(videoMapper.updateVideoSelective(video));
9.删除语句
删除某个时间段之后 且金额大于 10元的数据
通过转义字符来避免sql的语法符号和xml里面的冲突,<![CDATA[ 要转义的符号 ]]>
- xml文件
<delete id="deleteByCreateTimeAndPrice" parameterType="java.util.Map">
delete from video where create_time <![CDATA[ > ]]> #{createTime} and price <![CDATA[ >= ]]> #{price}
</delete>
- Mapper接口
//根据价格和时间删除
int deleteByCreateTimeAndPrice(Map<String,Object> map);
- 启动类
//编写删除标准:根据价格和时间删除
Map<String,Object> map=new HashMap<>();
map.put("price",100);
map.put("createTime","2021-08-01 00:00:00");
System.out.println(videoMapper.deleteByCreateTimeAndPrice(map));
System.out.println(videoList.toString());