Spring Boot (二)集成Mybatis、Druid
来源:互联网 发布:淘宝亲宝贝什么意思 编辑:程序博客网 时间:2024/05/29 15:30
项目GitHub地址 :
https://github.com/FrameReserve/TrainingBoot
Spring Boot (二)集成Mybatis、Druid,标记地址:
https://github.com/FrameReserve/TrainingBoot/releases/tag/0.0.2
pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.training</groupId><artifactId>TrainingBoot</artifactId><version>1.0.0</version><packaging>war</packaging><name>TrainingBoot</name><description>The first Spring Boot project</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><!-- 依赖版本 --><mybatis.version>3.4.1</mybatis.version><mybatis.spring.version>1.3.0</mybatis.spring.version></properties><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!-- 是否替换资源中的属性--> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <!-- 是否替换资源中的属性--> <filtering>true</filtering> </resource> </resources> </build><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency> <!-- mysql --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.25</version></dependency><!--Mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis.spring.version}</version></dependency><!--通用MAPPER--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>3.3.7</version></dependency><!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.1.6</version></dependency><!-- swagger --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.2.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.2.2</version></dependency><!-- Apache Commons Lang --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><!-- Gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.2.2</version> </dependency> <!-- utils --> <dependency> <groupId>org.unitils</groupId> <artifactId>unitils-core</artifactId> <version>3.4.2</version> </dependency></dependencies></project>
src/main/resources/application.yml
spring: datasource: name: dataSource url: jdbc:mysql://192.168.2.63:3306/training username: root password: 123 # 使用druid数据源 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver # filters: stat# maxActive: 20# initialSize: 1# maxWait: 60000# minIdle: 1# timeBetweenEvictionRunsMillis: 60000# minEvictableIdleTimeMillis: 300000# validationQuery: select 'x'# testWhileIdle: true# testOnBorrow: false# testOnReturn: false# poolPreparedStatements: true# maxOpenPreparedStatements: 20
MyBatis配置类:
src/main/java/com/training/core/mybatis/MyBatisConfig.java
package com.training.core.mybatis;import com.github.pagehelper.PageHelper;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.core.io.support.ResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.PlatformTransactionManager;import org.springframework.transaction.annotation.EnableTransactionManagement;import org.springframework.transaction.annotation.TransactionManagementConfigurer;import javax.sql.DataSource;import java.util.Properties;/** * Created by Athos on 2016-10-13. */@Configuration@EnableTransactionManagementpublic class MyBatisConfig implements TransactionManagementConfigurer { @Autowired private DataSource dataSource; @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactoryBean() { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setTypeAliasesPackage("com.training"); //分页插件 PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "count=countSql"); pageHelper.setProperties(properties); //添加插件 bean.setPlugins(new Interceptor[]{pageHelper}); //添加XML目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { bean.setMapperLocations(resolver.getResources("classpath:**/mapper/*.xml")); return bean.getObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); }}
src/main/java/com/training/core/mybatis/MyBatisMapperScannerConfig.java
package com.training.core.mybatis;import java.util.Properties;import org.springframework.boot.autoconfigure.AutoConfigureAfter;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import tk.mybatis.mapper.common.Mapper;import tk.mybatis.spring.mapper.MapperScannerConfigurer;/** * Created by Athos on 2016-10-06. */@Configuration//TODO 注意,由于MapperScannerConfigurer执行的比较早,所以必须有下面的注解@AutoConfigureAfter(MyBatisConfig.class)public class MyBatisMapperScannerConfig { @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); //这里的BasePackage 不能写com.training,估计跟spring 的扫描冲突,会实例化两个service,应该需要重构目录 mapperScannerConfigurer.setBasePackage("com.training.*.mapper"); Properties properties = new Properties(); properties.setProperty("mappers", Mapper.class.getName()); properties.setProperty("notEmpty", "false"); properties.setProperty("IDENTITY", "MYSQL"); mapperScannerConfigurer.setProperties(properties); return mapperScannerConfigurer; }}
//--------------------------------------------- 业务代码 -------------------------------------------------------------------------------------
定义BaseEntity,方便后期反射,统一增删改查
package com.training.core.entity;import java.io.Serializable;import java.util.Date;import com.fasterxml.jackson.annotation.JsonProperty;import tk.mybatis.mapper.annotation.NameStyle;import tk.mybatis.mapper.code.Style;import javax.persistence.Column;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@NameStyle(value = Style.camelhumpAndLowercase)public class BaseEntity implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY) @JsonProperty("id") private Integer id;/** * 创建时间 */@Columnprivate Date createTime;/** * 最后修改时间 */@Columnprivate Date lastModifyTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getLastModifyTime() {return lastModifyTime;}public void setLastModifyTime(Date lastModifyTime) {this.lastModifyTime = lastModifyTime;}}
BaseDao统一增删改查接口:
src/main/java/com/training/core/dao/BaseDao.java
package com.training.core.dao;import java.util.List;import tk.mybatis.mapper.entity.Example;import com.training.core.dto.FlexiPageDto;import com.training.core.entity.BaseEntity;public interface BaseDao<T extends BaseEntity> {/** * 根据Id查询实体 */public T getEntityById(final Class<T> cls, final Integer id);/** * 新增实体 */public void addEntity(final T entity);/** * 更新实体 */public void updateEntity(final T entity);/** * 根据Id删除实体 */public void deleteEntityById(final Class<T> cls, final Integer id);/** * 查询全部 */public List<T> selectAll(Class<T> cls);/** * 单表模糊查询 */public List<T> findByLike(Example example);/** * 根据模糊分页查询 */public List<T> findByPage(Example example, FlexiPageDto flexiPageDto);/** * 单表模糊查询总记录数 */public int findRowCount(Example example);}
BaseDao统一增删改查实现:
src/main/java/com/training/core/dao/impl/MyBatisBaseDaoImpl.java
package com.training.core.dao.impl;import java.util.List;import javax.annotation.Resource;import org.apache.ibatis.session.RowBounds;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Repository;import tk.mybatis.mapper.common.Mapper;import tk.mybatis.mapper.entity.Example;import com.training.core.annotation.MapperClass;import com.training.core.dao.BaseDao;import com.training.core.dto.FlexiPageDto;import com.training.core.entity.BaseEntity;@Repository("myBatisBaseDao")@SuppressWarnings("unchecked")public class MyBatisBaseDaoImpl<T extends BaseEntity> implements BaseDao<T> { @Resource @Qualifier("sessionFactory") private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; @SuppressWarnings("rawtypes") public <M extends Mapper<T>> M getMapper(Class cls){ MapperClass mapperClass = (MapperClass) cls.getAnnotation(MapperClass.class); if(null == mapperClass){ throw new RuntimeException("没有注解MapperClass"); } return (M) getSqlSession().getMapper(mapperClass.value()); } @Override public T getEntityById(Class<T> cls, Integer id) { return this.getMapper(cls).selectByPrimaryKey(id); } @Override public void addEntity(T entity) { this.getMapper(entity.getClass()).insert(entity); } @Override public void updateEntity(T entity) { this.getMapper(entity.getClass()).updateByPrimaryKey(entity); } @Override public void deleteEntityById(Class<T> cls, Integer id) { this.getMapper(cls).deleteByPrimaryKey(id); } @Override public List<T> selectAll(Class<T> cls) { return this.getMapper(cls).selectAll(); } @Override public List<T> findByLike(Example example) { return this.getMapper(example.getEntityClass()).selectByExample(example); } @Override public List<T> findByPage(Example example, FlexiPageDto flexiPageDto) { RowBounds rowBounds = new RowBounds(flexiPageDto.getOffset(), flexiPageDto.getRp()); return this.getMapper(example.getEntityClass()).selectByExampleAndRowBounds(example, rowBounds); } @Override public int findRowCount(Example example) { return this.getMapper(example.getEntityClass()).selectCountByExample(example); } public SqlSession getSqlSession(){ if (null == sqlSession){ synchronized (MyBatisBaseDaoImpl.class) { this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); } } return this.sqlSession; } }
工具类、辅助类:
1. 自定义注解,指定Mapper Class。方便后期实现统一增删改查。
src/main/java/com/training/core/annotation/MapperClass.java
package com.training.core.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Created by Athos on 2016-07-04. */@SuppressWarnings("unchecked")@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface MapperClass{/** *指定 MapperClass */ Class value();}
2. 分页工具类
src/main/java/com/training/core/dto/FlexiPageDto.java
package com.training.core.dto;public class FlexiPageDto {public static final Integer MAX_PAGE_SIZE=3000;public static final Integer SHORT_PAGE_SIZE=5;public FlexiPageDto() {super();}public FlexiPageDto(Integer page, Integer rp) {super();this.page = page;this.rp = rp;}public FlexiPageDto(Integer page, Integer rp, String sortName) {super();this.page = page;this.rp = rp;this.sortName = sortName;}public FlexiPageDto(Integer page, Integer rp, String sortName, String sortOrder) {super();this.page = page;this.rp = rp;this.sortName = sortName;this.sortOrder = sortOrder;}public static FlexiPageDto createMaxPageDto(){FlexiPageDto flexiPageDto=new FlexiPageDto();flexiPageDto.setRp(MAX_PAGE_SIZE).setPage(1);return flexiPageDto;}public static FlexiPageDto generateFlexiPageDto(Integer page, Integer rp, String orderBy) {FlexiPageDto flexiPageDto = new FlexiPageDto(page, rp);if (null != orderBy && "" != orderBy.trim()) {String[] orderBys = orderBy.split("_");flexiPageDto.setSortName(orderBys[0]);flexiPageDto.setSortOrder(orderBys[1]);}return flexiPageDto;}/** * 当前页 */private Integer page;/** * 每页显示,默认:10 */private Integer rp = 10;/** * 总记录数 */private Integer rowCount;/** * 排序字段 */private String sortName;/** * 排序(asc/desc) */private String sortOrder = "desc";public static final String SORTORDER_ACS = "asc";/** * 数据开始坐标,Mysql从0开始 */public Integer getOffset(){return (this.getPage()-1)*this.getRp();}/** * 总页数 */public Integer getTotalPage() {if (null == rowCount) {return 0;}int totalPage = (rowCount / rp);int remainder = rowCount % rp;if (rowCount > 0 && totalPage == 0) {totalPage = 1;return totalPage;}if (remainder > 0) {totalPage++;return totalPage;}return totalPage;}// -------------------------- getter and setter -----------------------------public Integer getRp() {return rp;}public FlexiPageDto setRp(Integer rp) {this.rp = rp;return this;}public Integer getPage() {return page;}public FlexiPageDto setPage(Integer page) {this.page = page;return this;}public String getSortName() {return sortName;}public FlexiPageDto setSortName(String sortName) {this.sortName = sortName;return this;}public String getSortOrder() {return sortOrder;}public FlexiPageDto setSortOrder(String sortOrder) {this.sortOrder = sortOrder;return this;}public Integer getRowCount() {return rowCount;}public FlexiPageDto setRowCount(Integer rowCount) {this.rowCount = rowCount;return this;}public String getSortString(){if (null == sortName) {return null;}String[] fields = this.getSortName().split("_");String[] fieldsorts = this.getSortOrder().split("_");if(fields.length!=fieldsorts.length){throw new RuntimeException("排序规则不一致");}String sql = "";for(int index=0;index<fields.length;index++){sql = sql+" "+fields[index]+" "+fieldsorts[index];}return sql;}}
- Spring Boot (二)集成Mybatis、Druid
- Spring Boot集成MyBatis、druid
- spring-boot集成mybatis使用Druid监控
- Spring Boot 集成Mybatis Mysql Druid
- Spring boot Druid监控、Mybatis、pageHelper集成
- spring boot & mybatis 集成二
- Druid简介(Spring Boot + Mybatis + Druid数据源【自己定制】)
- Druid简介(Spring Boot + Mybatis + Druid数据源【官方start】)
- spring-boot 集成Druid数据源
- Spring Boot集成Druid数据源
- Spring boot 整合 mybatis + druid
- MyBatis(7)--spring boot集成MyBatis,集成Druid批量更新报错multi-statement not allow
- spring boot 自学笔记(二) 集成Mybatis
- Spring Boot : 集成mybatis、pagehelper插件、开启事务、druid数据源配置、mybatis-generator(十一)
- Spring Boot 集成MyBatis
- Spring Boot 集成Mybatis
- spring-boot集成mybatis
- Spring boot集成Mybatis
- 在公式编辑器中输入破折号的方法
- window.location属性的应用
- HDU 4739 Zhuge Liang's Mines
- 一篇好文,以在迷茫时阅读
- ES6基本语法学习笔记--let与const
- Spring Boot (二)集成Mybatis、Druid
- cpp6.1
- java(12)------static关键字
- js 执行字符串函数名
- Mybatis学习笔记二:以接口方式编程
- 围绕中心旋转动画效果
- Keil(MDK-ARM)系列教程(五)_Configuration(Ⅰ)
- Struts2文件(图片)上传及页面显示
- 在Ubuntu16.04上安装Aegisub