一、Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
二、Druid依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
三、yml配置
spring:
datasource:
username: root
password: root
#mysql8版本以上的驱动包,需要指定以下时区
url: jdbc:mysql://127.0.0.1:3306/mybatis?serverTimezone=GMT%2B8
#mysql8版本以上指定新的驱动类
driver-class-name: com.mysql.cj.jdbc.Driver
#引入Druid数据源
type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置, DataSourceProperties中没有相关属性,默认无法绑定
initialSize: 8
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,logback
maxPoolPreparedStatementPerConnectionSize: 25
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
四、创建config文件
package com.example.springbootmybatis.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
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 javax.servlet.Filter;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 绑定Druid相关信息
* @Auther: xrzhang
*/
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid() {
return new DruidDataSource();
}
/**
* 配置一个druid的监控
* 1. 配置一个druid的后台 管理servlet
* 2. 配置一个druid的filter
*
*/
// 1. 配置一个druid的后台管理servlet
@Bean
public ServletRegistrationBean statViewServlet() {
//注意:请求是 /druid/*
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
//设置初始化参数值
Map<String, String> initParam = new HashMap<>();
initParam.put(StatViewServlet.PARAM_NAME_USERNAME, "root");
initParam.put(StatViewServlet.PARAM_NAME_PASSWORD, "123");
//如果不写,则默认所有ip都可以访问
initParam.put(StatViewServlet.PARAM_NAME_ALLOW, "");
initParam.put(StatViewServlet.PARAM_NAME_DENY, "192.168.10.1");
bean.setInitParameters(initParam);
return bean;
}
//2. 配置一个druid的filter
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
Map<String, String> initPrams = new HashMap<>();
initPrams.put(WebStatFilter.PARAM_NAME_EXCLUSIONS, "*.js,*.css,/druid/*");
bean.setInitParameters(initPrams);
//设置拦截请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
四、访问:http://localhost:8080/druid/,出现,说明配置成功
五、创建三个实体
1、Bill
package com.example.springbootmybatis.entities;
import java.util.Date;
/**
* 帐单实体类
* @Title: Provider
* @Description: com.mengxuegu.springboot.entities
* @Auther: www.mengxuegu.com
* @Version: 1.0
*/
public class Bill {
private Integer bid;
// 账单编码
private String billCode;
// 商品名称
private String billName;
// 商品单位
private String billCom;
// 商品数量
private Integer billNum;
// 总金额
private Double money;
// 供应商
private Provider provider;
// 是否付款 0 未付款, 1已付款
private Integer pay;
// 创建时间
private Date createDate;
public Bill() {}
public Bill(Integer bid, String billCode, String billName, String billCom, Integer billNum, Double money, Provider provider, Integer pay) {
this.bid = bid;
this.billCode = billCode;
this.billName = billName;
this.billCom = billCom;
this.billNum = billNum;
this.money = money;
this.provider = provider;
this.pay = pay;
this.createDate = new Date();
}
@Override
public String toString() {
return "Bill{" +
"bid=" + bid +
", billCode='" + billCode + '\'' +
", billName='" + billName + '\'' +
", billCom='" + billCom + '\'' +
", billNum=" + billNum +
", money=" + money +
", provider=" + provider +
", pay=" + pay +
", createDate=" + createDate +
'}';
}
public Integer getBid() {
return bid;
}
public void setBid(Integer bid) {
this.bid = bid;
}
public String getBillCode() {
return billCode;
}
public void setBillCode(String billCode) {
this.billCode = billCode;
}
public String getBillName() {
return billName;
}
public void setBillName(String billName) {
this.billName = billName;
}
public String getBillCom() {
return billCom;
}
public void setBillCom(String billCom) {
this.billCom = billCom;
}
public Integer getBillNum() {
return billNum;
}
public void setBillNum(Integer billNum) {
this.billNum = billNum;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
public Provider getProvider() {
return provider;
}
public void setProvider(Provider provider) {
this.provider = provider;
}
public Integer getPay() {
return pay;
}
public void setPay(Integer pay) {
this.pay = pay;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
2、provider
package com.example.springbootmybatis.entities;
import java.util.Date;
/**
* 供应商实体类
* @Title: Provider
* @Description: com.mengxuegu.springboot.entities
* @Auther: www.mengxuegu.com
* @Version: 1.0
*/
public class Provider {
private Integer pid;
//供应商编码
private String providerCode;
//供应商名称
private String providerName;
//联系人
private String people;
//联系电话
private String phone;
//联系地址
private String address;
//传真
private String fax;
//描述
private String describe;
// 创建时间
private Date createDate;
public Provider() {
}
public Provider(Integer pid, String providerCode, String providerName, String people, String phone, String address, String fax, String describe) {
this.pid = pid;
this.providerCode = providerCode;
this.providerName = providerName;
this.people = people;
this.phone = phone;
this.address = address;
this.fax = fax;
this.describe = describe;
this.createDate = new Date();
}
@Override
public String toString() {
return "Provider{" +
"pid=" + pid +
", providerCode='" + providerCode + '\'' +
", providerName='" + providerName + '\'' +
", people='" + people + '\'' +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
", fax='" + fax + '\'' +
", describe='" + describe + '\'' +
", createDate=" + createDate +
'}';
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getProviderCode() {
return providerCode;
}
public void setProviderCode(String providerCode) {
this.providerCode = providerCode;
}
public String getProviderName() {
return providerName;
}
public void setProviderName(String providerName) {
this.providerName = providerName;
}
public String getPeople() {
return people;
}
public void setPeople(String people) {
this.people = people;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getFax() {
return fax;
}
public void setFax(String fax) {
this.fax = fax;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date date) {
this.createDate = date;
}
}
3、User
package com.example.springbootmybatis.entities;
import java.util.Date;
/**
* 用户实体类
* @Title: Provider
* @Description: com.mengxuegu.springboot.entities
* @Auther: www.mengxuegu.com
* @Version: 1.0
*/
public class User {
private Integer id;
//用户名
private String username;
//真实姓名
private String realName;
//用户密码
private String password;
//性别:1 女 2 男
private Integer gender;
//生日
private Date birthday;
//1管理员 2经理 3普通用户
private Integer userType;
public User() {
}
public User(String username, Integer gender) {
this.username = username;
this.gender = gender;
}
public Integer getId() {
return id;
}
public User(Integer id, String username, String realName, String password, Integer gender, Integer userType) {
this.id = id;
this.username = username;
this.realName = realName;
this.password = password;
this.gender = gender;
this.birthday = new Date();
this.userType = userType;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getUserType() {
return userType;
}
public void setUserType(Integer userType) {
this.userType = userType;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", realName='" + realName + '\'' +
", password='" + password + '\'' +
", gender=" + gender +
", birthday=" + birthday +
", userType=" + userType +
'}';
}
}
六、创建映射接口
package com.example.springbootmybatis.mapper;
import com.example.springbootmybatis.entities.Provider;
import org.apache.ibatis.annotations.*;
@Mapper
public interface ProviderMapper {
@Select("select * from provider where pid=#{proId}")
Provider getProviderById(Integer proId);//注意,#{里面的东西是这里的参数名}
@Options(useGeneratedKeys = true, keyProperty = "pid")
//指定哪一个实体类中的属性封装主键值
@Insert("insert into provider(providerName) values (#{providerName})")
int addProvider(Provider provider);
@Delete("delete from provider where pid=#{pid}")
int deleteProviderByPid(Integer pid);
@Update("update provider set providerName=#{providerName} where pid=#{pid}")
int updateProvider(Provider provider);
}
七、写控制层
package com.example.springbootmybatis.controller;
import com.example.springbootmybatis.entities.Provider;
import com.example.springbootmybatis.mapper.ProviderMapper;
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;
@RestController
public class ProviderController {
@Autowired
ProviderMapper providerMapper;
@GetMapping("/provider/{pid}")
public Provider getProvider(@PathVariable("pid")Integer pid){
Provider provider = providerMapper.getProviderById(pid);
return provider;
}
@GetMapping("/provider")
public Provider addProvider(Provider provider){
providerMapper.addProvider(provider);
return provider;
}
}
八、关于属于库属性名与实体属性名不一样的问题
比如:数据库属性名有一个"provider_code",实体类中则定义的是骆驼命名法“providerCode”
package com.example.springbootmybatis.config;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer(){
ConfigurationCustomizer conf = new ConfigurationCustomizer(){
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
return conf;
}
}
最后,整体的文件夹是这样的:
九、相关改进
可以将mapper文件夹下的ProviderMapper文件的@Mapper去掉,在main()函数上注解MapperScan("com.example.springbootmybatis.mapper"),这样就可以不用每个mapper文件都加@Mapper注解了。