美文网首页
SpringBoot全景速学2——数据库集成

SpringBoot全景速学2——数据库集成

作者: 千淘萬漉 | 来源:发表于2019-03-26 20:49 被阅读0次

一、集成单源数据库

MyBatis 是现如今最流行的 ORM 框架,SpringBoot通过mybatis-spring-boot-starter组件轻松的继承了Mybtis功能,几乎可以零配置来构建独立的应用,本篇可以从Spring Initial官网中选择Mybatis和DB驱动直接开始。

1.准备工作

在数据库中创建users表,以Mysql为例:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
   `userName` varchar(32) DEFAULT NULL COMMENT '用户名',
   `passWord` varchar(32) DEFAULT NULL COMMENT '密码',
   `user_sex` varchar(32) DEFAULT NULL,
   `nick_name` varchar(32) DEFAULT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.集成Mybatis和数据库驱动

无论选择何种DB,Mybatis层面的配置都是一样的,可以在Maven中央仓库选择最新的starter。

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

在数据库选择方面,关系型DB主流有三种:1、Mysql,2、Oralce,3、Postgrel,搭建时可参照不同的实现来集成:

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

<!--postgrel-->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

Oracle的依赖则较为特殊,在mvn中心仓库上无法获取,只能通过集成本地Odbc驱动的方式,需要在pom文件上做几处特殊的处理:

<!-- 系统默认属性配置 -->
<properties>
    <cs.dir>${project.basedir}</cs.dir>
</properties>

<!-- 本地jar依赖 -->
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${cs.dir}/lib/ojdbc6.jar</systemPath>
</dependency>

<!-- 本地jar生效的关键配置 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
            </configuration>
        </plugin>
    </plugins>
</build>

3.application配置

Spring Boot 会自动加载 spring.datasource.* 相关配置,数据源就会自动注入到 sqlSessionFactory 中,sqlSessionFactory 会自动注入到 Mapper 中,剩下的就是开发了。

# mybatis属性
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.example.mybatis
# spring.datasource属性
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnico
de=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

需要再注意mybatis的几个属性,有则可以加,非必须参数:

  • mybatis.config-location 定义了mybatis-config.xml的路径
  • mybatis.mapper-locations 定义了Mapper所对应的XML文件路径
  • mybatis.type-aliases-package 配置了项目中实体类路径

4.启动类配置

在启动类中添加对 Mapper 包扫描 @MapperScan,Spring Boot 启动的时候会自动加载包路径下的Mapper(也可直接在 Mapper 类上添加注解 @Mapper,二选一,但此方法稍麻烦)。

@MapperScan("com.example.mybatis.mapper")
@SpringBootApplication
public class MybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisApplication.class, args);
    }
}

5.mybatis-config

mybatis-config.xml 主要配置常用的 typeAliases,设置类型别名,为 Java 类型设置一个短的名字,可用来减少类完全限定名的冗余,可以在别的XML文件的resultType和parameterType中直接引用。

<?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>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>
</configuration

6.CURD开发

有了以上配置即可进行业务层面的增删改查了,基本是流水线的工作:

  • 编写mapper文件,并映射到对应的Mapper类上
  • 编写SQL语句
  • 编写DAO层代码

除此以外,还需要注意一点:是否使用分页查询。如果是页面查询则需要提供相关的分页查询参数,如果是大数据量的统计查询,mybatis的查询返回则是受限于9999总数的限制。

二、多源数据库

在业务开发中有时不可避免的需要连接多个数据源,比如主库为Mysql,而又需要操作辅库Postgre,那么多源数据库的配置则需要显式的声明数据库信息的配置。

1.配置多源数据库信息

mybatis.config-location=classpath:mybatis/mybatis-config.xml

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

spring.datasource.postgre.jdbc-url=jdbc:postgresql://localhost:5432/test1
spring.datasource.postgre.username=root
spring.datasource.postgre.password=root
spring.datasource.postgre.driver-class-name=org.postgresql.Driver

第一个数据源以spring.datasource.mysql.*为前缀连接mysql数据库(第三个字符串mysql是可以自定义的),spring.datasource.postgre.*为前缀连接postgrel数据库。

2.加载数据源

多数据源的最佳实践:不同的数据源mapper文件和dao层要在不同的数据源包下,包名直接反应出数据库类型名称。

配置第一个数据源的基本信息如下,而第二个的配置写法和第一个基本一致,区别在于包路径定义和数据源的声明,@Primary则只需要注解在主库数据源上。

@Configuration
@MapperScan(basePackages = "com.example.mybatis.mysql", 
        sqlSessionTemplateRef  = "mysqlSqlSessionTemplate")
public class DataSource1Config {

    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.one")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysqlSqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory
            (@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().
                getResources("classpath:mybatis/mapper/one/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "mysqlTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager
            (@Qualifier("mysqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mysqlSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate
            (@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) 
            throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

在ORM集成框架的选择上,除了Mybatis还有流行的JPA可供选择。另外数据库连接池的选择上,SpringBoot 2.0 使用Hikari连接池号称是Java平台最快的,性能十分卓越,当然也缺乏了druid在监控方面的便利性。

三、事务支持

SpringBoot中使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持。

// SpringBoot启动类
@SpringBootApplication
@EnableTransactionManagement
public class TomcatApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(TomcatApplication.class, args);
    }
}

在访问数据库的Service方法上添加注解 @Transactional 即可实现对事务的支持。

// 业务层
@Service
public class JenkinsService {
    @Autowired
    private JenkinsDao jenkinsDao;
    @Transactional // 事务控制
    public void saveUser() {
    }
}

相关文章

网友评论

      本文标题:SpringBoot全景速学2——数据库集成

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