MyBatis保姆级理解与使用专业学习eclipse版

1. MyBatis简介

1.1 MyBatis的特点

 

 

 

 

1.2 MyBatis简介

 

MyBatis是一个半自动化的持久化层的ORM框架。

所谓的持久化层就是dao

ORM:(Object Relation Mapping) 对象关系映射

Java中的对象Bean 与数据库中的表建立映射关系。表中建立关系是通过外键->主键

优势:只需要配置好配置文件,那么久可以通过操作Java中的对象就能影响数据库表中的数据。

 

半自动化:

全自动化Hibernate:无需手写SQL,自动生成sql语句,自动生成的SQL,性能太低。无法优化SQL语句。当然Hibernate也支持原生手写SQL,但是还是写的太麻烦了。

MyBatis是半自动化,需要手写SQL,但是SQL可以做自动的拼接。

 

ibatis

 

1.3 MyBatis中文网

https://mybatis.net.cn/

 

什么是 MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOPlain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

 

 

 

 

 

 

2. 搭建Mybaits框架

导入jar

编写配置文件

使用核心类库

 

2.1 通过maven下载mybaits

 

 

 

 

 

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis</artifactId>

    <version>3.5.6</version>

</dependency>

 

2.2 建立maven工程&编写pom文件

2.2.1 新建mavenweb项目

 

 

 

 

 

2.2.2 mybaits需要的pom文件内容

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.hy</groupId>

<artifactId>springmvc006</artifactId>

<version>0.0.1</version>

<packaging>war</packaging>

 

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<maven.compiler.encoding>UTF-8</maven.compiler.encoding>

</properties>

 

<dependencies>

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->

<!-- logback日志 -->

<dependency>

<groupId>ch.qos.logback</groupId>

<artifactId>logback-classic</artifactId>

<version>1.2.3</version>

</dependency>

 

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.20</version>

</dependency>

 

 

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->

<!-- 数据库连接池 -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.2.9</version>

</dependency>

 

<!—mybaits的核心jar-->

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis</artifactId>

    <version>3.5.6</version>

</dependency>

<!—mybaits的核心jar-->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

<scope>test</scope>

</dependency>

 

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.49</version>

</dependency>

<!-- mybaits相关jar-->

</dependencies>

 

 

<build>

<plugins>

<!-- 指定jdk,防止update project -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.8</source>

<target>1.8</target>

<!-- 项目编码 -->

<encoding>UTF-8</encoding>

</configuration>

</plugin>

</plugins>

</build>

</project>

 

 

 

 

 

mybaits的核心就这一个jar包,所以是轻量级的。

2.3 准备工作

2.3.1 建立数据库mybaitsdb01,建表,插入数据

 

 

 

 

 

 

create table sys_emp(

emp_id bigint auto_increment,

emp_name varchar(20),

emp_pwd varchar(20),

emp_gender enum('m','f'),

emp_salary double(10,5),

primary key(emp_id)

);

 

INSERT INTO `sys_emp` VALUES (null, '范冰冰', 'fbb', 'f', 100.5);

INSERT INTO `sys_emp` VALUES (null, '李冰冰', 'lbb', 'f', 300);

INSERT INTO `sys_emp` VALUES (null, '张彬彬', 'zbb', 'm', 599);

INSERT INTO `sys_emp` VALUES (null, '万茜', 'wq', 'm', 4000);

INSERT INTO `sys_emp` VALUES (null, '李若彤', 'lrt', 'm', 5000.8);

 

select * from `sys_emp`;

 

2.3.2 编写实体bean

package com.hy.bean;

 

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

 

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Emp {

private Long empId;

private String empName;

private String empPwd;

private String empGender;

private Double empSalary;

 

//构造方法(ID)

public Emp(String empName, String empPwd, String empGender, Double empSalary) {

super();

this.empName = empName;

this.empPwd = empPwd;

this.empGender = empGender;

this.empSalary = empSalary;

}

}

 

2.3.2 编写mapper接口(dao接口)

EmpMapper

 

package com.hy.mapper;

 

import java.util.List;

import java.util.Map;

 

import org.apache.ibatis.annotations.Param;

 

import com.hy.bean.Emp;

 

/**

 * 声明这个接口是为了方便上层代码调用Mybatis的具体功能

 * Mapper配置文件的namespace属性要和接口的全类名一致,这样才能通过接口找到Mapper配置

 * 接口中的方法名要和Mapper配置文件中SQL语句标签的id属性一致,这样才能通过方法名找到具体SQL语句

 * 又因为在Mapper配置文件中id属性的值是不能重复的,所以当前接口中方名也不能重复——当前接口中的方法不能重载

 */

public interface EmpMapper {

    /**

     * 通过这个方法对应Mapper配置文件中的SQL语句

     * @param empId 当前方法的参数对应SQL语句中#{empId}声明的参数

     * @return 当前方法的返回值类型和resultType属性指定的类型一致

     */

    abstract public Emp selectEmpById(Long empId);

 

    /**

     * 执行插入操作

     * @param emp

     * @return 受影响的行数

     */

