• 76、SpringBoot 整合 MyBatis------使用 sqlSession 作为 Dao 组件(就是ssm那一套,在 xml 写sql)


    就是 ssm 那套,在xml 上面写sql

    ★ 基于SqlSession来实现DAO组件的方式

    - MyBatis提供的Starter会自动在Spring容器中配置SqlSession(其实SqlSessionTemplate实现类)、
      并将它注入其他组件(如DAO组件)
    
    - DAO组件可直接调用SqlSession的方法来操作数据库。
    
    - SqlSession调用insert()、update()、delete()、selectList()、selectOne()执行SQL语句时,
    
      如果SQL语句中没有占位符参数,就只要传入第1个参数——该参数代表要执行的SQL语句;
    
      如果要执行的SQL语句中带一个占位符参数,那就传入第2个参数——该参数用于为SQL语句中的占位符参数设置值 。 
    
      【无论是用insert、update、delete、selectXxx,第一个参数总是指定要执行的SQL语句的名字】。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ▲ 开发方式

       (1) 定义映射的对象类,非常普通的POJO,甚至无需任何注解。
    
       (2)定义DAO接口。
    
       (3)定义DAO实现类,该实现类使用SqlSession的方法来操作数据库。
    
       (4)使用XML Mapper文件来定义SQL语句、并为SQL语句指定名字。
    
       (5)配置XML Mapper文件的加载路径。
    
       # 指定MyBatis的XML Mapper的加载路径
       mybatis.mapper-locations=classpath*:org/crazyit/app/dao/*.xml
       # 指定为org.crazyit.app.domain下的所有类指定别名,别名规则是类名首字母小写
       mybatis.type-aliases-package=org.crazyit.app.domain
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    POJO 即 Plain Old Java Object 就是一个普通,平凡的Java对象
    POJO(Plain Old Java Object)是指普通的Java对象,它是一个简单的、基本的Java类,没有任何特殊要求或限制。POJO类通常只包含私有字段、公共访问方法(getter和setter)以及一些自定义的方法。

    代码演示:

    就是 ssm 那套,在xml 上面写sql
    这个没什么好说的,就是比较旧的mybatis

    User 类

    在这里插入图片描述

    UserDao 接口

    在这里插入图片描述

    UserDaoImpl 实现类

    在这里插入图片描述
    在这里插入图片描述

    唯一注意一点的就是:如图
    该方法: List selectList(String var1, Object var2); 参数是一个 Object,所以如果有多个参数要传给 selectList , key可以使用 Map 包起来
    在这里插入图片描述

    UserMapper.xml

    命名空间对应的时候UseDao
    在这里插入图片描述

    创建和UserDao对应的Mapper文件,用来写sql,这个idea版本可以这样快速创建
    在这里插入图片描述

    UserDaoTest

    测试类
    在这里插入图片描述

    application.properties

    在这里插入图片描述

    完整代码:

    User

    package cn.ljh.app.domain;
    
    import lombok.Data;
    
    //普通的java类
    @Data
    public class User
    {
        private Integer id;
        private String name;
        private String password;
        private int age;
    
        public User()
        {
        }
    
        public User(Integer id, String name, String password, int age)
        {
            this.id = id;
            this.name = name;
            this.password = password;
            this.age = age;
        }
    
        @Override
        public String toString()
        {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", password='" + password + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    UserDao

    package cn.ljh.app.dao;
    import cn.ljh.app.domain.User;
    import org.apache.ibatis.annotations.*;
    import java.util.List;
    
    public interface UserDao
    {
        //增
        int save(User user);
    
        //删
        int deleteById(Integer id);
    
        //根据名字模糊查询
        List<User> findByNameLike(String namePattern);
    
        //根据年龄区间进行范围查询
        List<User> findByAgeBetween(@Param("startAge") int startAge, @Param("endAge") int endAge);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    UserDaoImpl

    package cn.ljh.app.dao.impl;
    
    import cn.ljh.app.dao.UserDao;
    import cn.ljh.app.domain.User;
    import org.apache.ibatis.session.SqlSession;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    import java.util.Map;
    
    //作为dao组件,把这个类交给容器管理
    @Repository
    public class UserDaoImpl implements UserDao
    {
        private final SqlSession sqlSession;
        //通过有参构造器进行依赖注入
        public UserDaoImpl(SqlSession sqlSession)
        {
            this.sqlSession = sqlSession;
        }
    
        //UserMapper.xml 的命名空间
        private final static String namespace = "cn.ljh.app.dao.UserDao.";
    
    
        //增
        @Override
        public int save(User user)
        {
            //insert 、 delete 、 update 、select 等方法的第一个参数一直都是 SQL 语句的 ID ,就是命名空间
            int insert = sqlSession.insert(namespace + "save", user);
            return insert;
        }
    
        //删
        @Override
        public int deleteById(Integer id)
        {
            int delete = sqlSession.delete(namespace + "deleteById", id);
            return delete;
        }
    
        //根据名字模糊查询
        @Override
        public List<User> findByNameLike(String namePattern)
        {
            List<User> users = sqlSession.selectList(namespace + "findByNameLike", namePattern);
            return users;
        }
    
        //根据年龄区间进行范围查询
        @Override
        public List<User> findByAgeBetween(int startAge, int endAge)
        {
            //该方法: List selectList(String var1, Object var2); 参数是一个 Object
            //所以如果有多个参数要传给 selectList , key可以使用 Map 包起来
    
            List<User> users = sqlSession.selectList(namespace + "findByAgeBetween",
    
                    Map.of("startAge", startAge, "endAge", endAge));
    
            return users;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    UserMapper.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">
    <mapper namespace="cn.ljh.app.dao.UserDao">
    
        <insert id="save">
            insert into user_inf values (null , #{name} , #{password} , #{age})
        </insert>
    
        <delete id="deleteById">
             delete from user_inf where user_id = #{id}
        </delete>
    
        <select id="findByNameLike" resultType="user">
            select user_id as id , name , password , age from user_inf where name like #{namePattern}
        </select>
    
        <select id="findByAgeBetween" resultType="cn.ljh.app.domain.User">
            select user_id as id ,name , password , age from user_inf where age between #{startAge} and #{endAge}
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    UserDaoTest

    package cn.ljh.app;
    
    import cn.ljh.app.dao.UserDao;
    import cn.ljh.app.domain.User;
    import org.junit.jupiter.params.ParameterizedTest;
    import org.junit.jupiter.params.provider.CsvSource;
    import org.junit.jupiter.params.provider.ValueSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.List;
    
    
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
    public class UserDaoTest
    {
        @Autowired
        private UserDao userDao;
    
        //添加user对象
        @ParameterizedTest
        @CsvSource({"aa,xxx,2", "bb,xxx,3"})
        public void testSave(String name, String password, int age)
        {
            //没有id,save就是添加
            int save = userDao.save(new User(null, name, password, age));
            System.err.println(save);
        }
    
        //根据id删除用户对象
        @ParameterizedTest
        @ValueSource(ints = {17})
        public void testDelete(Integer id)
        {
            userDao.deleteById(id);
        }
    
        //根据名字模糊查询
        @ParameterizedTest
        @ValueSource(strings = {"孙%", "%精"})
        public void testFindByNameLike(String namePattern)
        {
            List<User> users = userDao.findByNameLike(namePattern);
            users.forEach(System.err::println);
        }
    
        //根据年龄区间进行范围查询
        @ParameterizedTest
        @CsvSource({"15,20", "500,1000"})
        public void testFindByAgeBetween(int startAge, int endAge)
        {
            List<User> users = userDao.findByAgeBetween(startAge, endAge);
            users.forEach(System.err::println);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    application.properties

    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=123456
    
    # 如果想看到SQL语句输出,需要将Mapper组件的日志级别设置为debug
    logging.level.cn.ljh.app.dao=debug
    
    # 指定 MyBatisXML Mapper 的加载路径
    mybatis.mapper-locations=classpath*:cn/ljh/app/dao/*.xml
    # 指定为 cn.ljh.app.domain 下的所有类指定别名,别名规则是类名首字母小写
    # 就是说xml的这个 resultType="user"
    mybatis.type-aliases-package=cn.ljh.app.domain
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.5</version>
        </parent>
        <groupId>cn.ljh</groupId>
        <artifactId>MyBatis_sqlSession</artifactId>
        <version>1.0.0</version>
        <name>MyBatis_sqlSession</name>
        <properties>
            <java.version>11</java.version>
        </properties>
        <dependencies>
            <!-- 导入 MyBatis 整合 spring boot 的 starter -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.2.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                            </exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    Redis 数据类型
    ZigBee 3.0理论教程-通用-1-12:安全加密
    前端 CSS 经典:多行文本擦除效果
    python二次开发CATIA:文字轮廓草图
    python目标检测将视频按照帧率切除成图片
    Ubuntu20.04 从头到尾完整版安装anaconda、cuda、cudnn、pytorch、paddle2.3成功记录
    05-React组件的组合使用
    【Vue3.0移动端项目--旅游网】-- 城市页面搭建
    Flowable(三):Java知识学习
    面向对象之反射
  • 原文地址:https://blog.csdn.net/weixin_44411039/article/details/133040454