SpringBoot数据访问——整合MyBatis
文章目录
0.MyBatis简介
官方定义:MyBatis是支持定制化SQL,存储过程以及高级映射的持久层框架。
Github的一段描述:MyBatis SQL映射器框架使将关系数据库与面向对象的应用程序一起使用变得更加容易。MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合。相对于对象关系映射工具,简单性是MyBatis数据映射器的最大优势。
MyBatis避免了几乎所有的JDBC代码和手动配置参数以及获取结果集,可以使用简单的XML或注解,将接口和普通Java对象(POJO)映射成数据库的记录。
因此有两种SQL映射写法:XML文件和注解。后续均会提及,XML文件运用得多。
1.导入依赖
Maven工程下pom.xml,除了使用MyBatis之外,数据库选用的是MySQL。
<!-- MyBatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
可以看到MyBatis启动器是以mybatis开头的,这个启动器是由MyBatis社区开发的,官方启动器名称格式为spring-boot-starter-模块名。
2.配置数据库连接
默认的application.proterties
#mysql数据库配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://*.*.*.*:3306/数据库名称
spring.datasource.username=账号
spring.datasource.password=密码
或者用yml格式:
#配置数据源
spring:
datasource:
username: 账号
password: 密码
url: jdbc:mysql://*.*.*.*:3306/数据库名称
driver-class-name: com.mysql.jdbc.Driver
3.初始化测试表
这里就用了一个简单了表,包含ID(主键且自增),ENGLISH,CHINESE这三个字段。
4.编写数据库中表对应的JavaBean
entity包下建立word类:
import lombok.Data;
@Data
public class Word {
private String english;
private String chinese;
}
这里使用了Lombok插件中的两个注解 @Data和@NonNull
@Data注解在类自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
更多关于Lombok的安装与使用可查看:IntelliJ IDEA Java高率开发插件Lombok
5.MyBatis的简单使用——注解版
5.1 使用注解编写mapper中的SQL注入
编写使用注解来编写mapper:关于单词的常规CRUD操作,详细可见注释:
@mapper用于标注这是个操作数据库的mapper,当mapper较多时,一般在启动类上使用注解@MapperScan(“com.piao.springboot_mybatis.mapper”) //扫描Mapper接口。
package com.piao.springboot_mybatis.mapper;
import com.piao.springboot_mybatis.entity.Word;
import org.apache.ibatis.annotations.*;
import java.util.List;
//注解版
//@Mapper注解指定这是个操作数据库的mapper
@Mapper
public interface WordMapper {
//添加单词信息
@Insert("INSERT into word(english,chinese) values(#{english},#{chinese})")
void insertWord(Word word);
//根据id更新删除信息
@Delete("DELETE FROM word WHERE id=#{id}")
void deleteWordById(Integer id);
//根据id更新单词信息
@Update("UPDATE word SET english=#{english},chinese=#{chinese} WHERE id=#{id}")
void UpdateWordById(Integer id, String english, String chinese);
//根据id查询单词信息
@Select("SELECT english,chinese FROM word WHERE id=#{id}")
Word getWordById(Integer id);
//查询所有单词
@Select("SELECT id,english,chinese FROM word")
List<Word> getAllWord();
}
5.2 Service层
service包下的WordService接口类:
package com.piao.springboot_mybatis.service;
import com.piao.springboot_mybatis.entity.Word;
import java.util.List;
public interface WordService {
//添加单词信息
void insertWord(Word word);
//根据id更新删除信息
void deleteWordById(Integer id);
//根据id更新单词信息
void UpdateWordById(Integer id, String english, String chinese);
//根据id查询单词信息
Word getWordById(Integer id);
//查询所有单词
List<Word> getAllWord();
}
service包下的WordService接口实现类:@Service标注为Service类,使用@Resource注入Mapper接口对象。
import com.piao.springboot_mybatis.entity.Word;
import com.piao.springboot_mybatis.mapper.WordMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class WordServiceImpl implements WordService {
//注入Mapper接口对象
@Resource
WordMapper wordMapper;
@Override
public void insertWord(Word word) {
wordMapper.insertWord(word);
}
@Override
public void deleteWordById(Integer id) {
wordMapper.deleteWordById(id);
}
@Override
public void UpdateWordById(Integer id, String english, String chinese) {
wordMapper.UpdateWordById(id, english, chinese);
}
@Override
public Word getWordById(Integer id) {
return wordMapper.getWordById(id);
}
@Override
public List<Word> getAllWord() {
return wordMapper.getAllWord();
}
}
5.3 控制层
这里加了详细且原始的数据校验判空处理,当然有更优雅的方式…这里就不展开了。
推荐这位大佬的博客:啥?听说你还在手写复杂的参数校验?
package com.piao.springboot_mybatis.controller;
import com.piao.springboot_mybatis.entity.Word;
import com.piao.springboot_mybatis.service.WordService;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Controller
public class MyBatisController {
//存储预返回页面的结果对象
private Map<String, Object> result;
//注入业务对象
@Resource
private WordService wordService;
//添加单词信息
@PostMapping("/insertWord")
@ResponseBody
public Map<String, Object> insertWord(Word word) {
result = new HashMap<>();
//数据校验 判空!
if (null == word) {
result.put("message", "插入的单词为空");
return result;
}
if (null == word.getChinese() || "".equals(word.getEnglish())) {
result.put("message", "插入的单词中文为空或者为空字符串");
return result;
}
if (null == word.getChinese() || "".equals(word.getChinese())) {
result.put("message", "插入的单词中文为空或者为空字符串");
return result;
}
wordService.insertWord(word);
result.put("message", "插入单词成功");
return result;
}
//根据id查询单词信息
@GetMapping("/getWordById")
@ResponseBody
public Map<String, Object> getWordById(Integer id) {
result = new HashMap<>();
//数据校验 判空!
if (null == id) {
result.put("message", "传入id为空");
return result;
}
result.put("word", wordService.getWordById(id));
result.put("message", "查询单词成功");
return result;
}
//根据id更新单词信息
@PostMapping("/updateWordById")
@ResponseBody
public Map<String, Object> updateWordById(Integer id, String english, String chinese) {
result = new HashMap<>();
//数据校验 判空!
if (null == id) {
result.put("message", "更新的单词id为空");
return result;
}
if (null == english || "".equals(english)) {
result.put("message", "更新的单词中文为空或者为空字符串");
return result;
}
if (null == chinese || "".equals(chinese)) {
result.put("message", "更新的单词中文为空或者为空字符串");
return result;
}
wordService.UpdateWordById(id, english, chinese);
result.put("message", "更新单词成功");
return result;
}
//根据id删除单词信息
@PostMapping("/deleteWordById")
@ResponseBody
public Map<String, Object> deleteWordById(Integer id) {
result = new HashMap<>();
//数据校验 判空!
if (null == id) {
result.put("message", "输入的单词id为空");
return result;
}
wordService.deleteWordById(id);
result.put("message", "删除单词成功");
return result;
}
//查询所有单词
@GetMapping("/getAllWord")
@ResponseBody
public Map<String, Object> getAllWord() {
result = new HashMap<>();
result.puordList", wordService.getAllWord());
result.put("message", "查询所有单词成功");
return result;
}
}
postman测试上述接口,这里不赘述了,都可用,数据判空处理也生效了。
6.MyBatis的简单使用——XML文件
重点!xml文件做SQL映射在实际使用更常用
那么同样是上述的代码,用xml怎么开发mapper接口类中的SQL映射呢?
就是注解版去掉注解,SQL映射按照一定的规范单独写在XML文件中。
6.1 mapper接口类
//XML文件版 SQL映射
@Mapper
public interface WordMapper2 {
//添加单词信息
void insertWord(Word word);
//根据id更新删除信息
void deleteWordById(Integer id);
//根据id更新单词信息
void UpdateWordById(Integer id, String english, String chinese);
//根据id查询单词信息
Word getWordById(Integer id);
//查询所有单词
List<Word> getAllWord();
}
6.2 使用xml写SQL映射
xml写SQL映射:
该xml文件对应的mapper接口卸载mapper标签下,全类名写在namespace下。
<mapper namespace="com.piao.springboot_mybatis.mapper.WordMapper2">
- CRUD分别使用对应得标签:insert,delete,update,select
- id:该条SQL对应的mapper接口类中的方法名
- parameterType:参数类型对应的Javabean,写全类名
- resultType:返回类型对应的Javabean,写全类名
<?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.piao.springboot_mybatis.mapper.WordMapper2">
<insert id="insertWord" parameterType="com.piao.springboot_mybatis.entity.Word">
INSERT into word(english,chinese) values(#{english},#{chinese})
</insert>
<delete id="deleteWordById">
DELETE FROM word WHERE id=#{id}
</delete>
<update id="UpdateWordById" parameterType="com.piao.springboot_mybatis.entity.Word">
UPDATE word SET english=#{english},chinese=#{chinese} WHERE id=#{id}
</update>
<select id="getWordById" resultType="com.piao.springboot_mybatis.entity.Word">
SELECT english,chinese FROM word WHERE id=#{id}
</select>
<select id="getAllWord" resultType="com.piao.springboot_mybatis.entity.Word">
SELECT id,english,chinese FROM word
</select>
</mapper>
6.2 使用xml写Mybatis全局配置文件(可选)
Mybatis全局配置文件模板,使用默认配置可不写:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db/db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mapper/你的mapper.xml"/>
</mappers>
</configuration>
mybatis的xml文件位置可放在资源文件下:
6.4 配置MyBatis
然后在application.properties/application.yml配置,注意和自己的xml文件路径一致:
- mapper-locations配置SQL映射文件
- config-location配置Mybatis全局配置文件
以yml格式为例:
#Mybatis相关配置
mybatis:
config-location: classpath:mybatis/config/mybatis-conifg.xml
mapper-locations: classpath:mybatis/mapper/*.xml
其他的就和注解版没有区别了。