mybatis实现的基本原理
跑一个入门的demo:
先贴上主程序的测试方法
package com.example;
import com.example.dao.UserDao;
import com.example.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author lianchua
* @version 1.0.0
* @ClassName Main.java
* @Description TODO
* @createTime 2019年09月24日 16:50:00
*/
public class Main {
/**
* mybatis基本查询实现
* mybatis实现的基本原理
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/**
* 把mybatis的xml配置文件转换成输入流
*/
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
/**
* 利用sql的工厂建造器sqlSessionFactoryBuilder对象的build()方法得到sqlSessionFactory对象
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
/**
* 工厂调用openSession()方法得到SqlSession对象
*/
SqlSession session = factory.openSession();
/**
* session对象调用getMapper()方法,传入mapper接口,得到代理的mapper实现对象
*/
UserDao mapper = session.getMapper(UserDao.class);
/**
* 代理的实现mapper对象调用具体的mapping配置文件里面的绝体findAll()方法查询,得到查询到的对象
*/
List<User> list = mapper.findAll();
/**
* 输出对象
*/
System.out.println(list);
}
}
1.读取配置文件得到输入流
/**
* 把mybatis的xml配置文件转换成输入流
*/
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
通过该对象Resource导入的包可以看到该类是阿帕奇公司的ibatis组件的io包里面类,该工具可以使用一个转换资源成流的方法getResourceAsStream(),传入一个mybatis配置文件的路径的字符串"mybatis-config.xml",可以得到一个输入流对象inputStream;
import org.apache.ibatis.io.Resources
2.得到SqlSessionFactory工厂
/**
* 利用sql的工厂建造器sqlSessionFactoryBuilder对象的build()方法得到sqlSessionFactory对象
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
通过构建SqlSessionFactoryBuilder对象,调用它的build()方法,传入刚刚得到的inputStream输入流对象,就能直接得到SqlSessionFactory的实例对象factory;
3.得到SqlSession对象
/**
* 工厂调用openSession()方法得到SqlSession对象
*/
SqlSession session = factory.openSession();
通过工厂factory直接开启Session,调用openSession()方法得到SqlSession的实例对象session;
4.得到代理对象
/**
* session对象调用getMapper()方法,传入mapper接口,得到代理的mapper实现对象
*/
UserDao mapper = session.getMapper(UserDao.class);
通过调用session对象的getMapper()方法,传入mapper接口的class对象UserDao.class,得到代理对象mapper,这个代理对象就是实现了UserDao接口的代理实现类对象;
5.调用接口的方法
/**
* 代理的实现mapper对象调用具体的mapping配置文件里面的绝体findAll()方法查询,得到查询到的对象
*/
List<User> list = mapper.findAll();
调用mapper接口的方法进行查询,因为mapper接口的配置文件和接口是关联到一起的,所以生成的代理对象,实际上就是把配置文件变成了具体的实现类;
下面我们再看看dao层的mapper接口文件和mapping映射配置文件,可能不同的人叫法有一些不一样,但是大概就是mapper接口是interface接口,而mapping配置文件是实现了这个接口的xml文件;
mapper接口文件代码如下:
package com.example.dao;
import com.example.pojo.User;
import java.util.List;
/**
* @author lianchua
* @version 1.0.0
* @ClassName UserDao.java
* @Description TODO 与数据库进行交互的dao层mapper接口
* @createTime 2019年09月24日 16:31:00
*/
public interface UserDao {
List<User> findAll();
}
mapping配置文件代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.dao.UserDao">
<resultMap id="baseMap" type="com.example.pojo.User">
<id property="id" column="id"/>
<result column="name" property="name"/>
</resultMap>
<select id="findAll" resultMap="baseMap" resultType="list">
select *
from user
</select>
</mapper>
这个mapping文件的mapper属性的namespace是与上面的mapper接口类路径对应的;
mybatis的配置文件如下:
<?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>
<properties resource="config/db.properties"/>
<settings>
<!--当返回行的所有列都是空时,MyBatis默认返回null-->
<setting name="returnInstanceForEmptyRow" value="true"/>
<!--显示sql语句-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.pwd}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件-->
<mappers>
<mapper resource="mapping/UserDao.xml"/>
</mappers>
</configuration>
大家应该注意到这里使用了外部的配置文件.properties,这是为了方便解耦的;如果不在意,也可以直接配置在xml文件里面,我这里配置到properties里面的,配置文件如下:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/csmh?useUnicode=true&characterEncoding=utf-8&useSSL=false
db.username=root
db.pwd=123123
当然,pojo文件也是必不可少的,代码如下:
package com.example.pojo;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User() {
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
pom文件只引入了mybatis和mysql两个依赖包,完整代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<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.gxa</groupId>
<artifactId>mybatis-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>mybatis-demo Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
<build>
<finalName>mybatis-demo</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
所以一共有下面的几个文件
现在贴上gitee仓库,供大家学习交流使用:
https://gitee.com/lianchua/mybatis-demo/tree/master