一、在《Mybatis-1-项目环境搭建(Maven)》案例分析
先看一下代码:
// 1.导入mybatis配置文件,抛出异常
// 使用org.apache.ibatis.io.Resources导入mybatis的xml配置文件
InputStream resource = Resources.getResourceAsStream("mybatis.config.xml");
// 2.创建SqlSessionFactory工厂
// 说明:org.apache.ibatis.session.SqlSessionFactory是一个接口
// 使用org.apache.ibatis.session.SqlSessionFactoryBuilder来创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(resource);
// 3.使用工厂生产SqlSession对象
SqlSession sqlSession = factory.openSession();
// 4.通过SqlSesison对象创建mapper接口的代理对象
GuestMapper guestMapper = sqlSession.getMapper(GuestMapper.class);
// 5.通过代理对象来调用selectGuest函数,来访问数据库
List<Guest> guests = guestMapper.selectGuest();
// 6.打印一下结果
for (Guest guest : guests) {
System.out.println(guest);
}
// 7.关闭资源
sqlSession.close();
resource.close();
执行过程:
- 获取mybatis的配置文件
通过类加载器来加载。 - 创建SqlSessionFactory工厂(构建者模式)
Mybatis使用构建者模式,来创建SqlSessionFactory工厂。
构建者模式:可以把创建的细节过程隐藏,我们只需要给构建者(SqlSessionFactoryBuilder)一个需求(resource),就可以得到需要的对象(SqlSessionFactory)。
优势:使用者可以不关注创建的细节过程。 - 通过SqlSessionFactory工厂创建SqlSession对象(工厂模式)
优势:解耦(降低类之间的关系) - 通过SqlSession对象创建mapper接口代理对象(代理模式)
优势:不修改源码的基础上对已有方法进行增强。 - 通过mapper接口代理对象调用函数
- 打印结果
- 关闭资源
二、自定义实现一个Mybatis
让我们自己写一个简单的Mybatis,实现查询。
首先看一下最后的项目结构:
下面就要开始写代码了:
准备:
- mybatis.config.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!-- 配置mybatis --> <configuration> <!-- 指定 MyBatis 数据库配置文件 --> <properties resource="db.properties"/> <!-- 环境配置 --> <!-- 默认使用mysql这个环境 --> <environments default="mysql"> <!-- mysql 数据库环境 --> <environment id="mysql"> <!-- 事务管理:JDBC --> <transactionManager type="JDBC"/> <!-- 数据源配置,POOLED是JDBC连接对象的数据源连接池的实现 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.169.139:3306/seven?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="tiger"/> </dataSource> </environment> </environments> <!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 注解方式不需要这个 --> <mappers> <!-- 使用xml方式开发,指定持久化类的映射文件 --> <mapper resource="com/seven/mapper/GuestMapper.xml"/> <!-- 使用注解方式开发,指定持久化类接口 --> <!-- <mapper class="com.seven.mapper.GuestMapper"/>--> </mappers> </configuration>
- 实体类 Guest
package com.seven.entity; import java.util.Date; public class Guest { private Integer gid; private String gname; private String gpwd; private Date gbirthday; @Override public String toString() { return "Guest{" + "gid=" + gid + ", gname='" + gname + '\'' + ", gpwd='" + gpwd + '\'' + ", gbirthday=" + gbirthday + '}'; } public Integer getGid() { return gid; } public void setGid(Integer gid) { this.gid = gid; } public String getGname() { return gname; } public void setGname(String gname) { this.gname = gname; } public String getGpwd() { return gpwd; } public void setGpwd(String gpwd) { this.gpwd = gpwd; } public Date getGbirthday() { return gbirthday; } public void setGbirthday(Date gbirthday) { this.gbirthday = gbirthday; } }
- 映射接口 GuestMapper
package com.seven.mapper; import com.seven.entity.Guest; import java.util.List; public interface GuestMapper { List<Guest> selectGuest(); }
- GuestMapper对应的映射文件 GuestMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <mapper namespace="com.seven.mapper.GuestMapper"> <select id="selectGuest" resultType