    abstract public int insertEmp(Emp emp);

 

    /**

     * 执行删除操作

     * @param empId

     * @return 受影响的行数

     */

    abstract public int deleteById(long empId);

 

    /**

     * 执行更新操作

     * @param harry

     * Mybatis返回的受影响行数也可以不使用

     */

    abstract public void updateEmp(Emp harry);

 

    /**

     * 模糊查询,根据员工姓名片段查询对应数据

     * @param 查询条件

     * @return 查询结果

     */

    abstract public Emp selectEmpByName(String empName);

 

    // 使用@Param注解给方法形参命名,具体用法参照Mapper配置文件

    abstract public void updateSalaryById(@Param("empId") Long empId, @Param("empSalary") Double salary);

 

    abstract public void updateByMap(Map<String, Object> paramMap);

 

    abstract public Integer selectCount();

 

    abstract public Map<String, Object> selectForMap(int empId);

 

    abstract public List<Emp> selectAll();

 

    // 执行插入数据操作,自增主键会放入实体类对象的id属性

    // 方法返回值还是受影响行数

    abstract public int insertWithKey(Emp emp);

 

    abstract public List<Emp> selectWithResultMap();

}

 

 

这里我们换成了EmpMapper,新名字我们就适应新的写法,去掉前面的I,当然也可以不去掉叫IEmpMapper

 

 

 

 

 

2.4 编写配置文件

Mybaits比较特殊有两个配置文件,一是,核心(全局)配置文件,二是,映射文件(编写sql语句的映射文件)

 

2.4.1 如何编写核心(全局)配置文件[mybatis-config.xml]

位置:resources目录下,只有一个

名称:核心配置名字推荐使用:mybaits-config.xml。

这里,我们习惯上命名为mybaits-config.xml,这个文件名只是建议,并非强制要求的。将来和Spring整合之后,这个配置文件可以省略。目前大家操作时,可以直接复制,粘贴。

 

将来mybaitsSpring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略,省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置。

 

2.4.2 编写核心配置文件

核心配置模板,直接从官网拷贝。

 

 

 

 

 

 

<?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>

<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="org/mybatis/example/BlogMapper.xml" />

</mappers>

</configuration>

 

将黄色的地方改写

 

<?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>

<!-- environments表示配置Mybaits的开发环境,可以配置多个环境使用default属性指定实际运行

时使用的环境。default属性的取值是environment标签的id属性的值。

 -->

<environments default="development">

<!-- environment表示配置Mybaits的一个具体的环境 -->

<environment id="development">

<!-- Mybaits的内置的事务管理器 -->

<transactionManager type="JDBC" />

<!-- 配置数据源,这里使用的是Mybaits内置的数据源 -->

<dataSource type="POOLED">

<!-- 建立数据库连接的具体信息 -->

<property name="driver" value="com.mysql.jdbc.Driver" />

<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisdb01?characterEncoding=UTF8" />

<property name="username" value="root" />

<property name="password" value="root" />

</dataSource>

</environment>

</environments>

<!-- 设置映射文件的路径,还没有写 -->

<mappers>

<!-- Mapper注册:指定Mybaits映射文件的具体位置 -->

<!-- mapper标签:配置一个具体的Mapper映射文件 -->

<!-- resource属性:指定Mapper映射文件的实际位置,

这里是以类路径根目录为基础的相对路径

Maven工程的目录结构来说,resources目录下的内容会直接放入类路径

所以,这里我们以resources目录为基准

-->

<mapper resource="org/mybatis/example/BlogMapper.xml" />

</mappers>

</configuration>

 

 

在实际的工作中,一般都有是哪个环境,开发,测试,部署,设置连接的数据库都可以不一样简单的说就是,可以连接不同的数据库,比如:连接Oracle的环境。

 

<environment id="development"> 可以设置不同的环境

 

2.4.2.1 重点总结:

事务管理器和数据源以后都是在spring中进行配置的,spring在它的声明式事务里面, Spring给我们提供了事务管理器,Spring帮我们做事务的管理,包括开启事务,提交事务或是回滚事务,包括释放数据库的连接,管理数据源,这些都是Spring帮我们去管理。所以这一部分配置以后都要移植到Spring的配置文件中的。

 

现在暂时在这里面配置好,帮助我们去学习,操作就行了。

 

 

2.4.3 如何编写SQL语句的映射文件

 

映射文件位置:resources/mapper => 相当于dao

映射文件名称:XxxMapper <=>接口名Mapper,比如EmpMapper ,DeptMapper

 

将来mybaitsSpring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置

 

但是XxxMapper映射文件必须保留。

 

 

2.4.3.1 ORM相关概念

 

 

 

 

2.4.4 设置相关映射文件

2.4.4.1 resources目录下设置mappers目录

 

 

 

2.4.4.2 拷贝xml文件里的内容

从官网拷贝:https://mybatis.net.cn/getting-started.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="org.mybatis.example.BlogMapper">

  <select id="selectBlog" resultType="Blog">

    select * from Blog where id = #{id}

  </select>

