MyBatis多数据源的两种配置方式

MyBatis多数据源的两种配置方式包括XML配置和注解配置。

XML配置

步骤一:配置数据源

在mybatis-config.xml文件中配置多数据源的数据源信息,注意要配置各自的数据库连接信息以及数据库驱动信息。

<environments default="dev">
  <environment id="dev">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
      <property name="driver" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/db1"/>
      <property name="username" value="root"/>
      <property name="password" value="root"/>
    </dataSource>
  </environment>
  <environment id="test">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
      <property name="driver" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/db2"/>
      <property name="username" value="root"/>
      <property name="password" value="root"/>
    </dataSource>
  </environment>
</environments>

步骤二:配置mapper

创建对应的mapper接口和xml文件,如下所示:

public interface UserMapper1 {

    List<User> getAll();

    User getOne(Long id);

    void insert(User user);

    void update(User user);

    void delete(Long id);

}

<mapper namespace="com.example.mapper.UserMapper1">

    <select id="getAll" resultType="User">
        select * from user
    </select>

    <select id="getOne" parameterType="Long" resultType="User">
        select * from user where id = #{id}
    </select>

    <insert id="insert" parameterType="User">
        insert into user(id,name,age) values(#{id},#{name},#{age})
    </insert>

    <update id="update" parameterType="User">
        update user set name=#{name},age=#{age} where id=#{id}
    </update>

    <delete id="delete" parameterType="Long">
        delete from user where id=#{id}
    </delete>

</mapper>

步骤三:配置SqlSessionFactory

在Spring配置文件中根据不同的环境配置多个SqlSessionFactory对象。例如:

<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource1"/>
</bean>

<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource2"/>
</bean>

步骤四:配置MapperScannerConfigurer

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory1"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/>
</bean>

注解配置

步骤一:配置数据源

在application.yml或application.properties文件中配置数据源信息,如下所示:

# 默认数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.username=root
spring.datasource.primary.password=root

# 第二个数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root

步骤二:配置Mapper

在Mapper接口的方法上增加@Mapper注解,并且在方法上增加@Select、@Insert等注解,如下所示:

@Mapper
public interface UserMapper1 {

    @Select("SELECT * FROM user")
    List<User> getAll();

    @Select("SELECT * FROM user WHERE id = #{id}")
    User getOne(@Param("id") Long id);

    @Insert("INSERT INTO user(id,name,age) VALUES(#{id},#{name},#{age})")
    void insert(User user);

    @Update("UPDATE user SET name=#{name},age=#{age} WHERE id=#{id}")
    void update(User user);

    @Delete("DELETE FROM user WHERE id=#{id}")
    void delete(Long id);

}

步骤三:配置SqlSessionFactory

在Spring Boot配置类中使用@Primary注解定义默认的SqlSessionFactory,如下所示:

@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class DataSourceConfig {

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

    @Bean(name = "dataSource2")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "sqlSessionFactory2")
    public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "transactionManager")
    public DataSourceTransactionManager DataSourceTransactionManager(@Qualifier("dataSource1") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

}

步骤四:配置MapperScannerConfigurer

@Configuration
public class MybatisConfig {

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "sqlSessionFactory2")
    public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "db1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate db1SqlSessionTemplate(
            @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean(name = "db2SqlSessionTemplate")
    public SqlSessionTemplate db2SqlSessionTemplate(
            @Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory2) {
        return new SqlSessionTemplate(sqlSessionFactory2);
    }

}

至此,我们已经了解了MyBatis多数据源的两种配置方式。其中,第一种方式使用XML配置,相对比较繁琐,但是更加灵活,适用于使用基于XML的MyBatis的用户。第二种方式使用注解配置,相对简洁,且在Spring Boot项目中使用非常方便,是一种常用的配置方式。

下面我们看两个示例:

示例一

假设我们有两个数据源,db1和db2,下面我们分别对这两个数据源进行增删查改的操作。

  • 从db1中查询所有用户
@Autowired
private UserMapper1 userMapper1;

public List<User> getAllFromDb1() {
    return userMapper1.getAll();
}
  • 从db2中查询所有用户
@Autowired
@Qualifier("sqlSessionFactory2")
private SqlSessionFactory sqlSessionFactory2;

