真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot-甜蜜的整合MyBatis&注解方式&配置方式

前言

整合Mybtis對于Spring Boot來說,是非常簡單的, 通過這一篇文章, 你可以無壓力快速入門,不過開始之前我要說一下我的版本信息:

創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計,興安盟網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:興安盟等地區(qū)。興安盟做網(wǎng)站價格咨詢:028-86922220

  • maven 3.2.5

  • jdk 1.8

  • Spring Boot 2.1.6

創(chuàng)建項目

依然是使用idea的自動化配置, 不過這里,我們需要勾選以下依賴:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

如果你勾選了 MyBatis , 你會發(fā)現(xiàn)你的pom文件里有 :

		
?org.mybatis.spring.boot
?mybatis-spring-boot-starter
?2.1.0
?

這條依賴

只要是帶 *-spring-boot-starter的,都是Spring Boot官方推薦的, 這里的mybatis就是, 讓我們來看一下mybatis包下的所有包:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

我們發(fā)現(xiàn)它引入了, mybatis-spring 的包等等,以及還有mybatis-spring-boot-autoconfigure, 這個是自動配置的意思, 對于Spring Boot來說,自動配置是一大特點

配置Druid數(shù)據(jù)源

Spring Boot2.x的數(shù)據(jù)源 hikari 的, 而1.x則是 Tomcat的, 所以我們要配置以下自己的數(shù)據(jù)源

?
?com.alibaba
?druid
?1.1.16
?

引入這個依賴就好了

然后在 application.yml 配置文件下:

spring:
?datasource:
?password:?root
?username:?root
?url:?jdbc:MySQL://localhost:3306/mybatis?serverTimezone=UTC
?driver-class-name:?com.mysql.cj.jdbc.Driver
?type:?com.alibaba.druid.pool.DruidDataSource
?initialSize:?5
?minIdle:?5
?maxActive:?20
?maxWait:?60000
?timeBetweenEvictionRunsMillis:?60000
?minEvictableIdleTimeMillis:?300000
?validationQuery:?SELECT?1?FROM?DUAL
?testWhileIdle:?true
?testOnBorrow:?false
?testOnReturn:?false
?poolPreparedStatements:?true
?#?配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
?filters:?stat,wall,log4j
?maxPoolPreparedStatementPerConnectionSize:?20
?useGlobalDataSourceStat:?true
?connectionProperties:?druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

下面這一堆的屬性是不生效的, 如果想要生效, 需要特殊配置一下, Druid監(jiān)控也配置了:

package?com.carson.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.sql.DataSource;
import?java.util.Arrays;
import?java.util.HashMap;
import?java.util.Map;
@Configuration
public?class?DruidConfig?{
?@ConfigurationProperties(prefix?=?"spring.datasource")
?@Bean
?public?DataSource?druid()?{
?return?new?DruidDataSource();
?}
?//?配置?Druid?監(jiān)控
?//1)?配置一個管理后臺的Servlet
?@Bean
?public?ServletRegistrationBean?statViewServlet()?{
?ServletRegistrationBean?bean?=?new?ServletRegistrationBean(new?StatViewServlet(),?"/druid/*");
?Map?initParams?=?new?HashMap<>();
?//?這里是?druid?monitor(監(jiān)視器)的?賬號密碼,?可以任意設(shè)置
?initParams.put("loginUsername",?"admin");
?initParams.put("loginPassword",?"123456");
?initParams.put("allow",?"");
?initParams.put("deny",?"192.123.11.11");
?//?設(shè)置初始化參數(shù)
?bean.setInitParameters(initParams);
?return?bean;
?}
?//?2)配置一個監(jiān)控的?filter
?@Bean
?public?FilterRegistrationBean?webStatFilter()?{
?FilterRegistrationBean?bean?=?new?FilterRegistrationBean();
?bean.setFilter(new?WebStatFilter());
?Map?initParams?=?new?HashMap<>();
?initParams.put("exclusions","*.js,*.css,/druid/*");
?bean.setInitParameters(initParams);
?bean.setUrlPatterns(Arrays.asList("/*"));
?return?bean;
?}
}

啟動主類, 查看是否可以進(jìn)入到?德魯伊監(jiān)視器, 如果你報錯了請?zhí)砑?log4j 依賴:

?
?log4j
?log4j
?1.2.17
?

查看效果:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

利用SpringBoot建表

然后在 resources/sql 下引入兩個建表的sql文件:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

  • department.sql:

SET?FOREIGN_KEY_CHECKS?=?0;
--?----------------------------
--?Table?structure?for?department
--?----------------------------
DROP?TABLE?IF?EXISTS?`department`;
CREATE?TABLE?`department`?(
?`id`?INT(11)?NOT?NULL?AUTO_INCREMENT,
?`departmentName`?VARCHAR(255)?DEFAULT?NULL,
?PRIMARY?KEY?(`id`)
)
?ENGINE?=?InnoDB
?AUTO_INCREMENT?=?1
?DEFAULT?CHARSET?=?utf8;
  • employee.sql:

