MyBatis:
一款一流的支持自定义SQL、存储过程和高级映射的持久化框架,能够使用简单的
XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和POJOs(普通java 对象)到
数据库中的记录。
MyBatis核心: --- SqlSessionFactory
1. SqlSessionFactory通过SqlSessionFactoryBuilder获得,
SqlSessionFactoryBuilder 能够从XML 配置文件或者通过自
定义编写的配置类(Configuration class),来创建一个SqlSessionFactory 实例。
A:从XML 中创建SqlSessionFactory 实例
MyBatis 包括一个叫做Resources 的工具类(utility class),其中包含了一系
列方法,使之能简单地从classpath 或其它地方加载配置文件。
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
XML 配置文件包含MyBatis 框架的核心设置,包括获取数据库连接的DataSource 实例,和包
括决定事务作用域范围和控制的事务管理等
<?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 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>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
B:如何不使用XML 来创建SqlSessionFactory
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
SqlSession ---- 真正执行sql的东东,提供了一系列执行SQL的方法
SqlSessionFactory sqlMapper;
SqlSession session = sqlMapper.openSession();
try{
Student stu = (Student)session.selectOne("he.maven.example.dao.StudentDao.getStudent","777");
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
}
虽然这种方法很有效,MyBatis 以前版本的用户对此也可能很熟悉,但现在有一个更简便的
方式,那就是对给定的映射语句,使用一个正确描述参数与返回值的接口(如
StudentMapper.class),您就能更清晰地执行类型安全的代码,从而避免错误和异常.
定义一个StudentMapper class --- 正确描述参数与返回值的接口
SqlSession session = sqlSessionFactory.openSession();
try{
StudentMapper mapper = sesson.getMappser(StudentMapper.class);
Student student = mapper.selectStudent(100);
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
}
在上面的例子中,映射语句已经在XML 配置文件或注解中定义,所有MyBatis 提供的功能特性都可以通过基于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>
namespace:命名空间 -- 完整类名 -- 命名空间能够进行接口绑定,对应dao接口
id:语句名称,对应dao方法
补充:Mybatis的注解方式: --- 不适合复杂SQL语句
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
关于SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession的作用于和生命周期:
SqlSessionFactoryBuilder:
可以在任何时候被实例化、使用和销毁。一旦您创造了SqlSessionFactory 就不需要
再保留它了
最好的作用域是方法体内
SqlSessionFactory:
一旦创建,SqlSessionFactory 将会存在于您的应用程序整个运行生命周期中。很少或根本
没有理由去销毁它或重新创建它
最好的作用域范围是一个应用的生命周期范围。 --- Spring注入或单例实现
SqlSession:
每个线程都有一个SqlSession实例,SqlSession 实例是不被共享的,并且不是线程不安全
如果您正在用一个WEB 框架,可以把SqlSession 的作用域看作类似
于HTTP 的请求范围。也就是说,在收到一个HTTP 请求,您可以打开一个SqlSession,当您把
response 返回时,就可以把SqlSession 关闭。关闭会话是非常重要的,您应该要确保会话在一
个finally 块中被关闭。
创建:
Sqlsession对应着一次数据库会话。由于数据库回话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,
在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。
创建Sqlsession的地方只有一个,那就是SqlsessionFactory的openSession方法。
Mapper实例:
Mappers 是创建来绑定映射语句的接口,该Mapper 实例是从SqlSession 得到的。因此,所
有mapper 实例的作用域跟创建它的SqlSession 一样。但是,mapper 实例最好的作用域是
method,也就是它们应该在方法内被调用,使用完即被销毁
一款一流的支持自定义SQL、存储过程和高级映射的持久化框架,能够使用简单的
XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和POJOs(普通java 对象)到
数据库中的记录。
MyBatis核心: --- SqlSessionFactory
1. SqlSessionFactory通过SqlSessionFactoryBuilder获得,
SqlSessionFactoryBuilder 能够从XML 配置文件或者通过自
定义编写的配置类(Configuration class),来创建一个SqlSessionFactory 实例。
A:从XML 中创建SqlSessionFactory 实例
MyBatis 包括一个叫做Resources 的工具类(utility class),其中包含了一系
列方法,使之能简单地从classpath 或其它地方加载配置文件。
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
XML 配置文件包含MyBatis 框架的核心设置,包括获取数据库连接的DataSource 实例,和包
括决定事务作用域范围和控制的事务管理等
<?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 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>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
B:如何不使用XML 来创建SqlSessionFactory
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
SqlSession ---- 真正执行sql的东东,提供了一系列执行SQL的方法
SqlSessionFactory sqlMapper;
SqlSession session = sqlMapper.openSession();
try{
Student stu = (Student)session.selectOne("he.maven.example.dao.StudentDao.getStudent","777");
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
}
虽然这种方法很有效,MyBatis 以前版本的用户对此也可能很熟悉,但现在有一个更简便的
方式,那就是对给定的映射语句,使用一个正确描述参数与返回值的接口(如
StudentMapper.class),您就能更清晰地执行类型安全的代码,从而避免错误和异常.
定义一个StudentMapper class --- 正确描述参数与返回值的接口
SqlSession session = sqlSessionFactory.openSession();
try{
StudentMapper mapper = sesson.getMappser(StudentMapper.class);
Student student = mapper.selectStudent(100);
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
}
在上面的例子中,映射语句已经在XML 配置文件或注解中定义,所有MyBatis 提供的功能特性都可以通过基于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>
namespace:命名空间 -- 完整类名 -- 命名空间能够进行接口绑定,对应dao接口
id:语句名称,对应dao方法
补充:Mybatis的注解方式: --- 不适合复杂SQL语句
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
关于SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession的作用于和生命周期:
SqlSessionFactoryBuilder:
可以在任何时候被实例化、使用和销毁。一旦您创造了SqlSessionFactory 就不需要
再保留它了
最好的作用域是方法体内
SqlSessionFactory:
一旦创建,SqlSessionFactory 将会存在于您的应用程序整个运行生命周期中。很少或根本
没有理由去销毁它或重新创建它
最好的作用域范围是一个应用的生命周期范围。 --- Spring注入或单例实现
SqlSession:
每个线程都有一个SqlSession实例,SqlSession 实例是不被共享的,并且不是线程不安全
如果您正在用一个WEB 框架,可以把SqlSession 的作用域看作类似
于HTTP 的请求范围。也就是说,在收到一个HTTP 请求,您可以打开一个SqlSession,当您把
response 返回时,就可以把SqlSession 关闭。关闭会话是非常重要的,您应该要确保会话在一
个finally 块中被关闭。
创建:
Sqlsession对应着一次数据库会话。由于数据库回话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,
在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。
创建Sqlsession的地方只有一个,那就是SqlsessionFactory的openSession方法。
Mapper实例:
Mappers 是创建来绑定映射语句的接口,该Mapper 实例是从SqlSession 得到的。因此,所
有mapper 实例的作用域跟创建它的SqlSession 一样。但是,mapper 实例最好的作用域是
method,也就是它们应该在方法内被调用,使用完即被销毁