一. JDBC 形式的缺点
MyBatis 是数据持久层的操作,是对数据库的处理, 在介绍它之前,先来了解一下,原来的jdbc 的处理,有哪些缺点,然后看看MyBatis 是如何进行改变的。
先来简单写一个User 类,只有id,name,age,sex,description 五个简单的字段,是简单的pojo 类。 对其进行简单的查询操作:
一.二 JDBC类
package com.yjl.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** @author:yuejl @date: 2019年6月15日 上午11:53:34 @Description 类的相关描述 */ public class DBUtils { public static Connection getConnection(){ Connection connection=null; try { Class.forName("com.mysql.jdbc.Driver"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8", "root","abc123"); } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return connection; } public static void close(ResultSet resultSet,Statement statement,Connection connection){ if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } }
一.三 根据id 编号进行查询的方法
@Test public void oldTest() throws SQLException{ Connection connection=DBUtils.getConnection(); String sql="select * from user where id=?"; PreparedStatement statement=connection.prepareStatement(sql); statement.setInt(1, 1); ResultSet resultSet=statement.executeQuery(); User user=null; while(resultSet.next()){ user=new User(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setAge(resultSet.getInt("age")); user.setSex(resultSet.getString("sex")); user.setDescription(resultSet.getString("description")); } DBUtils.close(resultSet,statement,connection); System.out.println(user); }
运行之后,会显示:
仔细观察,会发现这种写法,有很多的不足之处。
一.四 原始JDBC 开发的不足
- 数据库的连接。 数据库在使用时被创建,不使用就释放, 对数据库进行频繁的连接开启和关闭,造成数据库资源浪费,影响数据库的性能。
- 数据库信息被硬编码。
connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8", "root","abc123");
数据库的连接信息被硬编码到连接数据库类中,如果更换数据库,则需要改变相应的信息,重新编码。即使可以写在 jdbc.properties 等配置文件里面,那么还需要写一个单独的读取 jdbc.properties 文件信息的类。
- sql 语句被硬编码
String sql="select * from user where id=?";
如果sql 被修改, 实际开发中,是常常被修改的, 那么就必须重新编译,不利用系统维护。
4.向PreparedStatement 设置值时,对参数的位置 和值,硬编码到程序里面。 不利于系统维护。 如 设置 ? 时,id 放在了第一位, 如果有name, name放在了第二位, 那么在传参的时候,必须把id 放在第一个,name 放在第二个。
statement.setInt(1, 1);
- 遍历结果集数据时, 将获取表的字段值,进行了硬编码。不利用系统维护。
user=new User(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setAge(resultSet.getInt("age")); user.setSex(resultSet.getString("sex")); user.setDescription(resultSet.getString("description"));
如,如果修改了数据库的字段,description, 现在要改成desc, 那么就都得改变,列名硬编码到程序中。 当然,可以通过 getInt(1),getString(2) 这样的索引顺序来取得,那么列名就不硬编码了,但是 索引顺序就硬编码了。 改变sql 前后值的顺序,就有可能出错。
6.某些功能无法实现。
如 根据传过来的值,来动态的显示列。 即 前台传入列的名称,来动态的显示 列。 前台传入name 和sex, 就查询name 和sex 列, 前台传入name,sex,age 就动态查询name,sex,age 列。
二. MyBatis
二.一 MyBatis 的出现
在MyBatis 之前,是叫 ibatis, 是Apache 组织的开发的。 现在交由github 管理了。 还有一种 持久化ORM ,叫Hibernate. 前面讲过。 可以看:
Hibernate开发环境的简单搭建及常见错误(一)
将Hibernate 与 MyBatis 进行比较性 开发。
MyBatis 的下载网址是:
https://github.com/mybatis/mybatis-3
下载之后:
其中, mybatis-3.4.5.jar 是开发的jar 包, mybatis-3.4.5.pdf 是帮助文档, lib 是常用的关联jar 包。
二.二 MyBatis 的作用
mybatis是一个持久层的框架,是apache下的顶级项目。
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)