MyBatis框架概述
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。 为了我们能够更好掌握框架运行的内部过程,并且有更好的体验,下面我们将从自定义Mybatis框架开始来学习框架。此时我们将会体验框架从无到有的过程体验,也能够很好的综合前面阶段所学的基础。
本文是Mybatis 使用代理dao的方式实现增删改查的原理
首先编写一个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>
<!--配置Mybatis的环境-->
<environments default="mysql">
<!--配置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://127.0.0.1:3306/ssm?
characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--配置mybatis映射的位置-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
在resources目录下 新建一个mappers目录,在然后新建一个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="com.jd.dao.UserMapper">
<select id="findUser" resultType="com.jd.domain.User">
select id ,userName as userName,birthday as birthday,sex as sex,
address as address FROM user where yn=1
</select>
</mapper>
新建一个实体类
@Data
public class User {
private Integer id;
private Date birthday;
private String userName;
private String sex;
private String address;
private Integer yn;
}
创建一个接口类
public interface UserMapper {
/**
* 查询所用用户
*/
public List<User> findUser();
}
编写测试类
public class MybatisTest {
@Test
public void test() throws IOException {
//1、读取配置文件
InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建SqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3、使用构建者创建工厂对象SqlSessionFactory
SqlSessionFactory factory= builder.build(in);
//4、使用SqlSessionFactory创建SqlSession
SqlSession session=factory.openSession();
//5、使用SqlSession创建dao接口的代理对象
UserMapper userDao =session.getMapper(UserMapper.class);
//6、使用代理对象执行查询方法
List<User> list=userDao.findUser();
for (User user:list){
System.out.println(user);
}
//7、释放资源
session.close();
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接下来分析这个查询的过程,这其中使用的构建者设计模式、工厂模式、代理模式
1、 InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml"); 此处使用的是dom4j 解析xml文件,获取驱动 连接 账号 密码 和映射配置文件
2、//2、创建SqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3、使用构建者创建工厂对象SqlSessionFactory
SqlSessionFactory factory= builder.build(in);
此处使用的是构建者设计模式,优势:把对象的创建细节隐藏,使用者直接调用方法即可拿到对象
3、//4、使用SqlSessionFactory创建SqlSession
SqlSession session=factory.openSession();
此处使用的是工厂设计模式,生产SqlSession使用了工厂设计模式,优势:解耦(降低了类之间的依赖关系)
4、//5、使用SqlSession创建dao接口的代理对象
UserMapper userDao =session.getMapper(UserMapper.class);
创建dao层的接口实现类使用的是代理设计模式,优势,不修改源码的基础上对已有方法的增强
5、根据之前的配置文件,执行sql语句
<select id="findUser" resultType="com.jd.domain.User">
select id ,userName as userName,birthday as birthday,sex as sex,
address as address FROM user where yn=1
</select>
namespace ,是接口类相同
id 是接口类里的方法,
resultType,对返回的结果进行封装
本文章写的是使用代理对象方式,调用接口类的方法,执行sql语句
接下来总结一下:Mybatis 使用代理dao的方式实现增删改查的原理,无非就是做了两件事
1、解析xml,把数据进行封装
2、创建代理对象,调用selectList方法