public List<User> getAllFromDb2() {
    SqlSession session = sqlSessionFactory2.openSession();
    UserMapper2 userMapper2 = session.getMapper(UserMapper2.class);
    return userMapper2.getAll();
}

示例二

假设我们有两个数据源,db1和db2,下面我们分别同时向这两个数据源增加一个用户。

@Autowired
@Qualifier("db1SqlSessionTemplate")
private SqlSessionTemplate db1SqlSessionTemplate;

@Autowired
@Qualifier("db2SqlSessionTemplate")
private SqlSessionTemplate db2SqlSessionTemplate;

public void addUsers() {
    User user1 = new User(1L, "admin", 18);
    User user2 = new User(2L, "admin2", 20);

    db1SqlSessionTemplate.insert("com.example.mapper.UserMapper1.insert", user1);
    db2SqlSessionTemplate.insert("com.example.mapper.UserMapper2.insert", user2);
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis多数据源的两种配置方式 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • spring MVC中传递对象参数示例详解

    在 Spring MVC 中,我们可以通过多种方式传递参数,其中包括传递对象参数。本文将详细讲解 Spring MVC 中传递对象参数示例详解,包括如何定义对象、如何传递对象参数、如何接收对象参数等。 定义对象 在 Spring MVC 中,我们可以通过定义一个 POJO(Plain Old Java Object)类来表示一个对象。下面是一个简单的示例,演…

    Java 2023年5月18日
    00
  • SpringBoot2 整合 ClickHouse数据库案例解析

    下面我将为你详细讲解如何实现SpringBoot2整合ClickHouse数据库的步骤。 准备工作 安装ClickHouse数据库 创建一个SpringBoot2项目 添加依赖 在SpringBoot2项目的pom.xml文件中添加ClickHouse驱动依赖: <dependency> <groupId>cc.blynk</g…

    Java 2023年5月20日
    00
  • LocalDateTime

    // LocalDateTime类: 获取日期时间信息。格式为 2018-09-06T15:33:56.750 // 得到指定日期时间 LocalDateTime dateTime = LocalDateTime.of(1985, 4, 15, 12, 12, 12); // 得到当前日期时间 LocalDateTime localDateTime = Lo…

    Java 2023年4月22日
    00
  • java 如何读取properties文件

    Java读取properties文件步骤: 1.创建Properties对象 Properties prop = new Properties(); 2.使用load方法加载properties文件对应的输入流 InputStream in = new FileInputStream("config.properties"); prop.…

    Java 2023年5月20日
    00
  • Java实现excel表格转成json的方法

    下面是详细讲解“Java实现excel表格转成json的方法”的完整攻略。 第一步:导入依赖 使用Java实现excel表格转成json,我们需要用到以下两个依赖: jackson:Java的JSON处理库 poi:操作Excel表格的Java库 <dependencies> <dependency> <groupId>c…

    Java 2023年5月26日
    00
  • javaWeb连接数据库实现简单登陆注册功能的全过程

    让我来为你详细讲解“Java Web连接数据库实现简单登录注册功能的全过程”。 准备工作 在进行 Java Web 开发之前,需要安装以下软件: JDK(Java Development Kit) Eclipse(开发工具) MySQL(数据库管理系统) Apache Tomcat(Web服务器) 创建数据库 在 MySQL 中创建一个名为 user 的数据…

    Java 2023年5月19日
    00
  • 利用Java实现调用http请求

    以下是利用Java实现调用HTTP请求的完整攻略。 简介 在Java中,我们可以使用HttpURLConnection或者Apache HttpClient来实现HTTP请求。两者区别在于HttpURLConnection是内置于Java SDK中的,而Apache HttpClient是第三方库。以下分别讲解这两种方式的使用方法。 使用HttpURLCon…

    Java 2023年5月19日
    00
  • java 使用策略模式操作JDBC数据库

    使用策略模式操作JDBC数据库 什么是策略模式 策略模式是一种行为设计模式,它可以让你定义一系列的算法,将这些算法封装起来并且可以相互替换。策略模式让算法的变化独立于使用算法的客户端(调用者)。本质上来讲,策略模式是一种用来管理过多相似类的经典方法,使用策略模式可以避免使用大量的if语句。 策略模式在Java中的应用 在Java中,我们可以使用策略模式对JD…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部