一、 MyBatis简介

1.1 框架概念

框架,就是软件的半成品,完成了软件开发中的通用操作,程序员只需很少或者不用进行加工就能够实现特定功能,从而简化开发人员在软件开发中的步骤,提高开发效率

1.2 常用框架

  • MVC框架:简化了Servlet的开发步骤
    • Struts2
    • SpringMVC
  • 持久层框架:完成数据库操作的框架
    • apache DBUtils
    • Hibernate
    • Spring JPA
    • MyBatis
  • 胶水框架:Spring

SSM:Spring SpringMVC MyBatis

SSH: Spring Struts2 Hibernate

1.3 MyBatis介绍

MyBatis是一个半自动 的ORM 框架

ORM(Object Relational Mapping)对象关系映射,将Java中的一个对象与数据库中一行记录一一对应

ORM框架提供了实体类和数据表的映射关系,通过映射文件的配置,实现对象的持久化

MyBatis特点:

  • 支持自定义SQL、存储过程
  • 对原有的JDBC进行了封装,几乎消除了所有的JDBC代码,让开发者只需关注SQL本身
  • 支持XML和注解配置方式自动完成ORM映射,实现结果映射

二、MyBatis框架部署

框架部署,就是将框架引入到我们的项目中

2.1 创建Maven项目

  • Java工程
  • Web工程

注意: 创建Maven项目时出现,如下错误时:

  1. java.lang.RuntimeException: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exception.ComponentLookupException:\n
  2. com.google.inject.ProvisionException: Unable to provision, see the following errors:

原因是Maven版本过高,解决方法为更改Maven版本(使用IDEA自带的Maven即可)

2.2 在项目中添加MyBatis依赖

  • 在pom.xml中添加依赖
    • mybatis
      1. <dependency>
      2. <groupId>org.mybatis</groupId>
      3. <artifactId>mybatis</artifactId>
      4. <version>3.5.4</version>
      5. </dependency>
  • mysql driver
    1. <dependency>
    2. <groupId>mysql</groupId>
    3. <artifactId>mysql-connector-java</artifactId>
    4. <version>8.0.19</version>
    5. </dependency>

2.3 创建MyBatis配置文件

  • 创建自定义模板:选择recources—-右键New—-编辑文件模板
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4. <configuration>
  5. </configuration>

image.png

  • 在resources中创建名为mybatis-config.xml的文件
  • 在mybatis-config.xml 文件配置数据库连接信息
    1. <environments default="">
    2. <environment id="">
    3. <transactionManager type=""></transactionManager>
    4. <dataSource type=""></dataSource>
    5. </environment>
    6. <environment id="">
    7. <transactionManager type=""></transactionManager>
    8. <dataSource type=""></dataSource>
    9. </environment>
    10. </environments>

    在environments配置数据库连接信息
    在enviroments标签中可以定义多个environment标签,每个environment标签可以定义一套连接配置
    default属性,用来指定使用哪个environment标签

三、MyBatis框架使用

学生信息的数据库操作

3.1 创建数据表

  1. create table tb_students(
  2. sid int primary key auto_increment,
  3. stu_num char(5) not null unique ,
  4. stu_name varchar(20) not null ,
  5. stu_gender char(2) not null ,
  6. stu_age int not null
  7. );

3.2 创建实体类

导入lombok包

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.18.12</version>
  5. <scope>provided</scope>
  6. </dependency>

创建类

image.png

3.3 创建DAO接口,定义操作方法

  1. public interface StudentDAO {
  2. public int insertStudent(Student student);
  3. }

3.4 创建DAO接口的映射文件

  • 在resources 目录下,新建名为mappers 文件
  • 在mappers 中新建名为StudentMapper.xml 的映射文件(根据模板创建) ```xml <?xml version=”1.0” encoding=”UTF-8” ?> <!DOCTYPE mapper
    1. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  1. <br />mapper文件相当于DAO接口的实现类,namespace属性要指定实现DAO接口的全名称
  2. - 在映射文件对DAO中定义的方法进行实现
  3. ```xml
  4. <?xml version="1.0" encoding="UTF-8" ?>
  5. <!DOCTYPE mapper
  6. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  7. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  8. <mapper namespace="com.java.dao.StudentDAO">
  9. <insert id="insertStudent" parameterType="com.java.pojo.Student">
  10. insert into tb_students(stu_num,stu_name,stu_gender,stu_age)
  11. values(#{stuNum},#{stuName},#{stuGender},#{stuAge})
  12. </insert>
  13. <delete id="deleteStudent">
  14. delete from tb_students where stu_num=#{stuNum}
  15. </delete>
  16. </mapper>


其中如果接口中的方法定义了形参类型则parameterType可以不写

3.5 将映射文件添加到主配置文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4. <configuration>
  5. <environments default="mysql">
  6. <environment id="mysql">
  7. <transactionManager type="JDBC"></transactionManager>
  8. <dataSource type="POOLED">
  9. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  10. <property name="url" value="jdbc:mysql://localhost:3306/java_test?serverTimezone=UTC"/>
  11. <property name="username" value="root"/>
  12. <property name="password" value="hsy031122"/>
  13. </dataSource>
  14. </environment>
  15. </environments>
  16. <mappers>
  17. <mapper resource="mappers/StudentMapper.XML"></mapper>
  18. </mappers>
  19. </configuration>

注意:映射文件的后缀名必须大写(StudentMapper.XML)

项目结构

image.png

四、单元测试

4.1 添加单元测试依赖

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.12</version>
  5. <scope>test</scope>
  6. </dependency>

4.2 创建单元测试类

image.png

在类名后面右键—-生成—-测试

image.png

4.3 测试代码

  1. package com.java.dao;
  2. import com.java.pojo.Student;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. public class StudentDAOTest {
  10. @org.junit.Test
  11. public void insertStudent(){
  12. try {
  13. //加载mybatis配置文件
  14. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
  15. SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
  16. //会话工厂
  17. SqlSessionFactory factory=builder.build(is);
  18. //会话(连接)
  19. SqlSession sqlSession=factory.openSession();
  20. //通过会话获取DAO的对象
  21. StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
  22. //测试studentDAO中的方法
  23. int i = studentDAO.insertStudent(new Student(0, "10001", "张三", "男", 21));
  24. //提交事务
  25. sqlSession.commit();
  26. System.out.println(i);
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. @org.junit.Test
  32. public void deleteStudent() {
  33. }
  34. }

五、MyBatis的CRUD操作

案例:学生信息的增删改查

5.1 添加操作

5.2 删除操作

根据学号删除一条学生信息

  • 在StudentDAO中定义删除方法
    image.png
  • 在StudentMapper.XML中对接口方法进行“实现”
    image.png
  • 测试:在Student DAO的测试类中添加测试方法

注:编写代码完成后必须提交事务

  1. @org.junit.Test
  2. public void deleteStudent() {
  3. try {
  4. //加载mybatis配置文件
  5. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
  6. SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
  7. //会话工厂
  8. SqlSessionFactory factory=builder.build(is);
  9. //会话(连接)
  10. SqlSession sqlSession=factory.openSession();
  11. //通过会话获取DAO的对象
  12. StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
  13. //测试studentDAO中的方法
  14. int i = studentDAO.deleteStudent("10001");
  15. sqlSession.commit();
  16. System.out.println(i);
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. }

5.3 修改操作

根据学生学号,修改其他字段的信息