第一章、基础理论
1.传统javaEE的缺点
jsp+servlet开发
- 软件应用和系统可维护性差
- 代码重用性低
MyBatis是一个优秀的持久层框架,它可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(Object/Relation Mapping,即对象关系映射)实现。
2. JDBC
JDBC是Java程序实现数据访问的基础,JDBC的劣势主要有以下几个方面。
(1)数据库连接创建、释放频繁会造成系统资源浪费,从而影响系统性能。
(2) SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中,SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反了开闭原则。
(3)用PreparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码,造成系统不易维护。
(4) JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。
3.持久层
将数据持久化
------------------>
将程序的数据由瞬时状态转化成持久状态
- 数据库、IO
- 内存断电即失
持久层
完成持久化工作的代码层块
4.mybatis概念
MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,
它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,
使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO映射成数据库中的记录,
使得Java开发人员可以使用面向对象的编程思想来操作数据库。
ORM
Mybatis对jdbc的优化
-
问题一:数据库链接创建、释放频繁会造成系统资源浪费,从而影响系统性能。
解决方案:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
-
问题二:SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中,SQL变化的可能较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反了开闭原则。
解决方案:MyBatis将SQL语句配置在MyBatis的映射文件中,实现了与Java代码的分离。
-
问题三:使用preparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码,造成系统不易维护。
解决方案:MyBatis自动将Java对象映射至SQL语句,通过Statement中的parameterType定义输入参数的类型。
-
问题四:JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。
解决方案:MyBatis自动将SQL执行结果映射至Java对象,通过Statement中的resultType定义输出结果的类型。
5.MyBatis工作原理
理论
原理图解析
- MyBatis读取mybatis-config.xml文件,获取运行环境环境等信息
- 加载映射文件-------Mapper.xml文件,就是SQl语句文件,实现具体的CRUD,需要通过在mybatis-config.xml加载
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
- 利用mybatis-config.xml等配置信息创建会话工厂,SqlSessionFactory------>SqlSession
- Sqlsession对象用法类似于PareStmt,用于执行SQL
- MyBatis底层内部创建Executor接口,执行SQL
- 操作数据库
- 将执行SQL语句的输出结果,通过MappedStatement映射到POJO对象。
代码讲解理论
- 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory
的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从
XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
SqlSessionFactory sqlMapper = new
SqlSessionFactoryBuilder().build(reader);
Configuration:
<configuration>
<properties resource="db.properties"/>
<!--默认使用id来运行-->
<environments default="development">
<environment id="development">
<!-- 用jdbc建立事务管理-->
<transactionManager type="JDBC"/>
<!-- 数据库连接相关配置 ,db.properties文件中的内容-->
<dataSource type="POOLED">
*************
*********
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>