SET?FOREIGN_KEY_CHECKS?=?0;
--?----------------------------
--?Table?structure?for?employee
--?----------------------------
DROP?TABLE?IF?EXISTS?`employee`;
CREATE?TABLE?`employee`?(
?`id`?INT(11)?NOT?NULL?AUTO_INCREMENT,
?`lastName`?VARCHAR(255)?DEFAULT?NULL,
?`email`?VARCHAR(255)?DEFAULT?NULL,
?`gender`?INT(2)?DEFAULT?NULL,
?`d_id`?INT(11)?DEFAULT?NULL,
?PRIMARY?KEY?(`id`)
)
?ENGINE?=?InnoDB
?AUTO_INCREMENT?=?1
?DEFAULT?CHARSET?=?utf8;

并且在 application.yml 文件下寫入:

?schema:
?-?classpath:sql/department.sql
?-?classpath:sql/employee.sql
?initialization-mode:?always

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

schema`是與 password/username 等等同級的,哦對了, 如果你是 springboot 2.x版本以上的, 你可能需要加上initialization-mode這個屬性。

運行主類, 查看是否建表成功,

如果你的程序在設(shè)置sql文件后 啟動報錯了:

  • 重啟 idea (重啟大法好啊!)

  • 查看 schema是否配置對了 sql文件的名字

  • schema:

  • -(空格)classpath:sql/xxx.sql

  • 注意格式

對應(yīng)數(shù)據(jù)庫實體類

  • Employee.java

package?com.carson.domain;
public?class?Employee?{
?private?Integer?id;
?private?String?lastName;
?private?Integer?gender;
?private?String?email;
?private?Integer?dId;
?public?Integer?getId()?{
?return?id;
?}
?public?void?setId(Integer?id)?{
?this.id?=?id;
?}
?public?String?getLastName()?{
?return?lastName;
?}
?public?void?setLastName(String?lastName)?{
?this.lastName?=?lastName;
?}
?public?Integer?getGender()?{
?return?gender;
?}
?public?void?setGender(Integer?gender)?{
?this.gender?=?gender;
?}
?public?String?getEmail()?{
?return?email;
?}
?public?void?setEmail(String?email)?{
?this.email?=?email;
?}
?public?Integer?getdId()?{
?return?dId;
?}
?public?void?setdId(Integer?dId)?{
?this.dId?=?dId;
?}
}
  • Department.java

package?com.carson.domain;
public?class?Department?{
?private?Integer?id;
?private?String?departmentName;
?public?Integer?getId()?{
?return?id;
?}
?public?void?setId(Integer?id)?{
?this.id?=?id;
?}
?public?String?getDepartmentName()?{
?return?departmentName;
?}
?public?void?setDepartmentName(String?departmentName)?{
?this.departmentName?=?departmentName;
?}
}

記得把剛才我配置文件的 schema屬性全部注釋掉, 我們不希望下次運行的時候會再次創(chuàng)建表

數(shù)據(jù)庫交互

- 注解版

  • 建立一個 Mapper, 把sql語句直接寫在上面

package?com.carson.mapper;
import?com.carson.domain.Department;
import?org.apache.ibatis.annotations.*;
//?指定這是一個?mapper
@Mapper
public?interface?DepartmentMapper?{
?@Select("select?*?from?department?where?id=#{id}")
?public?Department?getDepById(Integer?id);
?@Delete("delete?from?department?where?id=#{id}")
?public?int?deleteDepById(Integer?id);
?@Insert("insert?into?department(departmentName)?values(#{departmentName})")
?public?int?insertDept(Department?department);
?@Update("update?department?set?departmentName=#{departmentName}?where?id=#{id}")
?public?int?updateDept(Department?department);
}

然后寫一個Controller :

package?com.carson.controller;
import?com.carson.domain.Department;
import?com.carson.mapper.DepartmentMapper;
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?//?代表返回?json?數(shù)據(jù)的?controller
public?class?DeptController?{
?@Autowired
?DepartmentMapper?departmentMapper;
?@GetMapping("/dept/{id}")
?public?Department?getDept(@PathVariable("id")?Integer?id)?{
?return?departmentMapper.getDepById(id);
?}
?@GetMapping
?public?Department?inserDept(Department?department)?{
?departmentMapper.insertDept(department);
?return?department;
?}
}
  • 通過?@PathVariable?可以將?URL?中占位符參數(shù)綁定到控制器處理方法的入?yún)⒅校篣RL 中的 {xxx} 占位符可以通過@PathVariable(“xxx“) 綁定到操作方法的入?yún)⒅小?/p>

啟動主類, 輸入這個: localhost:8080/dept?departmentName=AA , 這是往數(shù)據(jù)庫增加一條數(shù)據(jù):

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

然后查詢: localhost:8080/dept/3 , 我數(shù)據(jù)庫id是3, 所以我要查詢3:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

不過發(fā)現(xiàn)一個問題, 在插入數(shù)據(jù)的時候獲取不到 id:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

所以我們要使用一個@Options注解:

?@Options(useGeneratedKeys?=?true,keyProperty?=?"id")
?@Insert("insert?into?department(departmentName)?values(#{departmentName})")
?public?int?insertDept(Department?department);

添加到剛才 mapper中insert 的 @value注解上面

  • useGeneratedKeys : 使用生成的主鍵

  • keyProperty: 意思是 Department 里面的哪個屬性是主鍵, 就是我們的 id

試著插入一條數(shù)據(jù):

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

但是實際忘記注釋掉 schema , 導(dǎo)致每次運行都會重新創(chuàng)建數(shù)據(jù)庫, 各位要注意

還有一個問題

我們把數(shù)據(jù)庫的字段名改成 department_name 而實體類是departmentName;

并且把sql語句也改正

?@Options(useGeneratedKeys?=?true,keyProperty?=?"id")
?@Insert("insert?into?department(department_name)?values(#{departmentName})")
?public?int?insertDept(Department?department);
?@Update("update?department?set?department_name=#{departmentName}?where?id=#{id}")
?public?int?updateDept(Department?department);

然后在進(jìn)行查詢操作的話:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

我們發(fā)現(xiàn)獲取不到 departmentName 了, 以前Spring 我們是使用配置文件來應(yīng)對這種情況的, 但是我們現(xiàn)在沒有了xml文件,我們該怎么辦呢?

世上無難事

創(chuàng)建自定義配置類:

package?com.carson.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()?{
?return?new?ConfigurationCustomizer()?{
?@Override
?public?void?customize(org.apache.ibatis.session.Configuration?configuration)?			?{
?configuration.setMapUnderscoreToCamelCase(true);
?}
?};
?}
}

注意這里面的 setMapUnderscoreToCamelCase,意思是:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

翻譯大法好啊, 我的英文太差了, 再次訪問 http://localhost:8080/dept/1 查詢操作, 我發(fā)現(xiàn)已經(jīng)不是 null了:

{"id":1,"departmentName":"jackMa"}

馬總正確的展現(xiàn)出來了!

MapperScan注解

掃描器, 用來掃描mapper接口的

我把它標(biāo)記到 啟動類 上(你可以標(biāo)記在任何地方):

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

指定一個包,它會掃描這個包下所有的 mapper 接口, 防止你的mapper文件太多, 并且忘記加 @mapper 注解, 這樣可以提高正確性

- 配置文件版

注解版貌似很方便, 但是如果遇到復(fù)雜的sql , 比如動態(tài)sql等等, 還是需要用 xml 配置文件的;

創(chuàng)建一個 Employee 的Mapper接口:

package?com.carson.mapper;
import?com.carson.domain.Employee;
public?interface?EmployeeMapper?{
?public?Employee?getEmpById(Integer?id);
?public?void?insertEmp(Employee?employee);
}

在 resources/mybatis 下創(chuàng)建一個 mybatis-config.xml 全局配置文件:


?

在 resources/mybatis/mapper 包下創(chuàng)建 EmployeeMapper.xml 映射文件:





?
?select?*?from?employee?where?id?=?#{id}
?
?
?insert?into?employee(lastName,email,gender,d_id)?values?(#{lastName},	?		#{email},#{gender},#{d_id})
?

然后再 application.yml 配置文件下添加一條配置:

#?mybatis屬性是跟?spring?屬性平級的,?千萬不要把格式搞錯
mybatis:
#?指定全局配置文件
?config-location:?classpath:mybatis/mybatis-config.xml
#?指定?mapper?映射文件,?*?代表所有?
?mapper-locations:?classpath:mybatis/mapper/*.xml

讓我們在剛才的DeptController類里添加一段 Controller :

?@Autowired
?EmployeeMapper?employeeMapper
?
?@GetMapping("emp/{id}")
?public?Employee?getEmp(@PathVariable("id")?Integer?id)?{
?return?employeeMapper.getEmpById(id);
?}

啟動主類訪問一下 localhost:8080/emp/1 , 查看結(jié)果:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

我們發(fā)現(xiàn) dId沒有查詢出來, 這是因為 數(shù)據(jù)庫字段是 d_id , 而java里是 dId , 所以我們要像剛才注解版一樣, 配置一樣?xùn)|西, 讓我們打開 mapper全局配置文件添加:


?

?
?
?

mapUnderscoreToCamelCase : 是否開啟自動駝峰命名規(guī)則(camel case)映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類似映射。

再次試驗:

Spring Boot-甜蜜的整合MyBatis&注解方式&配置方式

可以看出已經(jīng)成功了

無論是哪種版本. 要根據(jù)自己的實際情況來定, 注解雖然方便, 但是復(fù)雜業(yè)務(wù)的就不行了


當(dāng)前標(biāo)題:SpringBoot-甜蜜的整合MyBatis&注解方式&配置方式
網(wǎng)站URL:http://weahome.cn/article/gcggec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部