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会自动引入
<!--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文件中设置基础配置
#设置连接数据库的url、username、password,这三部分不能省略
spring:datasource:url: jdbc:mysql://localhost:3306/hr?serverTimezone=Asia/Shanghai&characterEncoding=utf8username: rootpassword: 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;}@Overridepublic 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 {@Autowiredprivate LocationsMapper locationsMapper;@Testpublic void testGetLocationsAll() {List<Locations> locationsAll = locationsMapper.getLocationsAll();for (Locations locations : locationsAll) {System.out.println(locations);}}
}
③**application.yml开启驼峰规则
**
#开启驼峰规则
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 {@Autowiredprivate LocationsMapper locationsMapper;@Testpublic void testGetLocationsAll() {List<Locations> locationsAll = locationsMapper.getLocationsAll();for (Locations locations : locationsAll) {System.out.println(locations);}}@Testpublic void testAddLocations() {int rows = locationsMapper.addLocations();System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");}@Testpublic void testUpdateLocations() {int rows = locationsMapper.updateLocations();System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");}@Testpublic 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文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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文件所在路径,否则会找不到资源
mybatis:mapper-locations: classpath: mapper文件所在路径
①**application.yml
**
#设置连接数据库的url、username、password,这三部分不能省略
spring:datasource:url: jdbc:mysql://localhost:3306/hr?serverTimezone=Asia/Shanghai&characterEncoding=utf8username: rootpassword: root
#开启驼峰规则
mybatis:configuration:map-underscore-to-camel-case: true#指定mapper文件路径mapper-locations: classpath:mapper/*.xml
6.6 测试查询
①**TestMyBatisXml
**
java">/*** 用于测试基于MyBatis注解开发的入门案例*/
@SpringBootTest
public class TestMyBatisXml {@Autowiredprivate JobsMapper jobsMapper;@Testpublic 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
**
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 {@Autowiredprivate JobsMapper jobsMapper;@Testpublic void testGetJobsAll() {List<Jobs> all = jobsMapper.getJobsAll();for (Jobs jobs : all) {System.out.println(jobs);}}@Testpublic void testInsert() {int rows = jobsMapper.insertJobs();System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");}@Testpublic void testUpdate() {int rows = jobsMapper.updateJobs();System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");}@Testpublic 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