MyBatis-01-介绍及环境搭建
一、MyBatis简介
MyBatis本是apache的一个开源项目iBatis,2010年这个项目迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis。
2013年11月迁移到Github。
MyBatis 是一款优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
回顾 JDBC操作数据库
public static void main(String[] args) {
Connection conn = null;
Statement stm = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/test";
// 通过DriverManager获取连接
conn = DriverManager.getConnection(url, "root", "hello");
System.out.println("conn:" + conn);
// 准备操作数据库
// Statement:用于执行静态SQL语句并返回它所生产结果的对象
stm = conn.createStatement();
String sql = "insert into test.new_table(t1,t2) values('t11','t22');";
Boolean ret = stm.execute(sql);
conn.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
// 釋放資源
}
}
mybatis操作方式
public static void main(String[] args) {
User user = new User();
user.setUserId(1);
user.setUserCode("ganyongming");
sqlSession.getMapper(UserDao.class).addUser(user );
sqlSession.close();
}
二、MyBatis与jdbc区别
JDBC:
Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变Java代码。
MyBatis
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
三、MyBatis特性
基于SQL语法,简单易学
SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
方便程序代码调试
对数据库操作结果进行自动映射
提供了一级和二级缓存,提高了程序性能
四、搭建MyBatis开发环境
导入jar包 mybatis-3.5.9.jar
编写核心配置文件
<!-- mybatis配置 -->
<configuration>
<!-- 配置運行環境 -->
<environment id="dev">
<transactionManager type="JDBC">
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Drvier"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/woniu"/>
<property name="username" value="root"/>
<property name="password" value="ROOT"/>
</dataSource>
</environment>
</environments>
</configuration>
测试获取SqlSession
五、工具类
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static{
try {
Reader reader = Resources.getResourceAsReader("mybatis-config1.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
public static void closeSession(SqlSession sqlSession){
if (sqlSession != null){
sqlSession.close();
}
}
}
六、掌握核心对象
核心对象 | 最佳生命周期 | 最佳作用域 |
---|---|---|
SqlSessionFactoryBuilder | 方法体内 | 方法体内局部变量 |
SqlSessionFactory | 从应用服务启动开始一直到应用服务停止application | 整个应用内 |
SqlSession | 一次请求的有效期 | 一次请求的有效期内 |
1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,并且提供了多个 build() 方法的重载.
生命周期和作用域
SqlSessionFactoryBuilder 的最大特点是:用过即丢。一旦创建了 SqlSessionFactory 对象之后,这个类就不再需要存在了,因此 SqlSessionFactoryBuilder 的最佳范围就是存在于方法体内,也就是局部变量而已。即最佳范围是方法范围 (本地方法变量)。
2、SqlSessionFactory
SqlSessionFactory 简单的理解就是创建 SqlSession 实例的工厂。所有的 MyBatis 应用都是以 SqlSessionFactory 实例为中心, SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 对象来获得。有了它之后,顾名思义,就可以通过 SqlSessionFactory 提供的 openSession() 方法来获取 SqlSession 实例。
说明: openSession() 方法的参数为 boolean 值时,若传入 true 表示关闭事务控制,自动提交; false 表示开启事务控制。若不传入参数,默认为 true。
生命周期和作用域
SqlSessionFactory 对象一旦创建,就会在整个应用运行过程中始终存在。没有理由去销毁或再创建它,并且在应用运行中也不建议多次创建 SqlSessionFactory 。因此 SqlSessionFactory 的最佳作用域是 Application,即随着应用的生命周期一同存在。那么这种 “存在于整个应用运行期间,并且同时只存在一个对象实例” 的模式就是所谓的单例模式(指在应用运行期间有且仅有一个实例)。即 SqlSessionFactory 的最佳范围是应用范围。
3、SqlSession
SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection 。它提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。
生命周期和作用域
SqlSession 对应着一次数据库会话。由于数据库会话不是永久的,因此 SqlSession 的生命周期也不应该是永久的。相反,在每次访问数据库时都需要创建它(注意:并不是说在 SqlSession 里只能执行一次 SQL,是完全可以执行多次的,但是若关闭了 SqlSession ,那么就需要重新创建它)。