第一步:創建Maven項目
- 添加Maven依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 解決LocalDate問題-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 編寫配置文件application.yml
server:
port: 80
servlet:
context-path: /imbp
spring:
#配置數據源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
# 連接池的配置信息:初始化大小,最小,最大
initial-size: 8
min-idle: 1
max-active: 20
# 配置獲取連接等待超時的時間
max-wait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
min-evictable-idle-time-millis: 300000
#驗證庫是否正常sql
validation-query: select 'x' from dual
#空閒時驗證,防止連接斷開
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打開PSCache,並且指定每個連接上PSCache的大小
pool-prepared-statements: true
max-open-prepared-statements: 20
max-pool-prepared-statement-per-connection-size: 20
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
filters: stat,wall,slf4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合併多個DruidDataSource的監控數據
use-global-data-source-stat: true
#MyBatisPlus相關配置
mybatis-plus:
#mapper映射文件位置,多個目錄用逗號或者分號分隔(告訴 Mapper 所對應的 XML 文件位置)
mapper-locations: classpath:mapper/*.xml
#實體掃描,多個package用逗號或者分號分隔
typeAliasesPackage: com.hc.bean
# 以下配置均有默認值,可以不設置
global-config:
db-config:
#主鍵類型
id-type: auto
table-underline: true
#邏輯刪除配置(下面3個配置)
logic-delete-value: -1
logic-not-delete-value: 1
logic-delete-field: flag
#數據庫大寫下劃線轉換
capital-mode: true
configuration:
# 是否開啓自動駝峯命名規則映射:從數據庫列名到Java屬性駝峯命名的類似映射
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull
jdbc-type-for-null: 'null'
# 如果查詢結果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段
call-setters-on-nulls: true
# 將執行的sql打印出來,在開發或測試的時候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
第二步:編寫配置文件
- MyBatisPlusConfig
@Configuration
public class MyBatisPlusConfig {
/**
* 分頁插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
- DruidConfig
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
/**
* druid 數據源狀態監控
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet(){
//創建servlet註冊實體
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//設置ip白名單
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//設置ip黑名單,如果allow與deny共同存在時,deny優先於allow
servletRegistrationBean.addInitParameter("deny","192.168.0.19");
//設置控制檯管理用戶
servletRegistrationBean.addInitParameter("loginUsername","druid");
servletRegistrationBean.addInitParameter("loginPassword","1234");
//是否可以重置數據
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
/**
* druid 過濾器
* @return
*/
@Bean
public FilterRegistrationBean statFilter(){
//創建過濾器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//設置過濾器過濾路徑
filterRegistrationBean.addUrlPatterns("/*");
//忽略過濾的形式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
我們可以通過網頁的方式查看Druid監控,有關知識請參考博客:SpringBoot整合Druid
第三步:編寫實體類
@Getter
@Setter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "db_test.tb_emp")
public class Emp implements Serializable {
private static final long serialVersionUID = -1696472017703928733L;
@TableId(value = "empno", type = IdType.INPUT)
private Integer empno;
@TableField(value = "ename")
private String ename;
@TableField(value = "job")
private String job;
@TableField(value = "mgr")
private Integer mgr;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@TableField(value = "hiredate")
private LocalDate hiredate;
@TableField(value = "sal")
private BigDecimal sal;
@TableField(value = "comm")
private BigDecimal comm;
@TableField(value = "deptno")
private Integer deptno;
}
第四步:編寫Dao接口及Mapper文件
- EmpMapper.java
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}
- EmpMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hc.mapper.EmpMapper">
</mapper>
第五步:編寫Service接口及實現類
- EmpService
public interface EmpService extends IService<Emp>{
}
- EmpServiceImpl
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService{
}
第六步:編寫Controller
@RestController
@RequestMapping("/emp")
public class EmpController {
@Autowired
private EmpService empService;
@RequestMapping("/getEmpByEmpno")
public Emp getEmpByEmpno(@RequestParam(value = "empno") Integer empno) {
Emp res = empService.getById(empno);
return res;
}
@RequestMapping("/listAll")
public List<Emp> listAll() {
System.out.println(empService);
List<Emp> res = empService.list();
return res;
}
@RequestMapping("/listByCondition")
public List<Emp> listByCondition(String ename, Integer deptno) {
QueryWrapper<Emp> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(Emp::getEname, ename)
.eq(Emp::getDeptno, deptno);
List<Emp> emplist = empService.list(queryWrapper);
return emplist;
}
@RequestMapping("/page")
public IPage<Emp> page(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
//需要在Config配置類中配置分頁插件
IPage<Emp> page = new Page<>(pageNum, pageSize);
IPage<Emp> res = empService.page(page);
return res;
}
//emp/save?empno=1234&ename=zhangsan&job=clerk&mgr=7788&hiredate=1999-09-21&sal=789&deptno=40
@RequestMapping("/save")
public boolean save(Emp emp) {
boolean res = empService.save(emp);
return res;
}
//emp/update?empno=1234&ename=lisi&job=manager&mgr=7788&hiredate=1999-09-21&sal=789&deptno=20
@RequestMapping("/update")
public boolean update(Emp emp) {
boolean res = empService.updateById(emp);
return res;
}
//emp/saveOrUpdate?empno=1234&ename=zhangsan&job=manager&mgr=7788&hiredate=1999-09-21&sal=789&deptno=20
@RequestMapping("/saveOrUpdate")
public boolean saveOrUpdate(Emp emp) {
//實體類ID值存在,如果數據庫存在ID就會更新,如果不存在就會新增
boolean res = empService.saveOrUpdate(emp);
return res;
}
@RequestMapping("/removeById")
public boolean removeById(Integer id) {
boolean res = empService.removeById(id);
return res;
}
}