</mapper>

 

 

 

 

 

注意:以前我们叫dao,现在叫mapper,本质上都是持久化层的类,只是命名习惯的区别而已。

注意:EmpMapper.xml所在的目录要和mybatis-config.xml中使用的mapper标签配置的一致。

 

2.4.4.3 编写SQL语句

<?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属性: Mybaits全局范围内找到一个具体的Mapper配置 -->

<!-- 为了方便通过接口全类名来找到Mapper配置文件,通常将namespace属性设为接口的全类名 -->

<!--

程序通过全局配置文件中的mapper标签找到当前的映射文件。

当前的XxxMapper映射文件,才能进一步找到这里配置的SQL语句

为了让一个Java XxxMapper接口(Dao接口)直接对应这个XxxMapper映射文件,并且直接调用方法

,必须让XxxMapper接口的全类名作为这个 映射文件中的mapper标签的namespace属性值。

 -->

<mapper namespace="com.hy.mapper.EmpMapper">

<!--

编写具体的SQL语句:

select语句使用select标签

insert语句使用insert标签

update语句使用update标签

delete语句使用delete标签

-->

 

<!--

id属性:使用id属性唯一标记一条SQL语句

  注意:id名与方法名保持一致。(最好保持一致,不一致新方法不能使用)

-->

 

<!-- resultType属性:指定封装查询结果的Java实体类的全类名

Mybaits负责解析结果集,将解析得到的数据封装到设置的JavaBean类中。

 -->

<select id="selectEmpById" resultType="com.hy.bean.Emp">

<!-- Mybatis负责把SQL语句中的#{empId}部分替换成"?"占位符

 #{}内部还是要声明一个见名知意的名称,一般与JavaBean中属性名保持一致

 #{empId}这里是为了方便接收Java程序传过来的参数数据

 -->

select emp_id empId,emp_name empName,emp_pwd empPwd,emp_gender empGender , emp_salary empSalary

 from sys_emp where emp_id = #{empId}

</select>

</mapper>

 

 

 

 

 

 

这里是符合SQL语句的命名标准,但是不符合JavaBean的命名习惯,所以要加别名。

 

2.4.4.4 注册XxxMapper.xml映射文件

所谓的注册Mapper:就是指定Mybaits映射文件的具体位置。

mybatis-config.xml全局配置文件中,通过mapper标签,配置一个具体的XxxMapper.xml映射文件。

resource属性:指定Mapper映射文件的实际存储位置,对于maven工程的目录结构来说,Maven工程的目录结构来说,resources目录下的内容会直接放入类路径

所以,这里我们以resources目录为基准 ,不加/的相对路径,就是相对resources目录 。

 

 

 

2.5 Junit中编写测试类

2.5.1 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

 

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。

 

 

2.5.2 具体操作

package com.hy.mybatis.test;

 

import java.io.IOException;

import java.io.InputStream;

 

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Test;

 

import com.hy.bean.Emp;

import com.hy.mapper.EmpMapper;

 

public class TestEmpMapper {

@Test

public void testSelectEmpById() throws IOException {

//1. 使用MybaitsResources类来读取Mybatis全局配置文件

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

 

//2. 创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

 

//3. 调用builder对象的build方法创建SqlSessionFactory类的对象(工厂设计模式)

SqlSessionFactory sessionFactory = builder.build(inputStream);

 

//4. 通过SqlSessionFactory对象开启一个从Java程序到数据库的会话

SqlSession sqlSession = sessionFactory.openSession();

 

//5. 通过sqlSession对象找到Mapper映射文件中可以执行的SQL语句,并执行 namespace

Object obj = sqlSession.selectOne("com.hy.mapper.EmpMapper.selectEmpById",1);

 

//6. 打印结果

System.out.println(obj);

 

//7. 提交事务

sqlSession.commit();

 

//8. 关闭sqlSession

sqlSession.close();

}

 

@Test

public void testSelectEmpById2() throws IOException {

//1. 使用MybaitsResources类来读取Mybatis全局配置文件

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

 

//2. 创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

 

//3. 调用builder对象的build方法创建SqlSessionFactory类的对象(工厂设计模式)

SqlSessionFactory sessionFactory = builder.build(inputStream);

 

//4. 通过SqlSessionFactory对象开启一个从Java程序到数据库的会话

SqlSession sqlSession = sessionFactory.openSession();

 

//5. 通过sqlSession对象通过反射机制,直接生成一个EmpMapper接口的匿名类的对象

EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);

 

 

//6. 执行语句,打印结果

Emp emp = empMapper.selectEmpById(2L);

System.out.println(emp);

 

//7. 提交事务

sqlSession.commit();

 

//8. 关闭sqlSession

sqlSession.close();

}

}

 

 

1,23,4,7,8都是暂时写的,等和Spring整合后,代码就非常简单了。我们这里已经可以看出,不用写EmpMapper的实现类了。只写接口即可。

 

posted @ 2022-08-21 20:31  雾里看瓜  阅读(162)  评论(0编辑  收藏  举报