一、MyBatis 介绍
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
二、开发工具
ntelliJ IDEA 2019.2.2 x64
三、新建项目
- 选择左侧的Spring Initializr,jdk要求1.8及以上,选择默认的Default下一步:
-
自己修改项目名,后选择下一步:
-
选择项目所需要的依赖,这个页面是选择你工程中需要用到的依赖,因为我们的目标是web项目使用mybatis所以在web模块中勾选Spring Web,在SQL中依次勾选Jdbc API、Mybatis Framework、Mysql Driver。然后下一步直到finish即可。
-
接着项目就会下载我们需要的依赖,如果之前没有下过,可能会稍等几分钟。
-
生成的pom.xml文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring_mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring_mybatis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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.2.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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
四、配置文件及代码编写
- 创建包
- 在bean下创建User类
package com.example.bean;
public class User {
private Integer no;
private String Name;
private String passWord;
public Integer getNo() {
return no;
}
public void setNo(Integer no) {
this.no = no;
}
public String getPassWord() {
return passWord;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "User{" +
"no=" + no +
", Name='" + Name + '\'' +
", passWord='" + passWord + '\'' +
'}';
}
}
- 在controller下创建UserController类
package com.example.controller;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/testBoot")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("getUser/{no}")
public String GetUser(@PathVariable int no) {
return userService.Sel(no).toString();
}
}
- 在mapper下创建UserMapper类
package com.example.mapper;
import com.example.bean.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
List<User> Sel(int no);
}
- 在service下创建UserService类
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> Sel(int no){
return userMapper.Sel(no);
}
}
- 在resource创建文件夹mapping,并创建.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.example.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.bean.User">
<result column="no" jdbcType="INTEGER" property="no" />
<result column="Name" jdbcType="VARCHAR" property="Name" />
<result column="passWord" jdbcType="VARCHAR" property="passWord" />
</resultMap>
<select id="Sel" resultType="com.example.bean.User">
select * from user where no = #{no}
</select>
</mapper>
- 找到application.properties文件,写入以下代码
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/studentadmin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.typeAliasesPackage=com.example.bean
mybatis.mapperLocations=classpath:mapping/*.xml
server.port=8080
注:mybatis.mapperLocations=classpath:mapping/*.xml 中mapping为你在resource下创建的文件名。
五、实现
- 最后启动,浏览器输入地址看看吧:http://localhost:8080/testBoot/getUser/1
六、总结
1). JDBC:
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能
- Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。
- 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
- 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
2)Mybatis
-
优化获取和释放
-
SQL统一管理,对数据库进行存取操作(修改SQL一个需要重新编译 一个不需要)
-
生成动态SQL语句
-
能够对结果集进行映射(一个是resultset一个可以映射成JavaBean对象、一个Map、一个List等等)
-
mybatis提供了一级和二级缓存(需要配置打开),强大的动态sql,自动化的session管理,都比手工维护来的方便和安全。