- 添加pom 坐标
<dependency>
<!-- 在springboot项目中 mybatis依赖 springboot的jdbc进行事物管理 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
2.1 . 数据源application.yml配置
spring:
datasource:
umail:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/zmkm?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=ture
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource # 配置阿里巴巴的 druid 数据源
initialSize: 5 # 初始化5个链接
minIdle: 5
maxWait: 6000
maxActive: 30
name: umail
timeBetweenEvictionRunsMillis: 6000 # 时间应少于 数据库配置文件 wait_timeout选项
minEvictableIdleTimeMillis: 30000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true # 空闲时检测
testOnBorrow: true # 获取连接时检测
testOnReturn: false # 连接放回连接池时检测
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
2.2 注册配置 configuration
package com.configuration;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.servlet.Filter;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
// 配置 mapper包所在目录
@MapperScan(basePackages = {"com.repository.mapper"},sqlSessionTemplateRef = "umailTemplate")
@EnableTransactionManagement
public class MybatisPlusConfiguration
{
// 配置使用 umail 数据源
@Bean(name="umail")
@ConfigurationProperties(prefix = "spring.datasource.umail")
@Primary
public DataSource dataSource(){
return new DruidDataSource();
}
/**
* 创建 SqlSessionFactory
*/
@Bean(name = "umailFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(
@Qualifier("umail") DataSource dataSource
) throws Exception {
// SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); 这是mybatis带的 SqlSession
// 此处必须使用 mybatisplus 带的 sqlSession
// 1. 设置数据源
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource); // 绑定数据源
// 2. 加载分页插件
PaginationInterceptor interceptor = new PaginationInterceptor();
Properties properties = new Properties();
properties.setProperty("helperDialect", "mysql");//分页数据库为mysql
properties.setProperty("reasonable", "false");//是否分页合理化
interceptor.setProperties(properties);
bean.setPlugins(interceptor);
// 3.可以加载 xml文件的目录,由于本人喜欢纯mapper注解操作,故不需要复杂的xml文件
// bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db1/*.xml"));
return bean.getObject();
}
/**
* 配置事务管理
*/
@Bean(name = "umailTransaction")
@Primary
public PlatformTransactionManager transactionManager(
@Qualifier("umail") DataSource dataSource
) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 配置对外操作的 bean
* @param sqlSessionFactory
* @return
* @throws Exception
*/
@Bean(name = "umailTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("umailFactory") SqlSessionFactory sqlSessionFactory
) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
public ServletRegistrationBean staViewServlet(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
Map<String,String> initParams = new HashMap<>();
//设置servlet初始化参数
initParams.put("loginUsername","admin");// druid登陆名
initParams.put("loginPassword","123456");// druid密码
initParams.put("allow","");//默认就是允许所有访问
initParams.put("deny","192.168.15.21");//拒绝相对应的id访问
bean.setInitParameters(initParams);
//加载到容器中
return bean;
}
//2.配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
//设置filter初始化参数、
initParams.put("exclusions","*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");//排除静态资源和请求
bean.setInitParameters(initParams);
//拦截所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
//加载到容器中
return bean;
}
}
- 创建 数据库实体Entity 和操作的 Mapper
// 创建实体
package com.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
import java.sql.Date;
@Data
@TableName("sys_department")
public class SysDepartment {
// 注明该键是主键,并设置递增
@TableId(value = "id",type = IdType.AUTO)
private int departmentId;
private String name;
private String remark;
private Date createtime;
@TableField(exist = false)
private SysUser sysUser;
@TableField(exist = false)
private String username;
}
// 创建操作数据库的Mapper.
// 注意,该实体操作的 Mapper一定是在配置类中的 @MapperScan 中进行扫描
package com.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.repository.entity.SysDepartment;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
// @Qualifier("umailTemplate") 可以不配置,因为我配置中该Bean 为主Bean
public interface SysDepartmentMapper extends BaseMapper<SysDepartment> {
/* @Insert("insert into sys_department(name,remark) values(#{name},#{remark})")
@Options(useGeneratedKeys = true,keyProperty = "departmentId",keyColumn = "id") // 将自增主键返给 实体类的 id 属性
int insert(SysDepartment sysDepartment);
@Select("select * from sys_department")
List<SysDepartment> selectDepartment();
@Select("select d.id departmentId,d.name name,d.remark,d.createtime,u.name username from sys_department d left join sys_user u on d.id=u.department_id ")
List<SysDepartment> selectAll();*/
}
- 创建Services 操作Mapper
@Autowired
SysDepartmentMapper sysDepartmentMapper;
// 由于 umailTransaction事务Bean在配置中声明了 Primary,故可以不需要加上
@Transactional(value = "umailTransaction") //
public int storeDepartment(){
SysDepartment sysDepartment = new SysDepartment();
sysDepartment.setName("技术一部");
sysDepartment.setRemark("这是备注"+new Date());
int s=sysDepartmentMapper.insert(sysDepartment);
// 抛出的异常是 RuntimeException及子类异常的时候事务会回滚
if(s > 0) throw new RuntimeException("");
// 重点, 如果 抛出的异常被手工捕获,那么事物将不会回滚。
// 但是 仍然可以在 捕获异常的 catch中 设置手动回滚
// 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return sysDepartment.getDepartmentId();
}
网友评论