概述
MyBatis将用户从JDBC的访问中解放出来,用户只须要定义须要操做的SQL语句,无须关注底层的JDBC操做,就能够面向对象的方式进行持久层操做。底层数据库链接的获取、数据访问的实现、事务控制等都无须用户关心,从而将应用层从底层的JDBC API中抽取出来,经过配置文件管理JDBC的链接,使用MyBatis解决持久化访问的实现。
MyBatis的体系结构
MyBatis中经常使用的对象有SqlSessionFactory和SqlSession。
SqlSessionFactory
SqlSessionFactory是MyBatis的关键对象,是单个数据库映射关系通过编译后的内存镜像。该对象的实例经过SqlSessionFactoryBuilder对象来得到,而SqlSessionFactoryBuilder则能够从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。
它是线程安全的,SqlSessionFactory一旦被建立,应该在应用执行期间都存在。在应用运行期间不要重复建立,建议使用单例模式。SqlSessionFactory是SqlSession的工厂,使用SqlSessionFactory.openSession()方法建立SqlSession对象(前文链接:https://www.jianshu.com/p/063a5ca8874c)。
SqlSession
SqlSession是MyBatis的关键对象,是执行持久化操做的对象,相似于JDBC中的Connection。它是应用程序与持久存储层之间执行交互操做的一个单线程对象,也是MyBatis执行持久化操做的关键对象。
SqlSession对象彻底包含以数据库为背景的全部执行SQL操做的方法,它的底层封装了JDBC链接,能够用SqlSession实例来直接执行已经映射的SQL语句。每一个线程都应该有本身的SqlSession实例。
SqlSession实例不能被共享,也是线程不安全的,绝对不能将SqlSession实例的引用放在任何类型的管理范围中,应该确保使用完SqlSession以后将它关闭。
SqlSession的方法见以下源码程序:
mysql
1 public interface SqlSession extends Closeable { 2 <T> T selectOne(String var1); 3 4 <T> T selectOne(String var1, Object var2); 5 6 <E> List<E> selectList(String var1); 7 8 <E> List<E> selectList(String var1, Object var2); 9 10 <E> List<E> selectList(String var1, Object var2, RowBounds var3); 11 12 <K, V> Map<K, V> selectMap(String var1, String var2); 13 14 <K, V> Map<K, V> selectMap(String var1, Object var2, String var3); 15 16 <K, V> Map<K, V> selectMap(String var1, Object var2, String var3, RowBounds var4); 17 18 <T> Cursor<T> selectCursor(String var1); 19 20 <T> Cursor<T> selectCursor(String var1, Object var2); 21 22 <T> Cursor<T> selectCursor(String var1, Object var2, RowBounds var3); 23 24 void select(String var1, Object var2, ResultHandler var3); 25 26 void select(String var1, ResultHandler var2); 27 28 void select(String var1, Object var2, RowBounds var3, ResultHandler var4); 29 30 int insert(String var1); 31 32 int insert(String var1, Object var2); 33 34 int update(String var1); 35 36 int update(String var1, Object var2); 37 38 int delete(String var1); 39 40 int delete(String var1, Object var2); 41 42 void commit(); 43 44 void commit(boolean var1); 45 46 void rollback(); 47 48 void rollback(boolean var1); 49 50 List<BatchResult> flushStatements(); 51 52 void close(); 53 54 void clearCache(); 55 56 Configuration getConfiguration(); 57 58 <T> T getMapper(Class<T> var1); 59 60 Connection getConnection(); 61 } 62
具体解释,此处不作记录,使用时查询便可。
注意:
实际应用中不多直接使用DriverManager来获取数据库链接,一般使用DataSource来获取数据库链接,SqlSessionFactory底层封装了DataSource。
MyBatis的配置文件
此处回顾前文的test测试类文件代码:
sql
1 public class Test { 2 public static void main(String[] args) throws IOException { 3 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 4 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 5 SqlSession sqlSession = sqlSessionFactory.openSession(); 6 User user = new User("Snow","男",20); 7 sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user); 8 sqlSession.commit(); 9 sqlSession.close(); 10 } 11 }
首先,读取mybatis-config.xml配合文件:
数据库
1 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
而后初始化mybatis,建立SqlSessionFactory的实例:
缓存
1 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
最后获取SqlSession对象,执行SQL语句:
安全
1 SqlSession sqlSession = sqlSessionFactory.openSession(); 2 ... 3 sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);
因而可知,MyBatis的初始化过程要通过如下步骤:
1.调用SqlSessionFactoryBuilder对象的build(inputStream)方法。
2.SqlSessionFactoryBuilder会根据输入流inputStream等信息建立XMLConfigBuilder对象。
3.SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法。
4.XMLConfigBuilder对象解析XML配置文件返回Configuration对象。
5.SqlSessionFactoryBuilder根据Configuration对象建立一个DefaultSessionFactory对象。
6.SqlSessionFactoryBuilder返回DefaultSessionFactory对象给客户端,供客户端使用。
配置文件属性
MyBatis的配置文件包含了以下结构:
1.properties属性
properties中的属性都是可外部配置且可动态替换的,既能够在典型的Java属性文件中配置,也能够经过properties元素的子元素来传递。
2.settings设置
settings是MyBatis中很是重要的设置,会改变MyBatis的运行时行为,settings元素示例以下:
mybatis
1 <settings> 2 <!--指定Mybatis所用日志的具体实现,开启日志--> 3 <setting name="logImpl" value="Log4J"/> 4 <!--开启二级缓存--> 5 <setting name="cacheEnabled" value="true"/> 6 </settings>
其余选项,开发项目时能够按需查询使用,下面列出部分参数:app
参数 | 描述 | 有效值 |
cacheEnabled | 该配置影响全部映射器缓存的全局开关 | true/false |
lazyLoadingEnabled | 延迟加载的全局开关 | true/false |
useGenaratedKeys | 容许JDBC支持自动生成主键 | true/false |
logImpl | 指定MyBatis所用日志的具体实现,未指定时自动查找 | SLF4J/LOG4J/LOG4J2 |
1 <typeAliases> 2 <typeAlias type="User" alias="com.snow.dcl.domain.User"/> 3 </typeAliases>
1 <typeAliases> 2 <package name="com.snow.dcl.domain"/> 3 </typeAliases>
1 @Alias("user") 2 public class User { 3 ... 4 }
1 <!--环境配置,链接的数据库--> 2 <environments default="mysql"> 3 <environment id="mysql"> 4 <!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置--> 5 <transactionManager type="JDBC"></transactionManager> 6 <!--dataSource 指链接源配置,POOLED是JDBC链接对象的数据源链接池的实现--> 7 <dataSource type="POOLED"> 8 <property name="driver" value="com.mysql.jdbc.Driver"></property> 9 <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"></property> 10 <property name="username" value="root"></property> 11 <property name="password" value="****"></property> 12 </dataSource> 13 </environment> 14 </environments>
1 <mappers> 2 <!--告诉Mybatis持久化类的映射文件路径--> 3 <mapper resource="mapping/UserMapper.xml"></mapper> 4 </mappers>