1-6. SpringBoot整合JDBC线程池,整合Mybatis(相关事务控制、通用Mapper)快速实现旧式SSM架构

最近突发奇想,整合一下以前一些学习笔记,分享自己这几年爬过的坑,逐步更新文章,谢谢大家的关注和支持。

整合JDBC

SpringBoot整合JDBC,目前好像最快得线程池是HikariCP,因此SpringBoot是默认支持的,只需要引入下面依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

可以看出它自动导入了HikariCP的包
在这里插入图片描述
因此只需要在配置文件写上数据库连接池即可,这边是使用application.yml作为配置文件的

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ming
    username: root
    password: 123456

如果驱动类名写的还是老式那个com.mysql.jdbc.Driver的话,估计启动会报一个警告,写着Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

在这里插入图片描述
因此替换成com.mysql.cj.jdbc.Driver。

整合Mybatis

SpringBoot官方没有整合Mybatis的,是Mybatis公司自己写了一个整合包,因此需要导入以下依赖,而且得自己管理版本号

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>

在配置文件中加入

mybatis:
  configuration:
    map-underscore-to-camel-case: true  #驼峰命名
  type-aliases-package: cn.sysu.ming.pojo #开启别名
  mapper-locations: mapper/*.xml  #mapeer.xml文件位置

来开启驼峰命名,别名,以及告诉SpringBoot 项目得mapper xml文件在哪里。后面大家就会了把,编写dao层接口(mapper接口),编写xml文件包括动态sql,映射关系等等,但是其实真的很麻烦,

很多单表操作其实真的不必要自己写动态sql,因为都是类同的工作,所以这里介绍的是使用一个通用Mapper,该作者(应该说大神)很勤奋,经常更新,所以比较好。

注意,注意
这里讲的是单表查询,当多表联合查询时还是需要自己写xml或者写相应接口,因为可以通过sql来进行优化操作。

通用Mapper

该通用Mapper的GitHub地址是
https://github.com/abel533/Mapper

在pom.xml文件中加入

<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>4.1.5</version>
</dependency>

因为导入它的时候同时导入了spring-boot-starter-jdbc和mybatis-spring-boot-starter,因此可以在pom中删去这些依赖。最后的pom文件是

<?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.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.sysu</groupId>
    <artifactId>ming-base</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ming</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.1.5</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

因为该依赖包默认开启驼峰命名以及不需要自己编写xml文件,因此配置改成如下

mybatis:
  type-aliases-package: cn.sysu.ming.pojo #开启别名

编写mapper接口,需要继承一个接口,泛型写的是该表的pojo类。如下

package cn.sysu.ming.mapper;

import cn.sysu.ming.pojo.Product;
import tk.mybatis.mapper.common.Mapper;


public interface ProductMapper extends Mapper<Product> {
}

接口就写完了???,是的,这样就写完了。
只需要在启动类中加入如下注解告诉SpringBoot就可以,注意的是@MapperScan是要用该包下的 tk.mybatis.spring.annotation.MapperScan,因为mybatis也有一同名注解

@SpringBootApplication
@MapperScan("cn.sysu.ming.mapper")
public class MingApplication {

    public static void main(String[] args) {
        SpringApplication.run(MingApplication.class, args);
    }

}

编写相应的Service层代码,这里直接上代码,就不再多说了。

public interface ProductService {

    Product findById(int id);
}
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Override
    public Product findById(int id) {
        return productMapper.selectByPrimaryKey(id);
    }
}

需要注意的是,因为idea识别不了该自动注入,会有红线,但不影响代码运行。

pojo类,该类还是要说一下

一些通用Mapper注解知识
@Table是标识该类对应数据库中的哪个表,如果类与表是同名的话就可以不写
@Id 表示该属性是主键,若是自增主键则需要加上@KeySql(useGeneratedKeys = true)
@Transient 表示忽略该属性,不自动映射它。
@Column 表示对用数据库中哪个字段

package cn.sysu.ming.pojo;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;

@Data
//@Table(name = "product")
public class Product {

    @Id
    @KeySql(useGeneratedKeys = true)
    @Column(name = "id")
    private int id;

    private String name;

    @Column(name = "price")
    private int price;
}

至于@Data是什么意思,是lombok依赖的注解,前面我写的一篇文章有介绍,大家可以看看1-5. SpringBoot—java后端开发人员的神器lombok

这边有个小插曲--------,我写的类的属性名本来是跟数据库字段是一样的,但不知道为什么price,和主键id自动映射都不成功,所以我直接添加了@Colunm注解。后面发现是因为类中属性用了基本类型,改成包装类型就好了,所以pojo类改成以下

@Data
//@Table(name = "product")
public class Product {

    @Id
    @KeySql(useGeneratedKeys = true)
    //@Column(name = "id")
    private Integer id;

    private String name;

    //@Column(name = "price")
    private Integer price;
}

controller层代码就不写了,相信看到这的人都会自己写,这边只在测试类测试一下。

@SpringBootTest
class MingApplicationTests {

    @Autowired
    private ProductService productService;

    @Test
    void contextLoads() {
        System.out.println(productService.findById(1));
    }

}

在这里插入图片描述
成功。

关于事务这个更加简单,SpringBoot默认支持了事务,也帮你配置好了事务管理器(毕竟约定大于配置),因此只需要在service层哪个方法中需要事务,在方法前加上@Transactional即可。

该项目源码已放在GitHub上,地址是
https://github.com/mingweihua/ming/tree/main/ming-base

博主的坚持 离不开大家关注、评论和点赞,感谢大家支持。护发路上互相扶持!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值