从 JDBC 到 Mybatis
JDBC 操作数据库流程
1、加载驱动
2、获取数据库连接
3、获取执行者对象
4、执行sql语句并返回结果
5、处理结果
- 代码
public class JDBCTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");//MySQL5以后可直接省略
//获取数据库连接
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/project","root","zcq200427");
//获取执行者对象
Statement stat=con.createStatement();
//执行sql语句并返回结果
String sql="select * from user";
ResultSet re=stat.executeQuery(sql);
//处理结果
while (re.next()){
System.out.println(re.getLong("id")+"\t"+re.getString("name")+"\t" );
}
//释放资源
con.close();
}
}
- 数据库驱动
数据库驱动是应用程序和数据库存储之间的一种接口,数据库厂商为了某一种开发语言环境(比如Java,C)能够实现数据库调用而开发的类似翻译员功能的程序,将复杂的数据库操作与通信抽象成为了当前开发语言的访问接口。
- Connection 用于与数据库简历连接,Mysql 内部有对应的连接池以达到连接资源的复用
- 通过 Statement 来简化数据库操作的流程
- 通过 ResultSet 来获取 SQL 执行的结果集
- 关闭连接
JDBC 的弊端
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");//MySQL5以后可直接省略
//获取数据库连接
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/project","root","zcq200427");
//获取执行者对象
Statement stat=con.createStatement();
- 注意
1、前面三个步骤可以统一封装成 DBUtils (getConnection() , closeConnection() , getStatement() 等)
2、数据库连接在使用时就创建,不使用时就关闭,造成了极大的数据库资源浪费
3、SQL 语句在 JAVA 代码中不方便我们进行统一的管理
4、手动设置 PreparedStatement 造成硬编码
5、从 ResultSet 获取结果集存在硬编码
Mybatis
Mybatis 介绍
1、它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低
什么是ORM?
2、Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应student表,一个Student对象就对应student表中的一行数据
3、为什么mybatis是半自动的ORM框架?
用mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。用hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作了。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由地对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言(Dialect),所以mybatis的数据库无关性低。虽然mybatis需要手写SQL,但相比JDBC,它提供了输入映射和输出映射,可以很方便地进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提升了开发的效率。并且它的学习成本也比hibernate低很多