velocity-engine-core是mybatis-plus自动生成代码所依赖的模板(不用自动生成代码功能可不用)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
和普通mysql配置相同,没有额外配置
#mysql 连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
@MapperScan中直接mapper文件所在的package
@SpringBootApplication
@EnableTransactionManagement
@EnableEurekaClient
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
略
@Data
@TableName("area")
@ToString(callSuper=true, includeFieldNames=true)
@AllArgsConstructor
@NoArgsConstructor
public class Area implements Serializable{
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int sort;
}
只有自定义SQL时,mapper中才有内容, 使用mybatis-plus自带CRUD语句或者构造器拼接语句时, mapper通常为空
public interface AreaMapper extends BaseMapper<Area> {
//通过mybatis-plus提供的注解,直接自定义SQL
@Select("select name from area where sort > ${sort}")
List<String> getBySort2(@Param("sort")int sort);
}
public interface IAreaService {
public Area getById(String id);
public List<Area> selectAll();
public int updateByPrimaryKeySelective(Area record);
public int deleteByPrimaryKey(String id);
public int insertSelective(Area record);
public List<Area> getBySort();
public List<String> getBySort2(int sort);
}
Mybatis-Plus使用SQL的3种常见方法:
a. 使用mybatis-plus自带CRUD方法: 直接用mapper的自带方法
b. 使用mybatis-plus提供的条件构造器,拼接where条件
c. 使用@Select,@Update等注解, 自己写SQL+参数
@Service
public class AreaServiceImpl implements IAreaService {
@Autowired
public AreaMapper areaMapper;
//使用mybatis-plus自带CRUD方法
@Override
public Area getById(String id) {
return areaMapper.selectById(id);
}
@Override
public List<Area> selectAll() {
return areaMapper.selectList(null);
}
@Override
@Transactional
public int updateByPrimaryKeySelective(Area record) {
return areaMapper.updateById(record);
}
@Override
public int deleteByPrimaryKey(String id) {
return areaMapper.deleteById(id);
}
@Override
public int insertSelective(Area record) {
return areaMapper.insert(record);
}
//使用mybatis-plus提供的条件构造器,拼接条件
@Override
public List<Area> getBySort(){
QueryWrapper<Area> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().gt(Area::getSort, 40)
.lt(Area::getSort, 80);
return areaMapper.selectList(queryWrapper);
}
//通过mybatis-plus提供的注解,直接自定义SQL(定义在mapper中)
@Override
public List<String> getBySort2(int sort){
return areaMapper.getBySort2(sort);
}
}
@RestController
@RequestMapping("/area")
public class AreaController {
@Autowired
private IAreaService areaService;
@Autowired
private DbpropertiesService dbproService;
@Autowired
private Area area;
@Resource
protected HttpServletRequest request;
@RequestMapping(value = "/getAreaInfo",method=RequestMethod.GET)
public Area getAreaInfo(@RequestParam(value="id") String id) {
area = areaService.getById(id);
return area;
}
@RequestMapping(value = "/getAreaAllInfo",method=RequestMethod.GET)
public List<Area> getAreaInfo() {
List<Area> arlist = areaService.selectAll();
return arlist;
}
@RequestMapping(value ="/updateAreaName",method=RequestMethod.PUT)
public int updateAreaInfo(@RequestParam(value="id") String id,@RequestParam(value="name",required=false) String name,@RequestParam(value="sort",required=false) Integer sort) {
area.setId(id);
area.setName(name);
area.setSort(sort);
int ar = areaService.updateByPrimaryKeySelective(area);
return ar;
}
@RequestMapping(value ="/deleteAreaName",method=RequestMethod.DELETE)
public int deleteAreaInfo(@RequestParam(value="id") String id) {
int ar = areaService.deleteByPrimaryKey(id);
return ar;
}
// @RequestMapping(value ="/insertAreaName",method=RequestMethod.POST)
// public int insertAreaInfo(@RequestParam(value="id") String id,@RequestParam(value="name",required=false) String name,@RequestParam(value="sort",required=false) Integer sort) {
// area.setId(id);
// area.setName(name);
// area.setSort(sort);
// int ar = areaService.insertSelective(area);
// return ar;
// }
@RequestMapping(value ="/insertAreaName",method=RequestMethod.POST)
public int insertAreaInfo(@RequestBody Area area) {
int ar = areaService.insertSelective(area);
return ar;
}
@RequestMapping(value ="/selectBySort",method=RequestMethod.GET)
public List<Area> selectAreaSort() {
List<Area> arList = areaService.getBySort();
return arList;
}
@RequestMapping(value ="/selectBySort2",method=RequestMethod.GET)
public List<String> selectAreaSort2(@RequestParam(value="sort") int sort) {
List<String> arList = areaService.getBySort2(sort);
return arList;
}
}
参考文档:
https://mp.baomidou.com/
数据源是数据库连接的规范接口
Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是:
org.apache.tomcat.jdbc.pool.DataSource
com.zaxxer.hikari.HikariDataSource
org.apache.commons.dbcp.BasicDataSource
org.apache.commons.dbcp2.BasicDataSource
在不指定数据源类型时, SpringBoot默认使用tomcat.jdbc
如果需要使用第三方数据源, 比如Druid, 步骤如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
spring.datasource.type需要指定为Druid
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
其他的Druid自有属性,可以写在properties中也可以写在Druid的配置类中
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidConfiguration {
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize = 5;
private int minIdle = 5;
private int maxActive = 10;
private int maxWait = 2;
private int timeBetweenEvictionRunsMillis = 1000 * 60;
private int minEvictableIdleTimeMillis = 1000 * 60 * 30;
private String validationQuery;
private boolean testWhileIdle = false;
private boolean testOnBorrow = true;
private boolean testOnReturn = false;
private boolean poolPreparedStatements = false;
private int maxPoolPreparedStatementPerConnectionSize = -1;
private String filters;
private boolean useGlobalDataSourceStat = false;
private String connectionProperties;
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSource2Config {
private String url;
private String username;
private String password;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);// 用户名
dataSource.setPassword(password);// 密码
return dataSource;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Druid监控配置:
ServletRegistrationBean
FilterRegistrationBean
事务管理器配置:
PlatformTransactionManager
package com.example.demo.dao.druid;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
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.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean druidServlet() {
//logger.info("init Druid Servlet Configuration ");
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid/*");
Map<String, String> initParameters = new HashMap<String, String>();
initParameters.put("loginUsername", "admin");
initParameters.put("loginPassword", "admin");
initParameters.put("resetEnable", "false");
initParameters.put("allow", "");
initParameters.put("deny", "");
servletRegistrationBean.setInitParameters(initParameters);
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
@Bean
@Primary
public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
//Druid配置Bean
@Component
@ConfigurationProperties(prefix = "spring.datasource")
class DruidDataSourceProperties {
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize = 5;
private int minIdle = 5;
private int maxActive = 10;
private int maxWait = 2;
private int timeBetweenEvictionRunsMillis = 1000 * 60;
private int minEvictableIdleTimeMillis = 1000 * 60 * 30;
private String validationQuery;
private boolean testWhileIdle = false;
private boolean testOnBorrow = true;
private boolean testOnReturn = false;
private boolean poolPreparedStatements = false;
private int maxPoolPreparedStatementPerConnectionSize = -1;
private String filters = "stat";
private boolean useGlobalDataSourceStat = false;
private String connectionProperties;
@Bean //声明其为Bean实例,将数据源设置为druid
@Primary //在同样的DataSource中,首先使用被标注的DataSource
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
//configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
System.err.println("druid configuration initialization filter: " + e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public int getInitialSize() {
return initialSize;
}
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMaxWait() {
return maxWait;
}
public void setMaxWait(int maxWait) {
this.maxWait = maxWait;
}
public int getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public int getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
}
public String getValidationQuery() {
return validationQuery;
}
public void setValidationQuery(String validationQuery) {
this.validationQuery = validationQuery;
}
public boolean isTestWhileIdle() {
return testWhileIdle;
}
public void setTestWhileIdle(boolean testWhileIdle) {
this.testWhileIdle = testWhileIdle;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public boolean isTestOnReturn() {
return testOnReturn;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public boolean isPoolPreparedStatements() {
return poolPreparedStatements;
}
public void setPoolPreparedStatements(boolean poolPreparedStatements) {
this.poolPreparedStatements = poolPreparedStatements;
}
public int getMaxPoolPreparedStatementPerConnectionSize() {
return maxPoolPreparedStatementPerConnectionSize;
}
public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
public boolean isUseGlobalDataSourceStat() {
return useGlobalDataSourceStat;
}
public void setUseGlobalDataSourceStat(boolean useGlobalDataSourceStat) {
this.useGlobalDataSourceStat = useGlobalDataSourceStat;
}
public String getConnectionProperties() {
return connectionProperties;
}
public void setConnectionProperties(String connectionProperties) {
this.connectionProperties = connectionProperties;
}
}