前言
网上费了老大力气找各种整合ssm整合shardingjdbc的项目发现都是1.x的,连个or查询都不支持,有毛用,废话不说了,直接上干货
目录
一.sql准备
准备两张表user_0,user_1
DROP TABLE IF EXISTS `user_0`;
CREATE TABLE `user_0` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for user_1
-- ----------------------------
DROP TABLE IF EXISTS `user_1`;
CREATE TABLE `user_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
二. mvn配置
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.1.0</version>
</dependency>
注意:此处只贴出shardingsphere的,此次示例是老ssm项目新加shardingsphere的故其它不再展示
ssm和druid版本也贴一下吧
<spring.version>4.0.8.RELEASE</spring.version>
<mybatis.version>3.2.8</mybatis.version>
<mybatis-spring.version>1.2.2</mybatis-spring.version>
<druid.version>1.1.10</druid.version>
三.数据源配置
在你的原数据配置文件中找到老数据源配置,在老数据源配置下面新增数据源配置 shardingDataSource,并把老数据源连接改成 shardingDataSource
<!--shardingJDBC配置开始 根据user.id 的奇偶来分片 -->
<bean id="demo_ds" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/crm_db?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<sharding:inline-strategy id="userTableStrategy" sharding-column="id" algorithm-expression="user_$->{id % 2}" />
<sharding:data-source id="shardingDataSource">
<sharding:sharding-rule data-source-names="demo_ds">
<sharding:table-rules>
<sharding:table-rule logic-table="user" actual-data-nodes="demo_ds.user_$->{0..1}" table-strategy-ref="userTableStrategy" />
</sharding:table-rules>
</sharding:sharding-rule>
<sharding:props>
<prop key="sql.show">false</prop>
</sharding:props>
</sharding:data-source>
<!--sharding JDBC结束 -->
注意:一定要用$->{...} 不要用 ${...} 来自官方建议,不信可以试试哈,有惊喜呀
行表达式标识符可以使用 ${...}
或 $->{...}
,但前者与 Spring 本身的属性文件占位符冲突,因此在 Spring 环境中使用行表达式标识符建议使用 $->{...}
。
五,实体层无任何区别
public class UserEntity {
private int id;
private String name;
private int age;
public UserEntity() {
}
public UserEntity(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "UserEntity{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
六,dao层和原来没任何区别
import com.thinkgem.jeesite.common.persistence.CrudDao;
import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
import com.thinkgem.jeesite.modules.sharding.entity.UserEntity;
@MyBatisDao
public interface ShardingUserDao extends CrudDao<ShardingUserDao> {
int insertOne(UserEntity user);
UserEntity selectByPk(int id);
}
七,mapper层和原来没任何区别
<?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.thinkgem.jeesite.modules.sharding.dao.ShardingUserDao">
<insert id="insertOne" parameterType="com.thinkgem.jeesite.modules.sharding.entity.UserEntity">
INSERT INTO user(id, name,age) VALUE(#{id},#{name},#{age})
</insert>
<select id="selectByPk" resultType="com.thinkgem.jeesite.modules.sharding.entity.UserEntity" parameterType="java.lang.Integer">
select * from user where id=#{id}
</select>
</mapper>
八,在一个service层中调用
@Autowired
private ShardingUserDao userDao;
@Transactional(readOnly = false)
public void save() {
userDao.insertOne(new UserEntity(12, "333", 1122));
userDao.insertOne(new UserEntity(14, "3333", 1122));
System.out.println(userDao.selectByPk(1));
System.out.println(userDao.selectByPk(2));
}
结果
原创不易,转载请注明出处