Springboot数据层开发—Springboot整合JdbcTemplate和Mybatis

Springboot整合JdbcTemplate和Mybatis

本文介绍 SpringBoot 整合 JdbcTemplate 和 MyBatis 两种方式,均都体现了SpringBoot简化数据访问层开发的特性。

springboot整合JdbcTemplate

首先需要在数据库中创建表

sql 复制代码
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `username` varchar(10) DEFAULT NULL,
  `userId` int(10) NOT NULL,
  `password` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Springboot中提供了JdbcTemplateAutoConfiguration 的自动配置 org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,

JdbcTemplateAutoConfiguration 源码如下:

java 复制代码
@Controller
public class TestController {
    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @RequestMapping("/query")
    public List<Map<String, Object>> query(){
        List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM user");
        return maps;
    }
}

由于 Springboot 中提供了 JdbcTemplateAutoConfiguration 的自动配置,直接使用 @Autowired 注解注入即可,启动 springboot,测试访问 http://localhost:8080/query

访问成功

打开监控页面

Springboot整合Mybatis注解方式

导入 mybatis 整合 springboot 模块

xml 复制代码
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>

com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

创建JavaBean

java 复制代码
import java.util.Date;

public class Person {
    private int pid;

    private String pname;

    private String addr;

    private int gender;

    private Date birth;

    public Person() {
    }

    public Person(int pid, String pname, String addr, int gender, Date birth) {
        this.pid = pid;
        this.pname = pname;
        this.addr = addr;
        this.gender = gender;
        this.birth = birth;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "Person{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", addr='" + addr + '\'' +
                ", gender=" + gender +
                ", birth=" + birth +
                '}';
    }
}

创建Mapper

java 复制代码
import java.util.List;

@Mapper
public interface PersonMapper {

    @Select("select * from person")
    public List<Person> getPersons();

    @Select("select * from person t where t.pid = #{id}")
    public Person getPersonById(int id);

    @Options(useGeneratedKeys =true, keyProperty = "pid")
    @Insert("insert into person(pid, pname, addr,gender, birth)" +
            " values(#{pid}, #{pname}, #{addr},#{gender}, #{birth})")
    public void insert(Person person);

    @Delete("delete from person where pid = #{id}")
    public void update(int id);
}

其中 @Options(useGeneratedKeys =true, keyProperty = "pid"),MyBatis 会获取到自增的 pid,自动赋值给传入的 person 对象的 pid 属性。

@Mapper 用于明确标记 MyBatis 对应的 Mapper 接口,核心职责是为 MyBatis 提供接口识别信号,触发 MyBatis 对接口的解析与动态代理实现类生成;在 Spring Boot 整合 MyBatis的场景下,该动态代理类会被自动注册为 Spring 容器中的 Bean,支持业务代码通过 @Autowired 直接注入使用。

单元测试

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class springBootMybatisTest {

    @Autowired
    PersonMapper personMapper;

    @Test
    public void testMybatis() throws SQLException {
        List<Person> persons = personMapper.getPersons();
        for (Person person : persons) {
            System.out.println(person);
        }
    }

 @Test
    public void testMybatis1() throws SQLException {
        Person p = personMapper.getPersonById(1);
        System.out.println(p);
    }
}

开启 MyBatis 的下划线转驼峰命名自动映射功能

java 复制代码
@Configuration
public class MybatisConfig {

    @Bean
    public ConfigurationCustomizer getCustomizer(){
        return new ConfigurationCustomizer() {
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
            }
        };
    }
}

当项目中 Mapper 接口数量较多,若在每个 Mapper 接口上逐一添加 @Mapper 注解,会增加重复工作量且不易维护。此时可采用 @MapperScan 注解的批量扫描方案。在 MyBatis 相关配置类或 Spring Boot 主启动类上添加 @MapperScan 注解,指定 Mapper 接口所在的包路径,MyBatis 会自动扫描该路径下所有接口,将其识别为 Mapper 接口,无需额外标注 @Mapper,即可完成动态代理实现类的生成与 Spring Bean 的注册。

Springboot整合Mybatis配置文件方式

classpath:mybatis 下创建 sqlMapConfig.xml 全局配置文件

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>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

其中 mapUnderscoreToCamelCase 值为 true 用于开启下划线转驼峰命名自动映射功能

创建sql映射文件 PersonMapper.xml

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="com.qcby.springBootMybatis.mapper.PersonMapper">
    <select id="getPersons" resultType="com.qcby.springBootMybatis.bean.Person">
        select * from person
    </select>
</mapper>

在 application.yaml 中配置 mybatis 相关配置信息

其中

config-location 值为全局配置文件路径

mapper-locations 值为sql映射文件

type-aliases-package 值为实体类所在包的全路径

测试验证

需要注意的是使用了 Springboot 整合 Mybatis 配置文件方式,Springboot 整合 Mybatis 注解版也同样会生效

相关推荐
柯南二号4 小时前
【后端】【Java】一文深入理解 Spring Boot RESTful 风格接口开发
java·spring boot·restful
Jul1en_4 小时前
【Spring】实现验证码功能
java·后端·spring
IT_陈寒5 小时前
Java并发编程避坑指南:从volatile到ThreadLocal,8个实战案例解析线程安全核心原理
前端·人工智能·后端
Victor3565 小时前
Netty(10)Netty的粘包和拆包问题是什么?如何解决它们?
后端
全栈独立开发者5 小时前
软考架构师实战:Spring Boot 3.5 + DeepSeek 开发 AI 应用,上线 24 小时数据复盘(2C1G 服务器抗压实录)
java·spring boot·后端
E***U9455 小时前
Java 校招 / 社招:Spring Boot 项目实战指南
java·开发语言·spring boot
Victor3565 小时前
Netty(9)如何实现基于Netty的UDP客户端和服务器?
后端
在坚持一下我可没意见5 小时前
Spring 开发小白学习过程中常用通用配置文件,即拿即用!(持续更新中)
java·数据库·后端·学习·spring·tomcat·mybatis
m0_740043735 小时前
SpringBoot03-Mybatis框架入门
java·数据库·spring boot·sql·spring·mybatis