Mybatis1

Mybatis

框架的概念

建筑学中框架的概念

  • 框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。
  • 框架这个广泛的定义使用的十分流行,尤其在软件概念。框架也能用于机械结构。

软件工程中框架的概念

  • 框架( Framework )是构成一类特定软件可复用设计的一组相互协作的类。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节.

框架可以解决什么问题

框架要解决的最重要的一个问题是技术整合的问题,在J2EE的框架中,有着各种各样的技术.不同的软件企业需要从J2EE中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术本身的复杂性和技术的风险性将会直接对应用造成冲击.而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦,这样软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响.

框架一般处在底层应用平台(J2EE)和高层业务逻辑之间的中间层.

三层架构和SSM框架的关系

表现层(Spring MVC 框架)

  • 用于展示数据

业务层

  • 处理业务需求

持久层(Mybatis框架)

  • 与数据库交互

持久层技术解决方案

JDBC技术

  • Connection+PreparedStatement+ResultSet

Spring的JDBCTemplate

  • Spring中对JDBC的简单封装

Apache的DBUtils

  • 它和Spring的JDBCTemplate很像,也是对JDBC的简单封装

Mybatis 优化

1. 将 mysql-config.xml 文件的数据的四字符串优化

  •             单独放在一个 properties 文件中,在核心配置文件中使用 ${} 读取 properties 文件的内容
    

2. 将 sql 映射文件中的 resultType=”x.x.x.x” 优化

  •             在 mybatis-config.xml 文件中设置别名 <typeAliases>,包扫描 <packge>,配置别名 <typeAlias>
    

MyBatis 测试步骤

1. 定义核心配置文件

  •             String config="mybatis-config.xml”;
    

2. 获取 SqlSessionFactory 对象

  •             InputStream is= Resources.getResourceAsStream(config);            
    
  •             SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
    

3. 获取 SqlSession 对象

  •             SqlSession sqlSession=sqlSessionFactory.openSession();   
    

4. 执行 sql 语句

  •             方式一:通过 SqlSession 实例直接运行映射的 SQL 语句
    
    •                     List<Role> roleList=sqlSession.selectList("aa.bb");                  
      

方式二:基于 Mapper 接口方式操作数据(推荐使用)

  •                     RoleDao roleDao=sqlSession.getMapper(RoleDao.class);
    
    •                     List<Role> roleList=roleDao.getAllRole();
      

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代码中,不利于系统维护。

  • 对策:将sql语句及占位符和参数全部配置在XML中。
  •   Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型
    

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);
		}
	}

}

未完待续……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值