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>
相关推荐
袁震7 小时前
Java---Mybatis详解二
java·开发语言·mybatis
多多*8 小时前
每天一道面试题之浅浅讲一下java5中的自动装箱和自动拆箱
java·开发语言·spring boot·后端·spring
hummhumm9 小时前
数据结构第3节: 抽象数据类型
数据结构·spring boot·spring·spring cloud·java-ee·maven·intellij-idea
qxlxi9 小时前
【SpringBoot】SpringBoot内置Servlet容器源码分析-Tomcat
spring boot·servlet·tomcat
敲厉害的燕宝9 小时前
数据库查询:通过两字段其中一个查询信息
数据库·mybatis
破晓的历程9 小时前
Spring Boot的无缝衔接:深入解析与实践
数据库·spring boot·后端
weixin_teach007x9 小时前
springboot+vue+mybatis图书馆借阅管理系统+PPT+论文+讲解+售后
java·数据库·vue.js·spring boot·mybatis
我焦虑的编程日记10 小时前
【Java EE】Mybatis操作数据库
数据库·java-ee·mybatis
容若只如初见12 小时前
项目实战--Spring Boot 3整合Flink实现大数据文件处理
java·spring boot·flink
java66666888812 小时前
Spring Boot中的微服务通信方式
spring boot·后端·微服务