JDBC 编程中的问题
1. 将 SQL 语句硬编码到 Java 代码,不利于系统维护。 设想如何解决:将SQL单独抽取出来,在配置文件(xml方式、properties文件)进行配置。
2. 数据库连接不能重复利用,对数据库资源是一中浪费。 设想如何解决:使用数据库连接池管理数据库连接。
3. 向 Statement 设置参数时,对于参数的位置通过硬编码指定,不利于系统维护。 设想如何解决:是否能够自动将 Java 对象的值设置到 Statement。
4. 遍历结果集,resultSet.getString硬编码指定列名称。 设想如何解决:能否自动将 SQL 查询结果集转成 Java 对象。
MyBatis 介绍
MyBatis 本是 Apache 的一个开源项目 iBatis,2010年这个项目由 Apache software foundation 迁移到 google code,并且改名为 MyBatis。
MyBatis 是一个优秀的持久层框架,它对 JDBC 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 JDBC 繁杂的过程代码。
MyBatis 通过 xml 或主键的方式将要执行的 statement 配置起来,并通过 Java 对象和 statement 中的 SQL 进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL 并将结果映射成 Java 对象并返回。
MyBatis 是一个不完全的 ORM 框架,MyBatis 也可以进行对象关系映射,但是还是需要手动写 SQL 语句。Hibernate 对JDBC 的封装比较深,是一个完全的优秀的 ORM 框架,完全实现了 Java 对象到关系的映射,SQL 不需要手动编写。
Mybatis 框架
Mybatis配置
1. SqlMapConfig.xml 是 MyBatis 的核心配置文件,配置了数据源(连接池)、事务。mapper.xml 是 MyBatis 的映射文件。 2. SqlSessionFactory 会话工厂,用户生产会话SqlSession。 3. SqlSession 会话,是一个面向用户的门面接口,用于操作数据库(CRUD)。 4. Executor 执行器,SqlSession 内部通过 Executor 操作数据库,Executor 需要使用 Mapped Statement 中封装的数据信息来操作数据库。 5. Mapped Statement 是 MyBatis 一个底层封装对象,封装了 SQL 语句、传入 SQL 语句的参数,将 SQL 查询结果映射成 Java 对象。
Mybatis 入门程序
https://github.com/JeromeSuz/demo_mybatis
Mybatis 是如何解决JDBC的问题
1. 将SQL语句硬编码到Java代码,不利于系统维护。 设想如何解决:将SQL单独抽取出来,在配置文件(xml方式、properties文件)进行配置。 在 MyBatis 的映射文件(如:User.xml)配置sql语句。 2. 数据库连接不能重复利用,对数据库资源是一中浪费。 设想如何解决:使用数据库连接池管理数据库连接。 在 SqlMapConfig.xml 下的 environments 节点配置了连接池。
3. 向 Statement 设置参数时,对于参数的位置通过硬编码指定,不利于系统维护。(如 preparedStatement.setString(1,"jerome")) 设想如何解决:是否能够自动将 Java 对象的值设置到 Statement。 在User.xml中通过 paramenterType,输入参数的类型,在sql语句通过#{}表示占位符号,{}写的是po的属性名,完成自动将 Java 对象映射到 SQL 语句中。 4. 遍历结果集,resultSet.getString 硬编码指定列名称。(如:resultSet.getString("id")) 设想如何解决:能否自动将SQL查询结果集转成Java对象。 User user = sqlSession.selectOne("test.findUserByName", "jerome");
参考
传智播客公开课:链接:http://pan.baidu.com/s/1bnbH2qj 密码:9f30
源码
https://github.com/JeromeSuz/demo_mybatis