mybatis入门(二)
2.1开发环境准备
见上篇博客。
2.2 mybatis的基本构成
的MyBatis的核心组件(顺序由上而下):
- SqlSessionFactoryBuilder对象(构造器):它会根据配置信息或者代码来生成的SqlSessionFactory(工厂接口)。
- SqlSessionFactory对象:依靠工厂来生成的SqlSession(会话)。
- SqlSession的:是一个既可以发送SQL去执行并返回结果,也可以获取映射器的接口。
- SQL Mapper:它是mybatis新设计的组件,它是由一个Java接口和XML文件(或注解)构成的,需要给出对应的SQL的映射规则。它负责发送SQL去执行,并返回结果。
2.2.1构建SqlSessionFactory
SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得.SqlSessionFactory是一个工厂接口而不是实现类,他的任务是创建SqlSession。
SqlSession类似于一个JDBC的Connection对象。
创建SqlSessionFactory的两种模式:1.XML配置.2。代码的方式。
配置类对象保存着我们配置在mybatis的信息。在mybatis中提供了两个SqlSessionFactory的实现类,DefaultSqlSessionFactory和SqlSessionManager。目前mybatis中使用的是DefaultSqlSessionFactory。
2.2.1.1使用XML方式构建
包含获取数据库连接实例的数据源(DataSource),
决定事务范围和控制方式的事务管理器(TransactionManager)和映射器(SQL Mapper)。
2.2.1.2使用代码方式构建
不推荐,修改环境的时候需要重新编译代码,这样不利于维护。
构建代码:
- 初始化一个数据库连接池
- 定义JDBC的数据库事务管理方式
- 用数据库连接池和事务管理方式创建了一个数据库运行环境,并命名为发展
- 创建一个配置类对象,并把数据库运行环境注册给它
- 注册一个角色的别名
- 加入一个映射器
- 用SqlSessionFactoryBuilder对象通过配置对象创建了SqlSessionFactory
2.2.2创建SqlSession
SqlSession接口类似于一个JDBC中的Connection接口对象,我们需要保证每次用完正常关闭它,所以正确的做法是把关闭SqlSession接口的代码写在finally语句中保证每次都会关闭SqlSession,让连接资源归还给数据库。
SqlSession的用途主要有两种:
- 获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
- 直接通过命令信息去执行SQL返回结果.update,插入,选择,删除等方法,与此同时它也支持事务,通过提交,回滚方法递交或者回滚事务。
2.2.3映射器
映射器是由Java接口和xml文件(或注解)共同组成的,它的作用如下。
- 定义参数类型
- 描述缓存
- 描述SQL语句
- 定义查询结果和POJO的映射关系
2.2.3.1 XML文件配置方式实现Mapper
使用XML文件配置是mybatis实现mapper的首选方式。它由一个Java接口和一个XML文件构成。
第一步,给出Java接口。
public interface RoleMapper{
public Role getRole(Long id);
}
这里我们定义了一个接口,它有一个方法getRole,通过角色编号找到角色对象。
第二步,给出一个映射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.learn.chapter2.mapper.RoleMapper">
<select id="getRole" parameterType="long" resultType="role">
select id,role_name as roleName,note from t_role where id = #{id}
</select>
</mapper>
以上XML文件做了什么:
- 这个文件是我们在配置文件的MyBatis-config.xml文件中配置了的,所以的MyBatis会读取这个配置文件,生成映射器。
- 定义了一个命名空间为com.learn.chapter2.mapper.RoleMapper的SQL Mapper,这个命名空间和我们定义的接口的全限定名是一致的。
- 选择查询的ID和接口方法是一致的,参数类型表示参数类型为长,而与resultType则定义我们需要返回的数据类型。
对于以下SQL语句:
select id, role_name as roleName, note from t_role where role_no = #{id}
#{id}为这条SQL的参数。而SQL列的别名和POJO的属性名称保持一致。那么mybatis就会把此条语句查询的结果自动映射到我们需要的POJO属性上,这就是自动映射。我们可以用一个SqlSession来获取这个映射代码如下:
//获取映射器Mapper
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);//执行方法
这就完成了的MyBatis的一次查询。
2.2.3.2 Java注解方式实现Mapper
只需要在接口中使用的Java注解,注入SQL即可,代码如下:
public interface RoleMapper{
@Select(value="select id,role_name as roleName,note from t_role where id=#{id}")
public Role getRole(Long id);
}
这种方法虽然看起来比较简单,但是不建议使用这种方式。复杂的SQL写在代码中会降低代码的可读性。
2.2.3.3一些疑问
建议采用映射器方式编写代码,好处有两点:
- sqlSession.selectOne是功能性代码,长长的字符串比较,但是对于roleMapper.getRole这样的才是符合面向对象规范的编程,也更符合业务的逻辑。
- 使用映射方式,IDE可以检查Java的语法,避免不必要的错误。
2.3生命周期
2.3.1 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlSessionFactory的,通过它可以构建多个SessionFactory。它的作用就是一个构建器,一旦我们构建了SqlSessionFactory,就可以将它回收。作用:生成SqlSessionFactory对象。
2.3.2 SqlSessionFactory
作用:采用单例模式创建SqlSession,而SqlSession就是一个会话,相当于JDBC中的Connection对象。并且每一个数据库只对应一个SqlSessionFactory,避免过多的Connection被消耗。
2.3.3 SqlSession
SqlSession的就是一个会话,相当于JDBC中的连接对象。它是一个线程不安全的对象,在涉及多线程的时候,操作数据库需要注意其隔离级别,数据库锁等高级特性。此外,每次创建的一个SqlSession都必须及时关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。
2.3.4映射器
Mapper是一个接口,而没有任何实现类,它的作用是发送SQL,然后返回我们需要的结果,或者执行SQL从而修改数据库的数据,因此它应该在一个SqlSession事务方法之内,是一个方法级别的东西。它就如同JDBC中的一条SQL语句的执行,它最大的范围和SqlSession的是相同的。尽管我们想一直保存着映射,但是你会发现它很难控制,所以尽量在一个SqlSession的事务的方法中使用它们,然后废弃掉。
2.4实例
实例文件的作用:
文件 | 作用 |
---|---|
Log4j.properties | 配置的log4j的属性文件 |
Chapter2Main.java | 运行MyBatis的入门程序的入口,包含主要方法 |
RoleMapper.java | 映射器 |
RoleMapper.xml | 映射器配置文件 |
Role.java | POJO类,符合的javaBean的规范 |
SqlSessionFactoryUtil.java | 构建SqlSessionFactory中,并创建一个SqlSession |
MyBatis的-config.xml中 | MyBatis的的配置文件 |
还没有评论,来说两句吧...