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 注解版也同样会生效

相关推荐
一点程序3 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
奋进的芋圆5 小时前
Spring Boot 实现三模安全登录:微信扫码 + 手机号验证码 + 邮箱验证码
spring boot·redis·微信
怪兽源码5 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
csdn_aspnet5 小时前
ASP.NET Core 中的依赖注入
后端·asp.net·di·.net core
昊坤说不出的梦6 小时前
【实战】监控上下文切换及其优化方案
java·后端
疯狂踩坑人6 小时前
【Python版 2026 从零学Langchain 1.x】(二)结构化输出和工具调用
后端·python·langchain
m0_740043738 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
重整旗鼓~8 小时前
1.外卖项目介绍
spring boot
橘子师兄8 小时前
C++AI大模型接入SDK—ChatSDK封装
开发语言·c++·人工智能·后端
@ chen8 小时前
Spring事务 核心知识
java·后端·spring