最近自己用springboot和mybatis做了整合,记录一下:
1.先导入用到的jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.3</version> </dependency> <!-- 阿里数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency>
2.配置配置文件(有些大家用不着的可以不配置)
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.initialSize=20 spring.datasource.minIdle=50 spring.datasource.maxActive=200 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.filters=stat,log4j spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#mybatis
mybatis.mapper-locations=classpath:/com/sxf/**/*Mapper.xml
mybatis.type-aliases-package=com.sxf.**.entity
3.解析数据源
package com.sxf.config; import java.util.Properties; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; 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.core.env.Environment; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; @Configuration public class DatasourceConfig { @Autowired private Environment env; @Bean public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDbType(env.getProperty("spring.datasource.type")); druidDataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); druidDataSource.setUrl(env.getProperty("spring.datasource.url")); druidDataSource.setUsername(env.getProperty("spring.datasource.username")); druidDataSource.setPassword(env.getProperty("spring.datasource.password")); druidDataSource.setInitialSize(Integer.parseInt(env.getProperty("spring.datasource.initialSize"))); druidDataSource.setMinIdle(Integer.parseInt(env.getProperty("spring.datasource.minIdle"))); druidDataSource.setMaxActive(Integer.parseInt(env.getProperty("spring.datasource.maxActive"))); druidDataSource.setMaxWait(Long.parseLong(env.getProperty("spring.datasource.maxWait"))); // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 druidDataSource.setTimeBetweenEvictionRunsMillis( Long.parseLong(env.getProperty("spring.datasource.timeBetweenEvictionRunsMillis"))); // 配置一个连接在池中最小生存的时间,单位是毫秒 druidDataSource.setMinEvictableIdleTimeMillis( Long.parseLong(env.getProperty("spring.datasource.minEvictableIdleTimeMillis"))); druidDataSource.setValidationQuery(env.getProperty("spring.datasource.validationQuery")); druidDataSource.setTestWhileIdle(Boolean.getBoolean(env.getProperty("spring.datasource.testWhileIdle"))); druidDataSource.setTestOnBorrow(Boolean.getBoolean(env.getProperty("spring.datasource.testOnBorrow"))); druidDataSource.setTestOnReturn(Boolean.getBoolean(env.getProperty("spring.datasource.testOnReturn"))); // 打开PSCache,并且指定每个连接上PSCache的大小 druidDataSource.setPoolPreparedStatements( Boolean.getBoolean(env.getProperty("spring.datasource.poolPreparedStatements"))); druidDataSource.setMaxPoolPreparedStatementPerConnectionSize( Integer.parseInt(env.getProperty("spring.datasource.maxPoolPreparedStatementPerConnectionSize"))); // 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 // 通过connectProperties属性来打开mergeSql功能;慢SQL记录 String cpStr = env.getProperty("spring.datasource.connectionProperties"); if (null != cpStr) { Properties pro = new Properties(); String[] kvArr = cpStr.split("\;"); if (null != kvArr && kvArr.length > 0) { for (String cp : kvArr) { String[] arr = cp.split("\="); if (null != arr && arr.length == 2) { pro.put(arr[0], arr[1]); } } } druidDataSource.setConnectProperties(pro); } return druidDataSource; } @Bean public ServletRegistrationBean druidServlet() { return new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); } }
这里配置@MapperScan扫描mybatis接口, 不需要在每个接口里面配置@Mapper
package com.sxf.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; 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; @Configuration @EnableTransactionManagement @MapperScan(basePackages="com.sxf.**.mapper", sqlSessionFactoryRef = "sqlSessionFactory") public class MyBatisConfig{ @Autowired private DatasourceConfig dataSource; @Autowired private Environment env; @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactoryBean() { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource.dataSource()); bean.setTypeAliasesPackage(env.getProperty("type-aliases-package")); //添加XML目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { // bean.setConfigLocation(resolver.getResource(env.getProperty("mybatis.page-plugins-config"))); bean.setMapperLocations(resolver.getResources(env.getProperty("mybatis.mapper-locations"))); return bean.getObject(); } catch(IllegalArgumentException e){ e.printStackTrace(); throw new RuntimeException(e); }catch (Exception e) { e.printStackTrace(); e.getMessage(); throw new RuntimeException(e); } } @Bean public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource.dataSource()); } }
mybatis接口,不需要添加@Mapper
package com.sxf.profit.mapper; import com.sxf.profit.entity.InviteCode; public interface InviteCodeMapper { int deleteByPrimaryKey(Long id); int insert(InviteCode record); int insertSelective(InviteCode record); InviteCode selectByPrimaryKey(Long id); int updateByPrimaryKeySelective(InviteCode record); int updateByPrimaryKey(InviteCode record); }
4.写个测试controller,测试成功
package com.sxf.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import com.sxf.profit.entity.InviteCode; import com.sxf.profit.mapper.InviteCodeMapper; @RestController public class InviteCodeController { @Autowired private InviteCodeMapper inviteCodeMapper; @GetMapping("/Hello/{id}") public InviteCode selectInviteCode(@PathVariable("id") Long id){ return inviteCodeMapper.selectByPrimaryKey(id); } }
成功!!!