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) 定义映射的对象类,非常普通的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

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

java 复制代码
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 +
                '}';
    }
}

UserDao

java 复制代码
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);

}

UserDaoImpl

java 复制代码
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)
    {
        //该方法:<E> List<E> selectList(String var1, Object var2); 参数是一个 Object
        //所以如果有多个参数要传给 selectList , key可以使用 Map 包起来

        List<User> users = sqlSession.selectList(namespace + "findByAgeBetween",

                Map.of("startAge", startAge, "endAge", endAge));

        return users;
    }
}

UserMapper.xml

java 复制代码
<?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>

UserDaoTest

java 复制代码
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);
    }
}

application.properties

java 复制代码
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

# 指定 MyBatis 的 XML 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

pom.xml

java 复制代码
<?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>
相关推荐
战族狼魂2 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
用键盘当武器的秋刀鱼6 小时前
springBoot统一响应类型3.5.1版本
java·spring boot·后端
小李同学_LHY6 小时前
三.微服务架构中的精妙设计:服务注册/服务发现-Eureka
java·spring boot·spring·springcloud
爱喝醋的雷达8 小时前
Spring SpringBoot 细节总结
java·spring boot·spring
嘵奇10 小时前
深入解析 Spring Boot 测试核心注解
java·spring boot·后端
技术liul11 小时前
解决Spring Boot Configuration Annotation Processor not configured
java·spring boot·后端
chushiyunen11 小时前
dom操作笔记、xml和document等
xml·java·笔记
whisperrr.11 小时前
【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean
xml·java·spring
KATA~13 小时前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
腥臭腐朽的日子熠熠生辉14 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven