什么是MyBatis?
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎全部的 JDBC代码和参数的手工设置以及结果集的检索。 MyBatis 使用简单的XML或注解用于配置和原始映射,将接口和 Java 的 POJOs( Plan OldJava Objects,普通的 Java对象)映射成数据库中的记录。html
每个mybatis应用都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory能够经过SqlSessionFactoryBuilder对象来得到,SqlSessionFactoryBuilder对象能够从XML配置文件,或从Configuration类的实例中构建SqlSessionFactory对象。
java
从XML中建立SqlSessionFactorysql
XML 配置文件包含对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> <!-- 配置环境变量 --> <environments default="development"> <!-- environment元素体中包含对事务管理和链接池的环境配置 --> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- 配置mappers --> <!-- mappers元素是包含全部mapper(映射器)的列表,这些mapper的XML文件包含SQL代码和映射定义信息 --> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml" /> </mappers> </configuration>
SqlSessionFactory对象由SqlSessionFactoryBuilder建立。session
它的主要功能是建立SqlSession对象,和SqlSessionFactoryBuilder对象同样,没有必要每次访问Mybatis就建立一次SqlSessionFactory,一般的作法是建立一个全局的对象就能够了。mybatis
实例:
private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder; private static SqlSessionFactory sqlSessionFactory; private static void init() throws IOException { String resource = "mybatis-config.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); sqlSessionFactory = sqlSessionFactoryBuilder.build(reader); }
SqlSession架构
SqlSession对象的主要功能是完成一次数据库的访问和结果的映射。每一个线程都应该有它本身的SqlSession 实例。 SqlSession 的实例不能被共享,也是线程不安全的。所以最佳的范围是请求或方法范围。绝对不能将SqlSession 实例的引用放在一个类的静态字段甚至是实例字段中。也毫不能将SqlSession 实例的引用放在任何类型的管理范围中,好比Serlvet 架构中的 HttpSession。app
关闭 Session很重要,你应该确保使用 finally 块来关闭它。下面的示例就是一个确保 SqlSession 关闭的基本模式:框架
SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); } finally { session.close(); }
Mapper实例
经过 SqlSession和 Mapper 对象到底执行了什么操做?(已映射的SQL语句是关键)
咱们先来看看:
语句是能够经过 XML 或注解定义的,咱们先看看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="org.mybatis.example.BlogMapper"> <select id="selectBlog" parameterType="int" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper>
package org.mybatis.example; //接口 public interface BlogMapper { Blog selectBlog(int id); } 操做执行 SqlSession session = sqlSessionFactory.openSession(); try { //getMapper 获取mapper对象 BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); } finally { session.close(); }
再来看看如何使用java注解来替换写映射语句的xml
使用注解要更加清晰,可是对于复杂的sql来讲就会很乱,对于复杂的sql建议使用xml
package org.mybatis.example; public interface BlogMapper { @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlog(int id); }