编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6
目录
前言
“Mybatis框架”,“Mybatis框架“…, 拆解其名词,我们可以得到”Mybatis是一个框架的名字“这一浅显的结论,但是何为框架?何为Mybatis?且看本文为你分解。
一. 什么是Mybatis框架?
1.1 框架是什么?
举个生活中的例子,当我们努力工作,攒钱买房时,买到的房子是可以直接拧包入住吗?当我们花钱购置自己的的个人电脑时,自己的电脑一买回来就可以直接拿来使用的吗?并不是,买到的房子只是毛胚房,需要后期的装修以及添置家具,才能入住;买到的电脑,需要我们首次开机时设置相应的系统参数,比如设置网络与登录账户或者创建账户等等,才能使用。
框架就相当于上述例子中的毛胚房与刚买回但未配置的电脑,是个半成品
,Java程序中的框架也是如此,其他语言中的框架亦是如此。
Java程序中常见的框架【后端开发】有:
Mybatis框架
:持久化层框架【dao层】SpringMVC框架
:控制层框架【Servlet)层】Spring框架
:全能选手
1.2 什么是MyBatis ?
- MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架
- MyBatis避免了几乎所有的DBC代码和手动设置参数以及获取结果集
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的 POJO(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录
- Mybatis是一个半自动的持久化层的ORM(Object Relation Mapping)框架
什么是ORM?
ORM (Object Relation Mapping) --> 【对象 关系 映射】
将java中的对象与数据库中表建立映射关系
优势就是操作java中的对象,就可以影响数据库中表的数据
为何称MyBatis是半自动的?
这是相对于真正的 ORM 框架(例如 Hibernate、Spring Data JPA 等)来说,Mybatis 在对象关系映射方面自动化程度较低。
在 Mybatis 中,开发人员需要手动将 SQL 语句与 Java 对象之间的映射规则定义在 XML 文件或注解中。这意味着,Mybatis 不会自动生成 SQL 语句,并且不会在 Java 对象和数据库表之间进行自动转换。
但是,与此同时,Mybatis 也提供了很多功能上强大的 SQL 语句生成特性,例如:可以动态拼接 SQL 语句、支持使用 DAO 层接口代理执行 SQL 语句等,使得开发人员能够更加灵活地操作数据库。
1.3 MyBatis的参考资料在哪找?
二. 如何搭建Mybatisi框架(入门案例)?
不论导入什么框架,都要历经以下的三步:
- 导入jar包
- 编写配置文件
- 使用核心类库
案例需求:在数据库中建立一个数据表tbl_employee,同时在maven工程中建立一个Employee类,实现从数据库中根据id(员工编号)查找对应的员工信息,尝试使用mybatis框架实现它
2.1 准备数据
①建库建表建约束并导入测试数据
CREATE TABLE tbl_employee(
id INT(11)PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(50),
email VARCHAR(50),
salary DOUBLE(10,2)
);
②准备maven工程
2.2 搭建Mybatis框架步骤
2.2.1 在该maven工程下的pop.xml中导入jar包
我们需要以下三个jar包:
- MySQL的驱动jar包 8.0.26
- junit 4.12
- Mybatis框架的jar包 3.5.6
示例代码如下:
//pop.xml中导入相关jar包
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
2.2.2 编写核心配置文件【mybatis-config.xml】
位置:
resources目录下
文件命名:
推荐使用mybatis-config.xml
代码示例如下:
相关代码可直接在 https://mybatis.org/mybatis-3/zh/getting-started.html 中复制相应代码,粘贴到自己的核心配置文件中即可,如下所示。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 下面是mysql8版本 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- url后要加时区 ?serverTimezone=UTC" ,不然报错 -->
<property name="url" value="jdbc:mysql://localhost:3306/0411db?serverTimezone=UTC"/>
<!-- 下面是mysql5版本的写法
<property name="driver"value="com.mysql.jdbc.Driver"/>
<property name="url"value="jdbc:mysql://localhost:3306/0411db"/>
-->
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
//设置映射文件的路径
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
注意:
如果你的MySQL版本为8及以上, url后要加时区“ ?serverTimezone=UTC" ,不然会报错
针对MySQL的数据库版本不同, diver与url的value值写法会有所不同
以我的mysql数据库版本(8.0.26)举例如下所示:
MySQL8版本:
<property naurlme="driver" value="com.mysql.cj.jdbc.Driver"/>
/url后要加时区“ ?serverTimezone=UTC" ,不然会报错
<property name="url" value="jdbc:mysql://localhost:3306/0411db?serverTimezone=UTC"/>
MySQL5版本:
<property name="driver"value="com.mysql.jdbc.Driver"/>
<property name="url"value="jdbc:mysql://localhost:3306/0411db"/>
2.2.3 书写相关接口及映射文件
映射文件位置:
resources/mapper(这是新建一个包Mapper用以存放多个映射文件)
映射文件命名:
XXMapper.xml(推荐与对应的Mapper接口的命名一致)
映射文件作用:
为对应的Mapper接口书写sql语句
ps:
一个xxxMapper接口对应一个映射文件XXMapper.xml
如果有多个Mapper接口,那么resources目录下就必须有多个对应的映射文件,但是resources目录下也存放核心配置文件,为区分核心配置文件与多个映射文件,推荐在resources目录下新建一个包Mapper,用以存放多个映射文件
注意:
映射文件名与接口名保持一致
映射文件namespace与接口全类名保持一致
映射文件Select的Id的属性值与接口的方法名保持一致
附注:
示例代码如下:
①在src\main\java\mybatis\mapper下定义EmployeeMapper接口
package mybatis.mapper;
import mybatis.pojo.Employee;
public interface EmployeeMapper {
//根据员工编号查找对应的员工信息
public Employee selectByempId(int empId);
}
②在src\main\resources\mapper下定义EmployeeMapper接口对应的映射文件EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.mapper.EmployeeMapper">
<!-- resultType:Mapper接口中selectByempId方法的返回值类型【Employee类(写类的全名称)】 -->
<select id=" selectByempId" resultType="mybatis.pojo.Employee">
select
id,
last_name,
email,salary
from
tbl_employee
where
id= #{empId}
</select>
</mapper>
附注:映射文件中的基本配置信息的相关代码可直接在https://mybatis.org/mybatis-3/zh/getting-started.html 中复制代码,粘贴到自己的映射文件,修改部分参数值即可
2.2.4 测试(使用SqlSession对象)
步骤:
①先获取SqlSessionFactory对象
②再获取SqlSession对象
③通过SqlSession对象获取KXXMapper代理对象
④测试
代码示例如下:
import mybatis.mapper.EmployeeMapper;
import mybatis.pojo.Employee;
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 java.io.IOException;
import java.io.InputStream;
public class TestMybatis {
@Test
public void test01(){
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过SqlSessionFactory对象调用openSession();
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取EmployeeMapper的代理对象
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
System.out.println(" employeeMapper.getClass().getName() = "+employeeMapper.getClass().getName());
Employee employee = employeeMapper.selectByempId(1);
System.out.println(employee);
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3 搭建log4j 日志框架
为什么要搭建log4j 日志框架?
log4j 日志框架可以把mybatis 的底层运行过程显示出来,便于我们开发者查找bug
步骤:
①在要应用的模块的pop.xml中引入log4j 的jar包
代码示例如下:
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
②在resources目录下编写它的配置文件log4j.xml
示例代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
③运行测试