mybatis工作原理简介
一、前言
本例没有引入spring框架。
简单介绍了mybatis查询数据库数据的流程。
二、准备工作
1,安装数据库
此处安装mysql,官网下载“社区版”,过程百度。
2,安装可视化工具
此处安装sqlyog,官网下载“社区版”,过程百度。
3,创建maven项目,引入mybatis
a,idea上,New -> Project -> 语言选java,构建系统选maven;
b,pom.xml添加依赖
<dependencies> <!-- mybatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.0</version> </dependency> <!-- MySQL数据库依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies>
4,测试代码
4.1,数据库数据
创建数据库database_2024,创建表u_user,插入一条数据。
CREATE DATABASE database_2024; CREATE TABLE `database_2024`.`u_user` ( `id` BIGINT(10) NOT NULL COMMENT '主键,用户id', `username` VARCHAR(100) COMMENT '用户名称', `phone` VARCHAR(30) COMMENT '电话号码', `province` VARCHAR(50) COMMENT '所在省份', PRIMARY KEY (`id`) ); INSERT INTO `database_2024`.`u_user` (`id`, `username`, `phone`, `province`) VALUES ('1', '张三', '13331331333', '江苏');
4.2,mybatis配置文件
resources目录下创建配置文件SqlMapConfig.xml。
<?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="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/database_2024?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapperxml/UserMapper.xml"/>
</mappers>
</configuration>
4.3,实体类
java目录下创建entity包,entity包下创建实体类User.java。
/** * 使用lombok的注解可以省去getter、setter代码的编写,pom.xml中引入依赖<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></dependency>。 * 否则代码里加上getter、setter代码。 */ @Data public class User { private Long id; private String username; private String phone; private String province; }
4.4,数据库接口类
java目录下创建dao包,dao包下创建接口UserDao。
public interface UserDao { List<User> listUsers(); }
4.5,映射文件
resources目录下创建目录mapperxml,mapperxml目录下创建映射文件UserMapper.xml。
<?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="dao.UserDao"> <select id="listUsers" resultType="entity.User"> select * from u_user; </select> </mapper>
4.6,测试代码
public static void main(String[] args) throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.建造SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工厂生产SqlSession对象 SqlSession session = factory.openSession(); //4.使用SqlSession创建Dao的代理对象 UserDao userDao = session.getMapper(UserDao.class); //5.使用代理对象执行方法 List<User> users = userDao.listUsers(); for (User user : users) { System.out.println(user); } //6.释放资源 session.close(); in.close(); }
三、原理介绍
1,SqlSessionFactory
用于生成SqlSession。
工厂模式,目的是为了解决新产品的制造问题,方法是通过新建工厂来完成新产品的制造。代码中,工厂制造产品的主流程不变,只是将工厂指向新建的工厂,产品自然变成了新的产品,通过添加一些新类即可实现。
2,SqlSessionFactoryBuilder
用于生成SqlSessionFactory。
建造者模式,主角是建造者,他隐藏了建造的细节,提供了参数界面。代码中,你只需要在界面上输入参数,他便能建造相应的东西。
3,原理介绍
3.1,概述
用户(main方法)在建造者(SqlSessionFactoryBuilder)的界面输入关键参数(SqlMapConfig.xml),建造者(SqlSessionFactoryBuilder)因此建造了一座相应的工厂(DefaultSqlSessionFactory);
这座工厂(DefaultSqlSessionFactory)可以生产产品(DefaultSqlSession);
这个产品(DefaultSqlSession)的功能是代理数据库接口(dao包下的那些接口),并按照自己的方式(要求预先编写和java接口对应的xml映射文件即mapperxml目录下的那些文件)实现对数据库的增删改查等等操作。
3.2,jdk动态代理
如上图所示,jdk动态代理的使用方式如下
public class jdk动态代理 implements InvocationHandler { public Object 数据库接口; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 重新定制数据库接口的方法实现 } } // 使用方式 数据库接口对象 ——> Proxy.newProxyInstance(数据库接口的类加载器, 数据库接口的类对象数组, jdk动态代理对象); 数据库接口对象.执行方法;
实际操作
最终数据库接口对象执行方法,实际内部是jdk的动态代理对象执行了方法。
a,根据入参构建sql;
b,使用jdbc链接数据库,执行sql,获取数据;
c,将数据库的数据映射到java对象。
三、总结
mybatis可以将程序员编写的所有数据库接口都交给jdk动态代理对象处理,jdk动态代理对象又能将他们和sql语句一一对应,还能将查询结果都返回给他们。这样sql语句可以集中在一个文件中,显得优美一点。jdk动态代理对象还能为他们添加点附加功能,如线程池、缓存、拦截器等。