Mybatis
框架的概念
建筑学中框架的概念
- 框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。
- 框架这个广泛的定义使用的十分流行,尤其在软件概念。框架也能用于机械结构。
软件工程中框架的概念
- 框架( Framework )是构成一类特定软件可复用设计的一组相互协作的类。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节.
框架可以解决什么问题
框架要解决的最重要的一个问题是技术整合的问题,在J2EE的框架中,有着各种各样的技术.不同的软件企业需要从J2EE中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术本身的复杂性和技术的风险性将会直接对应用造成冲击.而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦,这样软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响.
框架一般处在底层应用平台(J2EE)和高层业务逻辑之间的中间层.
三层架构和SSM框架的关系
表现层(Spring MVC 框架)
业务层
持久层(Mybatis框架)
持久层技术解决方案
JDBC技术
- Connection+PreparedStatement+ResultSet
Spring的JDBCTemplate
Apache的DBUtils
- 它和Spring的JDBCTemplate很像,也是对JDBC的简单封装
Mybatis 优化
1. 将 mysql-config.xml 文件的数据的四字符串优化
2. 将 sql 映射文件中的 resultType=”x.x.x.x” 优化
MyBatis 测试步骤
1. 定义核心配置文件
2. 获取 SqlSessionFactory 对象
3. 获取 SqlSession 对象
4. 执行 sql 语句
方式二:基于 Mapper 接口方式操作数据(推荐使用)
Mybatis 环境的搭建
1. 创建Maven工程并导入坐标(依赖)
2. 创建实体类User和UserDao接口
3. 创建Mybatis的主配置文件(核心配置文件)mybatis-config.xml文件
4. 创建Sql映射配置文件UserDao.xml文件
原生JDBC查询数据库时存在的问题和解决方案
原生JDBC查询数据库的代码
1. 数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
2. 将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护。
- 对策:将sql语句配置XML配置文件中,即使sql变化,不需要java代码进行重新编译。
3. 向sql语句传参麻烦,因为sql语句的where条件不一定,可能多也可能少,向preparedStatement中设置参数,对占位符位置和设置参数值需要一一对应,而且硬编码在java代码中,不利于系统维护。
4. 从resultSet中遍历数据时,存在硬编码,将获取的表字段进行硬编码,不利于系统维护。对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便
- 对策:Mybatis自动将sql执行结果映射成java对象,通过statement的resultType定义输出结果的类型
Mybatis 工具类
public class MybatisUtils {
private static SqlSessionFactory sessionFactory = null;
/*
* 创建本地线程变量,为每一个线程独立管理一个session对象 每一个线程只有且仅有单独且唯一的一个session对象
* 加上线程变量对session进行管理,可以保证线程安全,避免多实例同时调用同一个session对象
* 每一个线程都会new一个线程变量,从而分配到自己的session对象
*/
private static ThreadLocal<SqlSession> threadlocal = new ThreadLocal<SqlSession>();
// 创建sessionFactory对象,因为整个应用程序只需要一个实例对象,故用静态代码块
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 返回sessionFactory对象 工厂对象
*
* @return sessionFactory
*/
public static SqlSessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* 新建session会话,并把session放在线程变量中
*/
private static void newSession() {
// 打开一个session会话
SqlSession session = sessionFactory.openSession(true);
// 将session会话保存在本线程变量中
threadlocal.set(session);
}
/**
* 返回session对象
* @return session
*/
public static SqlSession getSession(){
//优先从线程变量中取session对象
SqlSession session = threadlocal.get();
//如果线程变量中的session为null,
if(session==null){
//新建session会话,并把session放在线程变量中
newSession();
//再次从线程变量中取session对象
session = threadlocal.get();
}
return session;
}
/**
* 关闭session对象,并从线程变量中删除
*/
public static void closeSession(){
//读取出线程变量中session对象
SqlSession session = threadlocal.get();
//如果session对象不为空,关闭sessoin对象,并清空线程变量
if(session!=null){
session.close();
threadlocal.set(null);
}
}
}
未完待续……