美文网首页
SpringBoot实践-整合JDBC,事务,连接池,Mybat

SpringBoot实践-整合JDBC,事务,连接池,Mybat

作者: 伍陆柒_ | 来源:发表于2019-04-13 13:01 被阅读0次

    1.整合JDBC和事务

    spring中的jdbc连接和事务是配置中的重要一环,在SpringBoot中该如何处理呢?
    答案是不需要处理,我们只要找到SpringBoot提供的启动器即可:

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

    SpringBoot并不知道我们用的什么数据库,这里我们选择MySQL

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

    至于事务,SpringBoot中通过注解来控制。就是我们熟知的@Transactional

    @Service
    public class UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        public User queryById(Long id){
            return this.userMapper.selectByPrimaryKey(id);
        }
    
        @Transactional
        public void deleteById(Long id){
            this.userMapper.deleteByPrimaryKey(id);
        }
    }
    

    2.整合连接池

    其实,在刚才引入jdbc启动器的时候,SpringBoot已经自动帮我们引入了一个连接池:


    HikariCP连接池

    HikariCP应该是目前速度最快的连接池了,我们看看它与c3p0的对比:


    效率 每秒并发量

    因此,我们只需要指定连接池参数即可:

    # 数据库连接池
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/springboot1?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        hikari:
          idle-timeout: 60000
          maximum-pool-size: 30
          minimum-idle: 10
    

    当然,如果你更喜欢Druid连接池,也可以使用Druid官方提供的启动器:

    <!-- Druid连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.6</version>
    </dependency>
    

    而连接信息的配置与上面是类似的,只不过在连接池特有属性上,方式略有不同:

    #初始化连接数
    spring.datasource.druid.initial-size=1
    #最小空闲连接
    spring.datasource.druid.min-idle=1
    #最大活动连接
    spring.datasource.druid.max-active=20
    #获取连接时测试是否可用
    spring.datasource.druid.test-on-borrow=true
    #监控页面启动
    spring.datasource.druid.stat-view-servlet.allow=true
    

    3.整合mybatis

    3.1.mybatis

    SpringBoot官方并没有提供Mybatis的启动器,不过Mybatis官网自己实现了:

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

    配置,基本没有需要配置的:

    # mybatis 别名扫描
    # mapper.xml文件位置,如果没有映射文件,请注释掉
    mybatis:
      type-aliases-package: com.neuedu.pojo
      mapper-locations: classpath:mapper/*.xml
    

    需要注意,这里没有配置mapper接口扫描包,因此我们需要给每一个Mapper接口添加@Mapper注解,才能被识别。

    @Mapper
    public interface UserMapper {
    }
    

    3.2.通用mapper(推荐)

    测试表

    -- ----------------------------
    -- Table structure for userinfo
    -- ----------------------------
    DROP TABLE IF EXISTS `userinfo`;
    CREATE TABLE `userinfo` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(200) NOT NULL DEFAULT '',
      `birthday` date DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of userinfo
    -- ----------------------------
    INSERT INTO `userinfo` VALUES ('1', '大徐', '2019-04-25');
    INSERT INTO `userinfo` VALUES ('2', '大吹', '2019-04-28');
    INSERT INTO `userinfo` VALUES ('3', '大宝', '2019-04-29');
    

    实体类

    import lombok.Data;
    import tk.mybatis.mapper.annotation.KeySql;
    
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Transient;
    import java.util.Date;
    @Data
    // 指定对应的表名
    @Table(name="userinfo")
    public class Userinfo {
        // 主键
        @Id
        // 指定主键是自增
        @KeySql(useGeneratedKeys = true)
    //  通用 Mapper 的 selectByPrimaryKey 方法无法识别 int 类型,需要在 POJO 类中将 int 改为包装类型 Integer
    //  其他类型如 Long 则无这种情况
        private Long id;
        private String name;
        private Date birthday;
        // 不是永久的,不需要持久化到数据库,不会作为sql语句的一个字段
        @Transient
        private String test;
    }
    

    pom.xml

    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.leyou</groupId>
        <artifactId>springboot-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--jdk版本-->
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <!--父工程-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.0.RELEASE</version>
        </parent>
        <dependencies>
            <!--springboot启动器-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!--lombok可以提供@Data注解,帮助实体类添加getters,setters构造器等方法-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <!--mysql驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!--通用mapper-->
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>2.0.2</version>
            </dependency>
            <!--test启动器,测试用例-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <!--thymeleaf启动器-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
        </dependencies>
    </project>
    

    通用Mapper的作者也为自己的插件编写了启动器,我们直接引入即可:
    值得一提的事,通用mapper中已经集成了jdbc连接池和mabatis,所以如果使用了通用mapper,可以不再导入jdbc和mybatis的依赖
    而通用mapper中把所有的单表操作已经完成好了
    不需要做任何配置就可以使用了。

    @Mapper
    public interface UserinfoMapper extends tk.mybatis.mapper.common.Mapper<Userinfo>{
    }
    

    更好的方式

    import com.leyou.pojo.Userinfo;
    import tk.mybatis.mapper.common.Mapper;
    
    public interface UserinfoMapper extends Mapper<Userinfo> {
    }
    
    @SpringBootApplication
    // @MapperScan能够帮我们自动扫描这个包下的所有接口并完成注册
    @MapperScan("com.leyou.mapper")
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }
    
    继承的单表操作方法
    工程结构
    image.png

    UserinfoService.java

    import com.leyou.mapper.UserinfoMapper;
    import com.leyou.pojo.Userinfo;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.util.List;
    
    @Service
    public class UserinfoService {
        @Autowired
        private UserinfoMapper userinfoMapper;
        public Userinfo queryById(Long id){
            return userinfoMapper.selectByPrimaryKey(id);
        }
    //    从引入jdbc那一刻,事务就已经解决了,只需要使用我们熟悉的注解
        @Transactional
        public int insertUserinfo(Userinfo userinfo){
            return userinfoMapper.insert(userinfo);
        }
        public List<Userinfo> queryAll(){
            return userinfoMapper.selectAll();
        }
    }
    

    3.5.启动测试

    将controller进行简单改造:

    @RestController
    public class HelloController {
    
        @Autowired
        private UserService userService;
    
        @GetMapping("/hello")
        public User hello() {
            User user = this.userService.queryById(1L);
            return user;
        }
    }
    

    我们启动项目,查看


    image.png

    相关文章

      网友评论

          本文标题:SpringBoot实践-整合JDBC,事务,连接池,Mybat

          本文链接:https://www.haomeiwen.com/subject/oaulwqtx.html