MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
public class Person {//一个Person类 对应于一个person表
private Long pid;
private String pname;
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
}
使用JDBC进行查询操作:
package com.ys.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DebugGraphics;
import com.ys.bean.Person;
public class CRUDDao {
public static String driverClass = "com.mysql.jdbc.Driver";//MySQL数据库驱动
public static String userName = "root"; //MySQL用户名
public static String passWord = "root";//MySQL密码
public static String url = "jdbc:mysql://localhost:3306/test"; //MySQL URL,test是表名
public static Connection conn = null;//定义数据库连接
public static PreparedStatement ps = null; //定义声明数据库语句,使用 预编译声明 PreparedStatement提高数据库执行性能
public static ResultSet rs = null; //定义返回结果集
/**
* 查询 person 表信息
* @return:返回 person 的 list 集合
*/
public static List<Person> readPerson(){
List<Person> list = new ArrayList<>();
try {
//加载数据库驱动
Class.forName(driverClass);
//获取数据库连接
conn = DriverManager.getConnection(url, userName, passWord);
//定义 sql 语句,? 表示占位符
String sql = "select * from person where pname=?";
//获取预编译处理的statement
ps = conn.prepareStatement(sql);
//设置sql语句中的参数,第一个为sql语句中的参数的?(从1开始),第二个为设置的参数值
ps.setString(1, "qzy");
//向数据库发出 sql 语句查询,并返回结果集
rs = ps.executeQuery();
while (rs.next()) {
Person p = new Person();
p.setPid(rs.getLong(1));
p.setPname(rs.getString(2));
list.add(p);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭数据库连接
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return list;
}
public static void main(String[] args) {
System.out.println(CRUDDao.readPerson());
}
}
通过上面的例子我们可以分析如下几点:
①、问题一:数据库连接,使用时就创建,使用完毕就关闭,这样会对数据库进行频繁的获取连接和关闭连接,造成数据库资源浪费,影响数据库性能。
设想解决:使用数据库连接池管理数据库连接
②、问题二:将 sql 语句硬编码到程序中,如果sql语句修改了,那么需要重新编译 Java 代码,不利于系统维护
设想解决:将 sql 语句配置到 xml 文件中,即使 sql 语句变化了,我们也不需要对 Java 代码进行修改,重新编译
③、问题三:在 PreparedStatement 中设置参数,对占位符设置值都是硬编码在Java代码中,不利于系统维护
设想解决:将 sql 语句以及占位符和参数都配置到 xml 文件中
④、问题四:从 resultset 中遍历结果集时,对表的字段存在硬编码,不利于系统维护
设想解决:将查询的结果集自动映射为 Java 对象
⑤、问题五:重复性代码特别多,频繁的 try-catch
设想解决:将其整合到一个 try-catch 代码块中
⑥、问题六:缓存做的很差,如果存在数据量很大的情况下,这种方式性能特别低
设想解决:集成缓存框架去操作数据库
⑦、问题七:sql 的移植性不好,如果换个数据库,那么sql 语句可能要重写
设想解决:在 JDBC 和 数据库之间插入第三方框架,用第三方去生成 sql 语句,屏蔽数据库的差异
Mybatis 相比于JDBC 减少的代码是哪一部分?