当前位置:首页>财经>正文

mybatis怎么配置使用多个数据源 spring mybatis怎么配置一个数据源,多个数据库

2023-07-04 08:05:44 互联网 未知 财经

 mybatis怎么配置使用多个数据源 spring mybatis怎么配置一个数据源,多个数据库

mybatis怎么配置使用多个数据源

Java代码 UserMapper mapper = MapperFactory.createMapper(UserMapper.class, DataSourceEnvironment.HD)
User user = mapper.getUserById(162L)
System.out.println(user)

OK,到此基本上所有的工作就完成了,以上的方式就可以支持多个数据源了。
但是代码还不够优雅,以上代码我们发现DataSourceEnvironment这个枚举变量在客户端,MapperFactory以及DataSourceEnvironment
中传来传去,我们应该尽量减少一个类对外界类的耦合,也就是不符合Java编程原则中的迪米特法则。
好了,那我们来改良一下。
将MapperFactory设计成枚举策略模式:

Java代码
/**
* Mapper Creator
* @author boyce
* @version 2014-3-28
*/
public enum MapperFactory {

HD {
private SqlSessionFactory sqlSessionFactory

@Override
public T createMapper(Class extends Mapper> clazz) {
return createMapper(clazz, this)
}

@Override
protected void createSqlSessionFactory() {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, this.name())
}

@Override
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory
}

},
HO {
private SqlSessionFactory sqlSessionFactory
@Override
public T createMapper(Class extends Mapper> clazz) {
return createMapper(clazz, this)
}

@Override
protected void createSqlSessionFactory() {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, this.name())
}

@Override
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory
}
}

/**
* Create a mapper of environment by Mapper class
* @param clazz Mapper class
* @param environment A datasource environment
* @return a Mapper instance
*/
public abstract T createMapper(Class extends Mapper> clazz)

/**
* Create SqlSessionFactory of environment
*/
protected abstract void createSqlSessionFactory()

/**
* get SqlSessionFactory
*/
public abstract SqlSessionFactory getSqlSessionFactory()

private static InputStream inputStream = null
static {
try {
inputStream = Resources.getResourceAsStream("mybatis/mybatis.xml")
HO.createSqlSessionFactory()
HD.createSqlSessionFactory()
} catch (IOException e) {
e.printStackTrace()
} finally {
IOUtils.closeQuietly(inputStream)
}
}

@SuppressWarnings("unchecked")
private static T createMapper(Class extends Mapper> clazz, MapperFactory MapperFactory) {
SqlSession sqlSession = MapperFactory.getSqlSessionFactory().openSession()
Mapper mapper = sqlSession.getMapper(clazz)
return (T)MapperProxy.bind(mapper, sqlSession)
}

/**
* Mapper Proxy
* executing mapper method and close sqlsession
* @author boyce
* @version 2014-4-9
*/
private static class MapperProxy implements InvocationHandler {
private Mapper mapper
private SqlSession sqlSession

private MapperProxy(Mapper mapper, SqlSession sqlSession) {
this.mapper = mapper
this.sqlSession = sqlSession
}

private static Mapper bind(Mapper mapper, SqlSession sqlSession) {
return (Mapper) Proxy.newProxyInstance(mapper.getClass().getClassLoader(),
mapper.getClass().getInterfaces(), new MapperProxy(mapper, sqlSession))
}

/**
* execute mapper method and finally close sqlSession
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = null
try {
object = method.invoke(mapper, args)
} catch(Exception e) {
e.printStackTrace()
} finally {
sqlSession.close()
}
return object
}
}

}

客户端使用场景:

Java代码
UserMapper mapper = MapperFactory.HO.createMapper(UserMapper.class)
User user = mapper.getUserById(162L)
System.out.println(user)

spring mybatis怎么配置一个数据源,多个数据库

class="org.apache.commons.dbcp.BasicDataSource"> 在applicationContext.xml中写入以上的配置代码 新建一个jdbc.properties存放数据源具体信息 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/workloads?useUnicode=true&characterEncoding=utf-8 //characterEncoding=utf-8 将数据编码转换为utf-8 jdbc.username=root //数据登录名 jdbc.password=123 //登录密码 在mybatis-config.xml配置需要的数据表

如何在spring配置多个数据源

给你一个例子:
context.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">















package util

public class DbContextHolder {
private static final ThreadLocal contextHolder = new ThreadLocal()

public static void setDbType(String dbType) {
contextHolder.set(dbType)
}

public static String getDbType() {
return (String) contextHolder.get()
}

public static void clearDbType() {
contextHolder.remove()
}
}

package util

import java.sql.SQLException

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource

public class DynamicDataSource extends AbstractRoutingDataSource {
//static Logger log = Logger.getLogger("DynamicDataSource")
@Override
protected Object determineCurrentLookupKey() {
// TODO
return DbContextHolder.getDbType()
}

@Override
public boolean isWrapperFor(Class iface) throws SQLException {
// TODO Auto-generated method stub
return false
}

@Override
public T unwrap(Class iface) throws SQLException {
// TODO Auto-generated method stub
return null
}

}

测试程序:

DbContextHolder.setDbType("1")
UserDomain od = this.testService.queryUserAccount("admin")
System.out.println("username==" od.getName())

DbContextHolder.setDbType("0")
d = this.testService.queryUserAccount("admin")

MyBatis如何引用多个数据源操作麻烦告诉我