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

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&amp;characterEncoding=utf-8&amp;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());


 

相关文章:

  • MapReduce 的工作原理
  • Electron 开发:获取当前客户端 IP
  • kotlin扩展函数的实现原理
  • 环境 tensorflow ERROR: No matching distribution found for ai-edge-litert
  • 【LeetCode基础算法】链表所有类型
  • 学透Spring Boot — 007. 加载配置
  • 【模拟CMOS集成电路笔记】轨到轨运放(Rail to Rail)基础(附带实例:基于1:3电流镜的轨到轨输入运放)
  • c++绘制爱心[特殊字符] 安装 EasyX 库
  • scala-stwitch分支结构
  • 【从0到1学Docker】Docker学习笔记
  • Java常用工具算法-1--哈希算法(MD5,SHA家族,SHA-256,BLAKE2)
  • 3万字长文详解Android AIDL 接口设计
  • 1.oracle修改配置文件
  • 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测
  • 【SQL性能优化】预编译SQL:从注入防御到性能飞跃
  • 【复活吧,我的爱机!】Ideapad300-15isk拆机升级:加内存条 + 换固态硬盘 + 换电源
  • 腾讯位置服务学习记录
  • 汇编学习之《变址寄存器》
  • 下载安装mingw配置C++编译环境 及C环境
  • 深入理解 YUV 颜色空间:从原理到 Android 视频渲染
  • 视频聊天室网站开发/阿里妈妈推广网站
  • 做自己的网站能赚钱吗/免费换友情链接
  • 佛山龙江做网站的/怎么写软文推广
  • 左右翻网站模版/网站策划书怎么写
  • 百度网站怎么做的赚钱吗/品牌策略怎么写
  • dedecms做的网站如何上线/google关键词指数