原生态jdbc操作存在的问题:
1. 数据库连接,使用时就创建,不使用时立即释放,对数据库进行频繁连接的开启和关闭,造成数据库资源浪费,影响了数据库性能。
* 解决方案:使用数据库连接池管理数据库连接。
2. 将 sql 语句硬编码到 java 代码中,如果 sql 语句修改,需要重新编译 java 代码,不利于系统维护。
* 解决方案:将 sql 语句配置在 xml 配置文件中,即使 sql 变化,不需要对 java 代码进行重新编译。
3. 向 preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在 java 代码中,不利于系统维护。
* 解决方案:将 sql 语句及占位符和参数全部配置在 xml 中。
4. 从 resultSet 中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
* 解决方案:将查询的结果集,自动映射成 java 对象。
Mybatis框架
1. Mybatis是一个持久层框架,是apache下的顶级项目。
2. Mybatis托管到googlecode下,在后来托管到github下(http://github.com/mybatis/mybatis-3/releases)
3. Mybatis让程序员将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员来编写sql)满足需要的sql语句。
4. Mybatis可以将向 preparedStatement中输入的参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
Mybatis框架执行流程步骤
1.SqlMapConfig.xml(是mybatis的全局配置文件,名称不固定的),配置了数据源、事务等mybatis运行环境
* 配置映射文件(配置sql语句)mapper.xml(映射文件)、mapper.xml、mapper.xml...
2. SqlSessionFactory(会话工厂),根据配置文件创建工厂。
* 作用:创建SqlSession
3.SqlSession(会话),是一个接口,面向用户(程序员)的接口。
* 作用:操作数据库(发出sql增、删、改、查)
4.Executor(执行器),是一个接口(基本执行器、缓存执行器)
* 作用:SqlSession内部通过Executor执行器操作数据库
5.mapped statement(底层封装对象)
* 作用:对操作数据库存储封装,包括sql语句,输入参数,输出结果类型
* 输入参数类型:java简单类型 hashmap pojo自定义
* 输出参数类型:java简单类型 hashmap pojo自定义
6.mysql数据库
Mybatis与Hibernate的区别
1. mybatis不是纯粹的orm框架,需要开发人员手动编写sql,sql优化容易,适用于需求变化较大的项目。
2. hibernate是纯粹的orm框架,不用手动编写sql,sql优化比较困难,适合一些需求变化不多的小型项目,oa,crm.erp等。
原始Dao开发问题
1. dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
2. 调用sqlsession方法时将statement的id硬编码了。
3. 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
mapper代理方法开发问题
1.代理对象内部调用selectOne或selectList。
* 如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
* 如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
2.mapper接口方法参数只能有一个是否影响系统开发。
* mapper接口方法参数只能有一个,系统是否不利于扩展维护。
* 系统 框架中,dao层的代码是被业务层公用的。
* 即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
*
* 注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
SqlMapConfig.xml
mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:
- properties(属性)
- settings(全局配置参数)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- transactionManager(事务管理)