编译软件: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>
③运行测试