美文网首页SpringBoot
SpringBoot+mybatis+mysql 多数据源配置及

SpringBoot+mybatis+mysql 多数据源配置及

作者: 未名枯草 | 来源:发表于2018-01-19 15:37 被阅读322次

    多数据源配置

    创建一个Spring配置类,定义两个DataSource用来读取application.properties中的不同配置。

    配置文件

    application.properties

    mybatis.config-locations=classpath:mybatis/mybatis-config.xml
    
    #datasource
    spring.devtools.remote.restart.enabled=false
    
    #data source1
    spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.test1.url=jdbc:mysql://127.0.0.1:3306/test_msg1
    spring.datasource.test1.username=root
    spring.datasource.test1.password=root
    
    #data source2
    spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.test2.url=jdbc:mysql://127.0.0.1:3306/test_msg2
    spring.datasource.test2.username=root
    spring.datasource.test2.password=root
    

    mybatis配置文件
    针对两个数据源,做两个mybatis的mapper配置文件
    resource/mybatis/mapper/test1/UserMapper1.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.chun.mapper.test1.User1Mapper" >
        <resultMap id="BaseResultMap" type="com.chun.entity.UserEntity" >
            <id column="id" property="id" jdbcType="BIGINT" />
            <result column="userName" property="userName" jdbcType="VARCHAR" />
            <result column="passWord" property="passWord" jdbcType="VARCHAR" />
            <result column="user_sex" property="userSex" javaType="com.chun.enums.UserSexEnum"/>
            <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
        </resultMap>
    
        <sql id="Base_Column_List" >
            id, userName, passWord, user_sex, nick_name
        </sql>
    
        <select id="getAll" resultMap="BaseResultMap"  >
            SELECT
            <include refid="Base_Column_List" />
            FROM users
        </select>
    
        <select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap" >
            SELECT
            <include refid="Base_Column_List" />
            FROM users
            WHERE id = #{id}
        </select>
    
        <insert id="insert" parameterType="com.chun.entity.UserEntity" >
            INSERT INTO
            users
            (userName,passWord,user_sex)
            VALUES
            (#{userName}, #{passWord}, #{userSex})
        </insert>
    
        <update id="update" parameterType="com.chun.entity.UserEntity" >
            UPDATE
            users
            SET
            <if test="userName != null">userName = #{userName},</if>
            <if test="passWord != null">passWord = #{passWord},</if>
            nick_name = #{nickName}
            WHERE
            id = #{id}
        </update>
    
        <delete id="delete" parameterType="java.lang.Long" >
            DELETE FROM
            users
            WHERE
            id =#{id}
        </delete>
    
    </mapper>
    

    resource/mybatis/mapper/test2/UserMapper2.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.chun.mapper.test2.User2Mapper" >
        <resultMap id="BaseResultMap" type="com.chun.entity.UserEntity" >
            <id column="id" property="id" jdbcType="BIGINT" />
            <result column="userName" property="userName" jdbcType="VARCHAR" />
            <result column="passWord" property="passWord" jdbcType="VARCHAR" />
            <result column="user_sex" property="userSex" javaType="com.chun.enums.UserSexEnum"/>
            <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
        </resultMap>
    
        <sql id="Base_Column_List" >
            id, userName, passWord, user_sex, nick_name
        </sql>
    
        <select id="getAll" resultMap="BaseResultMap"  >
            SELECT
            <include refid="Base_Column_List" />
            FROM users
        </select>
    
        <select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap" >
            SELECT
            <include refid="Base_Column_List" />
            FROM users
            WHERE id = #{id}
        </select>
    
        <insert id="insert" parameterType="com.chun.entity.UserEntity" >
            INSERT INTO
            users
            (userName,passWord,user_sex)
            VALUES
            (#{userName}, #{passWord}, #{userSex})
        </insert>
    
        <update id="update" parameterType="com.chun.entity.UserEntity" >
            UPDATE
            users
            SET
            <if test="userName != null">userName = #{userName},</if>
            <if test="passWord != null">passWord = #{passWord},</if>
            nick_name = #{nickName}
            WHERE
            id = #{id}
        </update>
    
        <delete id="delete" parameterType="java.lang.Long" >
            DELETE FROM
            users
            WHERE
            id =#{id}
        </delete>
    
    </mapper>
    
    启动类
    Application
    

    开启事务管理功能
    在项目入口类,添加以下注解开启事务管理功能。

    @EnableTransactionManagement(proxyTargetClass = true)
    
    @SpringBootApplication
    @EnableTransactionManagement(proxyTargetClass = true)   //开启事物管理功能
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
    
    数据源 datasource1 配置类

    给其中一个数据源加上@Primary。因为在Spring Boot Jdbc的自动配置过程中,会对于开发者透明地使用dataSource进行一些相关配置,所以当有两个Datasource实现类时,Spring Boot将无法确定使用哪一个。
    通过动态数据源构造SqlSessionFactory和事务管理器

    package com.chun;
    
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import javax.sql.DataSource;
    /**
     *  数据源 datasource1 配置类
     * Created by chun on 2018/1/17.
     */
    @Configuration
    @MapperScan(basePackages = "com.chun.mapper.test1", sqlSessionTemplateRef  = "test1SqlSessionTemplate")
    public class DataSource1Config {
    
        // @Primary 确定此数据源为master
        @Bean(name = "test1DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.test1")
        @Primary
        public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "test1SqlSessionFactory")
        @Primary
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
            return bean.getObject();
        }
    
        //配置事务管理器
        @Bean(name = "test1TransactionManager")
        @Primary
        public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "test1SqlSessionTemplate")
        @Primary
        public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }
    
    
    数据源 datasource2 配置类
    package com.chun;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import javax.sql.DataSource;
    /**
     *  数据源datasource2 配置类
     * Created by xiegaochun on 2018/1/17.
     */
    @Configuration
    @MapperScan(basePackages = "com.chun.mapper.test2", sqlSessionTemplateRef  = "test2SqlSessionTemplate")
    public class DataSource2Config {
    
        @Bean(name = "test2DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.test2")
        public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "test2SqlSessionFactory")
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test2/*.xml"));
            return bean.getObject();
        }
    
        @Bean(name = "test2TransactionManager")
        public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "test2SqlSessionTemplate")
        public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }
    
    定义dao层

    mapper1

    public interface User1Mapper {
        List<UserEntity> getAll();
    
        UserEntity getOne(Long id);
    
        void insert(UserEntity user);
    
        void update(UserEntity user);
    
        void delete(Long id);
    }
    

    mapper2

    public interface User2Mapper {
        List<UserEntity> getAll();
    
        UserEntity getOne(Long id);
    
        void insert(UserEntity user);
    
        void update(UserEntity user);
    
        void delete(Long id);
    }
    
    Service层

    service1

    事物使用时只需在需要事务的方法添加注解@Transactional,并指定其value值即可。同样的,value值与相应的方法名相匹配即可。
    @Transactional(value="test1TransactionManager",rollbackFor = Exception.class,timeout=36000)
    其中参数rollbackFor =Exception.class说明针对Exception异常也进行回滚,如果不标注,则Spring 默认只有抛出 RuntimeException才会回滚事务

    @Transactional配置事务有很多限制,如方法必须为public,同一个类中无该注解的方法调用有注解的方法事务不生效等。该注解还可以配置在接口类等地方

    @Slf4j
    @Service
    public class User1Service {
    
        @Autowired
        private User1Mapper user1Mapper;
    
        public List<UserEntity> getUsers() {
            List<UserEntity> users=user1Mapper.getAll();
            return users;
        }
    
        public void delete(Long id) {
            user1Mapper.delete(id);
        }
    
        @Transactional(value="test1TransactionManager",rollbackFor = Exception.class,timeout=36000)  //说明针对Exception异常也进行回滚,如果不标注,则Spring 默认只有抛出 RuntimeException才会回滚事务
        public void updateTransactional(UserEntity user) {
            try{
                user1Mapper.delete(user.getId());
                int i= 1/0;
                user1Mapper.insert(user);
            }catch(Exception e){
                log.error("find exception!");
                throw e;   // 事物方法中,如果使用trycatch捕获异常后,需要将异常抛出,否则事物不回滚。
            }
    
        }
    }
    

    service2

    @Service
    public class User2Service {
    
        @Autowired
        private User2Mapper user2Mapper;
    
        public UserEntity getUser(Long id) {
            UserEntity user=user2Mapper.getOne(id);
            return user;
        }
    
        public void save(UserEntity user) {
            user2Mapper.insert(user);
        }
    
    
        public void update(UserEntity user) {
            user2Mapper.update(user);
        }
    }
    

    相关文章

      网友评论

      本文标题:SpringBoot+mybatis+mysql 多数据源配置及

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