在springboot中单独使用activeRecord并使用事务

在springboot中单独使用activeRecord并使用@Transactional事务

所需包

                <!--jdbc   start-->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-jdbc</artifactId>
                </dependency>
		<!--jdbc   end-->

		<!--引入JFinal的activerecord -->
		<dependency>
			<groupId>com.jfinal</groupId>
			<artifactId>activerecord</artifactId>
			<version>4.6</version>
		</dependency>
		<!-- activerecord end -->

其他包自己引入,如web包还有druid包等

配置文件

spring:
    datasource:
        #驱动类的名字
        driverClassName: com.mysql.cj.jdbc.Driver
        #数据库url
        url: jdbc:mysql://127.0.0.1:3306/wx?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
        #账号
        username: root
        #密码
        password: 123456
        #连接池类型
        type: com.alibaba.druid.pool.DruidDataSource

详细配置自己添加

配置类

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;

import com.alibaba.druid.pool.DruidDataSource;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.template.source.ClassPathSourceFactory;
import com.xtsr.model._MappingKit;

/**
* @ClassName: DataSourceConfig.java
* @Description: 数据库链接配置
* @version: v1.0.0
* @author: 小李子
* @date: 2019年10月28日 下午3:24:52
 */
@Configuration
public class DataSourceConfig {
	
	/**
	 * 初始化连接池
	 * @return
	 */
	@Bean
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource druidDataSource() {
		return new DruidDataSource();
	}
	
	
	
	/**
	 * 设置数据源代理
	 */
	@Bean
	public TransactionAwareDataSourceProxy transactionAwareDataSourceProxy() {
		TransactionAwareDataSourceProxy transactionAwareDataSourceProxy = new TransactionAwareDataSourceProxy();
		transactionAwareDataSourceProxy.setTargetDataSource(druidDataSource());
		return transactionAwareDataSourceProxy;
	}
	
	
	/**
	 * 设置ActiveRecord
	 */
	@Bean
	public ActiveRecordPlugin activeRecordPlugin() {
		ActiveRecordPlugin arp = new ActiveRecordPlugin(transactionAwareDataSourceProxy());
		arp.setDialect(new MysqlDialect());
		arp.setShowSql(true);
		arp.getEngine().setSourceFactory(new ClassPathSourceFactory());
		arp.addSqlTemplate("sql/all.sql");
		_MappingKit.mapping(arp);
		arp.start();
		return arp;
		
	}
	
	/**
	 * 设置事务管理
	 */
	@Bean
	public DataSourceTransactionManager dataSourceTransactionManager() {
		DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
		dataSourceTransactionManager.setDataSource(transactionAwareDataSourceProxy());
		return dataSourceTransactionManager;
	}

	

}

启动类中开启事务

image.png

使用方法

image.png

image.png


访问报错

image.png

但是并没有添加到数据库

image.png

去掉事务注解

image.png

访问接口报同样的错,但是已经添加到数据库

image.png

证明事务配置成功

(*^_^*)

评论区

chcode

2019-10-28 16:39

不错,点赞

JFinal

2019-10-28 16:40

最好的 spring boot 中使用 jfinal active record 的例子,没有之一

如果说还有打磨之处的话,可以删掉下面一行代码:
arp.getEngine().setSourceFactory(new ClassPathSourceFactory());
因为高版本 jfinal 的 active record 默认就是这个配置了

谢谢分享,点赞 + 收藏

小李子a

2019-10-28 16:41

@JFinal 好的,谢谢指点

JFinal

2019-10-28 16:42

@小李子a 我收藏了这个贴子,下次再有人问 spring boot 下使用 jfinal active record 的问题,可以很爽地发给他这个分享

chcode

2019-10-28 16:46

TransactionAwareDataSourceProxy 这个不错,之前还是通过自定义注解 解决的,你这里就可以直接用@Transactional

flyingbutter

2019-10-29 09:42

能否给个完整的例子学习一下

小李子a

2019-10-29 09:54

@flyingbutter 这个就是完整的代码了啊,没有其他逻辑,这是新起的一个项目写的

dominicdd

2019-10-29 11:11

补充一下springboot中JFinal Record对象fastjson的返回
public class RecordSerializer implements ObjectSerializer{
@Override
public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
if (o != null) {
Record record = (Record)o;
jsonSerializer.write(record.getColumns());
}
}
}
在fastjson初始化的地方加上
SerializeConfig.getGlobalInstance().put(Record.class, new RecordSerializer());

happyboy

2019-10-30 08:54

事务这一块,用activeRecord自己的方式也是可以的。

zhangtianxiao

2019-10-30 11:52

@happyboy 注解最省事, 异常抛出一把锁. 比之Db.tx

happyboy

2019-10-30 16:50

@zhangtianxiao 不是啊,activeRecord自己的@Before(Tx.class)就可以实现事务回滚啊,也是注解方式。

无为

2019-10-31 15:23

经过测试 DataSource 部分配置是错误的,读取不到druid配置。修改如下
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource druidDataSource() {
return DruidDataSourceBuilder.create().build();
}


我的配置:
# 数据库
spring.datasource.url=jdbc:mysql://localhost/haha?useUnicode=true&characterEncoding=UTF-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=qEzmBx6IOTkPq2BJj5WEWLWpia+d2563xAPdkvGYpweDQvxesObo67IMPDjFgSQZlngSL2WEcmFHBqjup6dyDw==
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 公钥
public-key=*****
# 配置 connection-properties,启用加密,配置公钥。
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
# 启动ConfigFilter
spring.datasource.druid.filter.config.enabled=true

小李子a

2019-11-04 11:22

@无为 你使用的应该是Druid的spring-boot-starter,在这个项目中我没有使用starter,还是使用的com.alibaba.druid所以并没有遇见你说的呢个错误

无为

2019-12-02 10:26

@小李子a 使用的spring-boot-starter

热门分享

扫码入社