1 学习目标
- 了解MyBatis的介绍和历史
- 重点掌握SpringBoot整合MyBatis
- 重点掌握MyBatis基于注解方式
- 重点掌握MyBatis基于XML方式
2 MyBatis介绍
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
3 MyBatis的历史
- 原是Apache的一个开源项目iBatis, 该项目最初由Clinton Begin创建。2005年,该项目被提交到了Apache Software Foundation。但是由于名称与IBM拥有的商标iSeries和DB2的i系列冲突,因此项目名称与2010年被更改为MyBatis。
4 SpringBoot整合MyBatis
4.1 项目准备
①在JSDSecondStage项目下,创建MyBatisDemo模块,并指定版本号为2.5.4
②为项目添加相关依赖
注意: 无需引入spring对jdbc的驱动,因为MyBatis会自动引入
html
<!--mysql数据库驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--引入相关mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
4.2 配置数据源
- 在application.yml文件中设置基础配置
html
#设置连接数据库的url、username、password,这三部分不能省略
spring:
datasource:
url: jdbc:mysql://localhost:3306/hr?serverTimezone=Asia/Shanghai&characterEncoding=utf8
username: root
password: root
5 MyBatis基于注解方式
5.1 编写实体类
-
ORM(Object Relational Mapping)
:对象关系映射,指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。其具体的映射规则是:一张表对应一个类,表中的各个字段对应类中的属性,表中的一条数据对应类的一个对象 -
MyBatis可以自动将查询的结果与对应实体类映射,所以需要准备与查询的表相关联的实体类,需要注意的是,实体类的属性需要和表字段保持一致
-
由于此处我们的入门案例是查询locations表,所以创建Locations类,并在该类中声明与locations表字段相同的属性(属性声明时,最好开启驼峰规则)
①**Locations
**
java
public class Locations {
private Integer locationId;
private String streetAddress;
private String postalCode;
private String city;
private String stateProvince;
private String countryId;
public Integer getLocationId() {
return locationId;
}
public void setLocationId(Integer locationId) {
this.locationId = locationId;
}
public String getStreetAddress() {
return streetAddress;
}
public void setStreetAddress(String streetAddress) {
this.streetAddress = streetAddress;
}
public String getPostalCode() {
return postalCode;
}
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStateProvince() {
return stateProvince;
}
public void setStateProvince(String stateProvince) {
this.stateProvince = stateProvince;
}
public String getCountryId() {
return countryId;
}
public void setCountryId(String countryId) {
this.countryId = countryId;
}
@Override
public String toString() {
return "Locations{" +
"locationId=" + locationId +
", streetAddress='" + streetAddress + '\'' +
", postalCode='" + postalCode + '\'' +
", city='" + city + '\'' +
", stateProvince='" + stateProvince + '\'' +
", countryId='" + countryId + '\'' +
'}';
}
}
5.2 定义接口和方法
-
MyBatis需要准备一个接口类,作为Mapper,该接口中的每一个方法可以绑定一条SQL,实现调用接口方法即可调用SQL的功能
-
在 MyBatis 中,Mapper 接口的命名一般要遵循一定的规范,以便于开发人员理解和维护代码。以下是一些常用的命名规范:
- Mapper 接口的名称应该与对应的 SQL 语句相对应,可以根据表名或者业务功能命名,比如 UserMapper、OrderMapper 等。
- Mapper 接口的方法名应该能够清晰地表示这个方法所执行的 SQL 语句,一般可以使用动词加上表名或者业务功能的方式来命名,比如 addUser、updateOrder 等。
- Mapper 接口中的方法参数名应该与 SQL 语句中的参数名相对应,这样可以提高代码的可读性和可维护性。
①**LocationsMapper
**
java
//指定这是一个操作数据库的mapper
@Mapper
public interface LocationsMapper {
@Select("SELECT * FROM locations")
public List<Locations> getLocationsAll();
}
②**TestMyBatisAnno
**
java
/**
* 用于测试基于MyBatis注解开发的入门案例
*/
@SpringBootTest
public class TestMyBatisAnno {
@Autowired
private LocationsMapper locationsMapper;
@Test
public void testGetLocationsAll() {
List<Locations> locationsAll = locationsMapper.getLocationsAll();
for (Locations locations : locationsAll) {
System.out.println(locations);
}
}
}
③**application.yml开启驼峰规则
**
html
#开启驼峰规则
mybatis:
configuration:
map-underscore-to-camel-case: true
5.3 测试增删改查
①**LocationsMapper
**
java
//指定这是一个操作数据库的mapper
@Mapper
public interface LocationsMapper {
@Select("SELECT * FROM locations")
public List<Locations> getLocationsAll();
@Insert("INSERT INTO locations values(6666,'TEST','TEST','TEST','TEST','MX')")
public int addLocations();
@Update("UPDATE locations SET city='BEIJING' WHERE location_id = 6666")
public int updateLocations();
@Delete("DELETE FROM locations WHERE location_id = 6666")
public int deleteLocations();
}
②**TestMyBatisAnno
**
java
/**
* 用于测试基于MyBatis注解开发的入门案例
*/
@SpringBootTest
public class TestMyBatisAnno {
@Autowired
private LocationsMapper locationsMapper;
@Test
public void testGetLocationsAll() {
List<Locations> locationsAll = locationsMapper.getLocationsAll();
for (Locations locations : locationsAll) {
System.out.println(locations);
}
}
@Test
public void testAddLocations() {
int rows = locationsMapper.addLocations();
System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");
}
@Test
public void testUpdateLocations() {
int rows = locationsMapper.updateLocations();
System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");
}
@Test
public void testDeleteLocations() {
int rows = locationsMapper.deleteLocations();
System.out.println(rows > 0 ? "删除成功!" : "删除失败!!");
}
}
5.4 @MapperScan的使用
- 由于Mapper接口是需要使用@Mapper注解的,但是随着后续的开发,可能这样的Mapper接口会变得很多,那么可能每个接口都要加@Mapper注解,就会变得很麻烦,所以可以在SpringBoot的主启动类上添加@MapperScan注解,并指定要扫描的mapper包,这样的话,就会自动去获取指定包下的接口了
①**MyBatisDemoApplication
**
java
//指定mapper接口所在包,当主启动类执行时,会自动扫描指定包下的接口
@MapperScan(value = "cn.tedu.mapper")
@SpringBootApplication
public class MyBatisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MyBatisDemoApplication.class, args);
}
}
6 MyBatis基于XML文件
6.1 编写实体类
- 由于此处我们的入门案例是查询jobs表,所以将Jobs类复制到项目中
6.2 定义接口和方法
- MyBatis需要准备一个接口类,作为Mapper,该接口中的每一个方法可以绑定一条SQL,实现调用接口方法即可调用SQL的功能
①**JobsMapper
**
java
package cn.tedu.mapper;
import cn.tedu.pojo.Jobs;
import java.util.List;
public interface JobsMapper {
public List<Jobs> getJobsAll();
}
6.3 定义SQL文件
- MyBatis基于XML文件的方式,是通过让SQL文件和指定的接口绑定,然后SQL语句统一书写在XML文件中
- 一般情况下,MyBatis的mapper.xml和mapper接口会同名,原因是为了方便开发人员进行代码的管理和维护。
①JobsMapper.xml文件
html
<?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="cn.tedu.mapper.JobsMapper">
</mapper>
6.4 定义SQL
-
在SQL文件中,可以书写任意的SQL,只不过需要写在对应的标签中,并且id还要和对应的接口名相同
-
在SQL文件中通过select标签定义查询表所有记录的SQL语句
- id的值必须要和绑定的接口中的方法名相同
- resultType则表示查询的结果封装到那个实体类中,也就是返回值的类型,如果返回的是集合,则定义集合中元素的类型
-
在SQL文件中通过insert ,update ,delete标签定义增删改表中记录的SQL语句
①JobsMapper.xml文件
html
<?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="cn.tedu.mapper.JobsMapper">
<select id="getJobsAll" resultType="cn.tedu.pojo.Jobs">
SELECT * FROM jobs
</select>
</mapper>
6.5 指定MyBatis中mapper文件扫描路径
- MyBatis在使用XML方式开发时,必须要在配置文件中指定mapper文件所在路径,否则会找不到资源
html
mybatis:
mapper-locations: classpath: mapper文件所在路径
①**application.yml
**
html
#设置连接数据库的url、username、password,这三部分不能省略
spring:
datasource:
url: jdbc:mysql://localhost:3306/hr?serverTimezone=Asia/Shanghai&characterEncoding=utf8
username: root
password: root
#开启驼峰规则
mybatis:
configuration:
map-underscore-to-camel-case: true
#指定mapper文件路径
mapper-locations: classpath:mapper/*.xml
6.6 测试查询
①**TestMyBatisXml
**
java
/**
* 用于测试基于MyBatis注解开发的入门案例
*/
@SpringBootTest
public class TestMyBatisXml {
@Autowired
private JobsMapper jobsMapper;
@Test
public void testGetJobsAll() {
List<Jobs> all = jobsMapper.getJobsAll();
for (Jobs jobs : all) {
System.out.println(jobs);
}
}
}
6.7 测试增删改操作
①**JobsMapper接口
**
java
public interface JobsMapper {
public List<Jobs> getJobsAll();
public int insertJobs();
public int updateJobs();
public int deleteJobs();
}
②**JobsMapper.xml
**
html
<?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="cn.tedu.mapper.JobsMapper">
<select id="getJobsAll" resultType="cn.tedu.pojo.Jobs">
SELECT job_id, job_title, min_salary, max_salary FROM jobs
</select>
<insert id="insertJobs">
INSERT INTO jobs VALUE ('6666', 'TEST', 10000, 30000)
</insert>
<update id="updateJobs">
UPDATE jobs SET job_title='TEST666' WHERE job_id = '6666'
</update>
<delete id="deleteJobs">
DELETE FROM jobs WHERE job_id = '6666'
</delete>
</mapper>
③**TestMyBatisXml
**
java
/**
* 用于测试基于MyBatis注解开发的入门案例
*/
@SpringBootTest
public class TestMyBatisXml {
@Autowired
private JobsMapper jobsMapper;
@Test
public void testGetJobsAll() {
List<Jobs> all = jobsMapper.getJobsAll();
for (Jobs jobs : all) {
System.out.println(jobs);
}
}
@Test
public void testInsert() {
int rows = jobsMapper.insertJobs();
System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");
}
@Test
public void testUpdate() {
int rows = jobsMapper.updateJobs();
System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");
}
@Test
public void testDelete() {
int rows = jobsMapper.deleteJobs();
System.out.println(rows > 0 ? "删除成功!" : "删除失败!!");
}
}
上一篇文章:SpringBoot整合JDBCTemplate(day34)-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/142098654
下一篇文章:MyBatis的占位符(day36)-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/142969916