美文网首页
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