1.概述
SQL聲明可以定義在XML文件或註解中。註解方式可以參考:《SpringBoot整合MyBatis》。
MyBatis強大在映射聲明這裏。同時映射器文件也很簡單。與等價的JDBC代碼對比,你會發現使用MyBatis幫你省了95%的代碼。MyBatis框架的目的是聚焦於SQL。使用XML比使用註解更靈活,調優也更方便。MyBatis也推薦使用XML定義SQL聲明。映射器XML文件只有少量的一些頂層元素:
- cache:指定的命名空間的緩存配置
- cache-ref:從其他命名空間引用緩存配置
- resultMap:最複雜也是最強大的元素,它可以描述如何從數據庫結果集中加載你的對象
- parameterMap:在MyBatis3.5.4中棄用了!
- sql:可重用的SQL塊,它可以被其他SQL聲明引用
- insert:一個映射的INSERT聲明
- update:一個映射的UPDATE聲明
- delete:一個映射的DELETE聲明
- select:一個映射的SELECT聲明
2.例子
項目的總體結體:
~/Desktop/MyBatisXMLDemo$ tree -L 8
.
├── GroceryDemo.iml
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── wong
│ ├── controller
│ │ └── PersonController.java
│ ├── MainApplication.java
│ └── mybatis
│ ├── bean
│ │ └── Person.java
│ ├── mapper
│ │ └── PersonMapper.java
│ └── service
│ ├── PersonServiceImpl.java
│ └── PersonService.java
└── resources
├── config
│ └── application.yml
└── mybatis
└── mapper
└── PersonMapper.xml
2.1.pom.xml添加依賴
主要的依賴:
- springboot web的起步依賴
- mysq驅動
- mybatis框架
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wong</groupId>
<artifactId>xmlDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!--springboot開發web項目的起步依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去掉內嵌tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mysql的jdbc驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--MyBatis整合到springboot項目-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!--日誌框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<!--jetty容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<finalName>Demo</finalName>
<plugins>
<!--maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2.application.yml配置數據庫及MyBatis
spring:
datasource:
# 數據源基本配置
url: jdbc:mysql://127.0.0.1:3306/MyDB
username: root
password: 1qaz@4321
driver-class-name: com.mysql.jdbc.Driver
# 數據源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置監控統計的filters,去掉後監控界面sql無法統計,wall用於防火牆
filters: stat,wall,slf4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
mybatis:
# 指定映射器的xml文件的位置
mapper-locations: classpath:mybatis/mapper/*.xml
2.3.創建實體類Person
package com.wong.mybatis.bean;
public class Person{
private int id;
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Person{id:"+this.id+",name:"+this.name+",age:"+this.age+"}";
}
}
2.4.創建映射器
package com.wong.mybatis.mapper;
import com.wong.mybatis.bean.Person;
import java.util.List;
public interface PersonMapper {
// 增加
int insert(Person person);
// 刪除
int deleteByPrimaryKey(Integer id);
// 修改
int updateByPrimaryKey(Person person);
// 查詢
Person selectByPrimaryKey(Integer id);
// 方法名就是 xml中的id
List<Person> selectAllPerson();
}
/**
* 下面被註釋的部分是使用註解完成映射的
*/
//@Mapper
//public interface PersonMapper {
// // 增加
// @Insert("insert into person(id,name,age) values(#{id},#{name},#{age})")
// int insert(Person person);
// // 刪除
// @Delete("delete from person where id = #{id}")
// int deleteByPrimaryKey(Integer id);
// // 修改
// @Update("update person set name = #{name},age = #{age} where id = #{id}")
// int updateByPrimaryKey(Person person);
// // 查詢
// @Select("select id,name,age from person where id=#{id}")
// Person selectByPrimaryKey(Integer id);
// @Select("select id,name,age from person")
// List<Person> selectAllPerson();
//}
2.5.創建與映射器對應的SQL的xml文件
因爲我們在application.yml指定了SQL映射的xml文件的位置是classpath:mybatis/mapper/*.xml
因此我在項目的resources目錄下創建目錄mybatis/mapper,並在其中添加映射器對應的SQL映射文件PersonMapper.xml:
一般來說,爲了方便代碼的閱讀與管理,我們都會將SQL的映射文件的命名與映射器類的名稱保持一致。事實上,你可以定義任意名字。這對綁定過程影響不大,因爲它最終是根據mapper標籤裏的命名空間namespace來進行綁定的。
<?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.wong.mybatis.mapper.PersonMapper">
<insert id="insert">
insert into person(id,name,age)
values(#{id},#{name},#{age})
</insert>
<delete id="deleteByPrimaryKey">
delete from person where id = #{id}
</delete>
<update id="update">
update person
set name = #{name},
age = #{age}
where id = #{id}
</update>
<select id="selectByPrimaryKey" resultType="com.wong.mybatis.bean.Person">
select * from person where id = #{id}
</select>
<select id="selectAllPerson" resultType="com.wong.mybatis.bean.Person">
select * from person
</select>
</mapper>
2.6.在啓動類添加映射器掃描註解
如果使用註解進行sql與接口綁定的,那麼只需要在mapper映射器上使用@Mapper註解就可以進行綁定,但是現在映射器類與SQL的定義都在不同的文件裏,因此需要通過某種途徑將兩者綁定起來。解決方式:
1.application.yml裏指定了SQL映射文件的路徑
2.在SpringBoot啓動類裏添加@MapperScan註解,當應用啓動時,就會根據這些信息進行掃描並進行綁定。
package com.wong;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.wong.mybatis.mapper") // 映射器類的包路徑
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
2.7.創建服務類
服務類是專門用來完成複雜業務的地方。
2.7.1.定義服務類接口
package com.wong.mybatis.service;
import com.wong.mybatis.bean.Person;
import java.util.List;
public interface PersonService {
// 增加
int insertPerson(Person person);
// 刪除
int deletePersonById(Integer id);
// 修改
int updatePersonById(Person person);
// 查詢
Person selectPersonById(Integer id);
List<Person> selectAllPerson();
}
2.7.2.服務類接口的實現
要使用@Service註解,讓Spring初始化它,並將其放入Spring容器中。
package com.wong.mybatis.service;
import com.wong.mybatis.bean.Person;
import com.wong.mybatis.mapper.PersonMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PersonServiceImpl implements PersonService{
@Autowired
private PersonMapper personMapper;
@Override
public int insertPerson(Person person) {
return personMapper.insert(person);
}
@Override
public int deletePersonById(Integer id) {
return personMapper.deleteByPrimaryKey(id);
}
@Override
public int updatePersonById(Person person) {
return personMapper.updateByPrimaryKey(person);
}
@Override
public Person selectPersonById(Integer id) {
return personMapper.selectByPrimaryKey(id);
}
@Override
public List<Person> selectAllPerson() {
return personMapper.selectAllPerson();
}
}
2.8.創建controller
在controller裏通過服務類調用數據庫。使用註解@Autowired,將spring容器中的PersonService實例,注入本地變量personService,進行業務調用。
package com.wong.controller;
import com.wong.mybatis.bean.Person;
import com.wong.mybatis.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class PersonController {
// 將spring容器中的PersonService實例,注入本地變量personService
@Autowired
private PersonService personService;
// add
@RequestMapping(value = "/add")
public String addStudents(){
Person student = new Person();
student.setName("Tom");
student.setAge(12);
int rs = personService.insertPerson(student);
return "插入結果:"+rs;
}
// select
@RequestMapping(value = "/findAll")
public String findAllStudents(){
List<Person> students = personService.selectAllPerson();
students.stream().forEach(System.out::println);
return students.toString()+"";
}
@RequestMapping(value = "findById")
public String find(Integer id){// 參數名爲id
Person person = personService.selectPersonById(id);
return person.toString();
}
}
3.測試
3.1.運行項目
~/Desktop/MyBatisXMLDemo$ mvn clean spring-boot:run