1. 单独使用jdbc编程问题总结
1.1 jdbc编程步骤
- 加载数据库驱动
- 创建并获取数据库链接
- 创建jdbc statement对象
- 设置sql语句
- 设置sql语句中的参数(使用preparedStatement)
- 通过statement执行sql并获取结果
- 对sql执行结果进行解析处理
- 释放资源(resultSet、preparedstatement、connection)
1.2 jdbc程序
1 | Public static void main(String[] args) { |
上边使用jdbc的原始方法(未经封装)实现了查询数据库表记录的操作。
1.3 jdbc问题总结如下
1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
设想:使用数据库连接池管理数据库连接。
2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。
4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。
2. MyBatis框架
2.1 MyBatis是什么?
mybatis是一个持久层的框架,它对jdbc的操作数据库的过程进行封装,不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
2.2 MyBatis框架
2.3 与hibernate不同
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
2.4 Mybatis与iBatis的主要差异对比
他们都是优秀的持久层框架,MyBatis是现在最常用的持久层框架,可以动态地拼接sql语句,非常人性化,更适合编辑复杂的sql;iBatis就是MyBatis前身,他们有很多相似的地方
1、传入参数
iBatis是parameterClass,而MyBatis是可以不写的,也可以用parameterType,parameterClass
iBatis的传出参数关键字是resultClass,而MyBatis是resultMap
2、判断语句
对于MyBatis的很简单,只要在where或者if标签里面添加test=“”就可以了,里面写判断条件。
但是iBatis的就麻烦了许多了,它将每个方法都进行了封装。例如isNull:判断字段是否为null
3、循环的使用
iBatis是使用Iterate,而MyBatis使用的是ForEach方法
4、MyBatis实现了DAO接口与xml映射文件的绑定,使用更加方便
3. MyBatis 框架快速入门
3.1 Mybatis 框架开发的准备
3.1.1 官网下载 Mybatis 框架
从百度中“mybatis download”可以下载最新的 Mybatis 开发包。https://mybatis.org/mybatis-3/
进入选择语言的界面,进入中文版本的开发文档。
下载相关的 jar 包或 maven 开发的坐标。
3.2 搭建 Mybatis 开发环境
3.2.1 创建 maven 工程
创建 MyBatis01 的工程,工程信息如下:
1 | <groupId>com.wgy</groupId> |
3.2.2 添加 Mybatis3.4.5 的坐标
在 pom.xml 文件中添加 Mybatis3.4.5 的坐标,如下:
1 | <dependencies> |
3.2.3 log4j.properties
1 | DEBUG,console = |
3.2.4 编写 User 实体类
1 | /** |
3.2.5 编写持久层口接口 IUserDao
1 | /** |
3.2.6 编写持久层接口的件映射文件 IUserDao.xml
创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
3.2.7 编写 SqlMapConfig.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
3.2.8 编写测试类
1 | /** |
3.3 基于注解的 mybatis 使用
3.3.1 在持久层接口中添加注解
1 | /** |
3.3.2 修改 SqlMapConfig.xml
1 | <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 |
注意事项:在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(IUserDao.xml) 。
4. 自定义 Mybatis 框架
4.1 自定义 Mybatis 框架的分析
4.1.1 涉及知识点介绍
构建一个属于自己的持久层框架,将会涉及到的一些知识点:工厂模式(Factory 工厂模式) 、构造者模式(Builder 模式)、代理模式,反射,自定义注解,注解的反射,xml 解析,数据库元数据,元数据的反射等。
4.1.2 分析流程
4.2 前期准备
4.2.1 创建 Maven 工程
创建 MyBatis04_Design 的工程,工程信息如下:
1 | <groupId>com.wgy</groupId> |
4.2.2 引入相关坐标
1 | <dependencies> |
4.2.3 引入 工具类到项目中
1 | /** |
1 | /** |
1 | /** |
4.2.4 编写 SqlMapConfig.xml
1 |
|
注意:此处我们直接使用的是 mybatis 的配置文件,但是由于我们没有使用 mybatis 的 jar 包,所以要把配置文件的约束删掉否则会报错(如果电脑能接入互联网,不删也行)
4.2.5 编写读取配置文件类
1 | /** |
4.2.6 编写 Mapper 类
1 | /** |
4.2.7 编写 Configuration 配置类
1 | /** |
4.2.8 编写 User 实体类
1 | /** |
4.3 基于 XML 的自定义 mybatis 框架
4.3.1 编写持久层接口和 IUserDao.xml
1 | /** |
1 |
|
注意:此处我们使用的也是 mybatis 的配置文件,所以也要把约束删除了
4.3.2 编写构建者类
1 | /** |
4.3.3 编写 SqlSessionFactory 接口和实现类
1 | /** |
1 | /** |
4.3.4 编写 SqlSession 接口和实现类
1 | /** |
1 | /** |
4.3.5 编写用于创建 Dao 接口代理对象的类
1 | /** |
4.3.6 运行测试类
1 | /** |
4.4 基于注解方式定义 Mybatis 框架
4.4.1 自定义@Select 注解
1 | /** |
4.4.2 修改持久层接口
1 | /** |
4.4.3 修改 SqlMapConfig.xml
1 | <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 --> |
-------------本文结束感谢您的阅读-------------
本文标题: MyBatis(一)
本文链接: https://wgy1993.gitee.io/archives/2073aa6b.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
