基于sharding-jdbc 之spring+mybatis+sharding-jdbc整合
官方介绍文档: http://dangdangdotcom.github.io/sharding-jdbc/00-overview/
本文参考: http://blog.csdn.net/clypm/article/details/54378523
0.环境
ip :192.168.1.121
端口号:3306数据库1:sharding_0
数据库2:sharding_1
1.创建多个分库
create database sharding_0;
create database sharding_1;
2.在各个分库上,创建多张分表
SET FOREIGN_KEY_CHECKS=0;
-- 逻辑表 t_user
-- 分表:t_user_0
DROP TABLE IF EXISTS `t_user_0`;
CREATE TABLE `t_user_0` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 分表:t_user_1
DROP TABLE IF EXISTS `t_user_1`;
CREATE TABLE `t_user_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 分表: t_user_2
DROP TABLE IF EXISTS `t_user_2`;
CREATE TABLE `t_user_2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t_student_0`;
CREATE TABLE `t_student_0` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t_student_1`;
CREATE TABLE `t_student_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 学生表:测试事务时使用
DROP TABLE IF EXISTS `t_student_0`;
CREATE TABLE `t_student_0` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t_student_1`;
CREATE TABLE `t_student_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.案例:sharding-jdbc-mybatis-demo
3.1 组件
需要jar包:见 pom.xml ,加粗的标识
4.0.0
com.eshop
sharding-jdbc-mybatis-demo
0.0.1-SNAPSHOT
jar
UTF-8
3.2.5.RELEASE
3.2.4
junit
junit
4.10
org.springframework
spring-orm
${spring.version}
commons-dbcp
commons-dbcp
1.4
org.mybatis
mybatis-spring
1.2.2
org.mybatis
mybatis
${mybatis.version}
org.springframework
spring-expression
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-tx
${spring.version}
log4j
log4j
1.2.16
org.slf4j
slf4j-log4j12
1.7.5
org.springframework
spring-webmvc
3.2.4.RELEASE
com.dangdang
sharding-jdbc-core
1.4.2
com.dangdang
sharding-jdbc-config-spring
1.4.2
mysql
mysql-connector-java
5.1.28
javax.servlet
servlet-api
2.5
错误分析:
Unsatisfied dependency expressed through constructor argument with index 1 of type [boolean]: Could not convert constructor argument value of type [java.util.ArrayList] to required type [boolean]
问题解决:在rdb的配置方法里,就可以使用,而且分布式主键的包需要1.4.2版本
3.2 主配置文件applicationContext.xml
3.3 配置文件spring-database.xml
3.4 配置文件spring-sharding.xml
3.5 log.xml
4.相关的类
4.1ShardingTmInterceptor
在跨库查询时,必须加这个类实现HandlerInterceptorAdapter,否则报错
package com.eshop.sharding.jdbc.aop;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class ShardingTmInterceptor extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
super.afterCompletion(request, response, handler, ex);
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
super.afterConcurrentHandlingStarted(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
super.postHandle(request, response, handler, modelAndView);
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取分库分表数据源
DataSource shardingDataSource = (DataSource) ctx.getBean("shardingDataSource");
//创建jdbcTemplate
final JdbcTemplate jdbcTemplate = new JdbcTemplate(shardingDataSource);
//获取事务管理器
AbstractPlatformTransactionManager transactionManager = (AbstractPlatformTransactionManager) ctx.getBean("transactionManager");
//创建事务模板
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
//执行SQL(product是逻辑表名,id是分库分表键)
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
//HintManager hintManager = HintManager.getInstance();
//hintManager.setMasterRouteOnly();
String sql = "insert into product(id,title,last_modified) values(?,?,?)";
jdbcTemplate.update(sql,1L,"title",new Date());
//jdbcTemplate.queryForList("select id,title from product where id = ?",1L);
}
});
return super.preHandle(request, response, handler);
}
}
4.2 持久层接口类
UserDao
package com.eshop.sharding.jdbc.dao;
import java.util.List;
import com.eshop.sharding.jdbc.domain.User;
public interface UserDao {
Integer insert(User u);
List findAll();
List findByUserIds(List userIds);
}
对应的Mapper文件UserDao.xml