- 一.为什么要抛弃JDBC这样传统的数据库访问模式而进化到数据持久层框架Mybatis或Hibernate
- 二.在IDEA环境下以Mybatis为例对比说明Mybatis对JDBC的改造
- 1.在IDEA中使用JDBC操作数据库
- 2.在IDEA中使用Mybatis操作数据库
- 3.从JDBC到Mybatis的改进
- 三.总结
- 四.参考链接
首先观察JDBC对数据库进行访问的代码
package test1package;
import java.sql.*;
public class MySQLDemo {
// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/runoob";
// MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
//static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
//static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 执行查询
System.out.println(" 实例化Statement对象...");
stmt = conn.createStatement();
String sql;
sql = "SELECt id, name, url FROM websites";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
int id = rs.getInt("id");
String name = rs.getString("name");
String url = rs.getString("url");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", 站点名称: " + name);
System.out.print(", 站点 URL: " + url);
System.out.print("n");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 错误
e.printStackTrace();
}finally{
// 关闭资源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}// 什么都不做
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
代码运行结果:
观察发现以下问题:
- 数据库配置信息存在硬编码问题,当我们使用不同数据库时,代码中的数据库驱动信息和连接信息都要修改。
- 需要频繁创建和释放数据库连接。
- SQL语句,设置参数及获取结果集参数均存在硬编码问题。
- 需要手动封装返回结果集。
- java是面向对象的,JDBC没有做到使数据能够面向对象的编程,使程序员的思考仍停留在SQL语句上。操作比较繁琐,很多代码需要重复写很多次,在trycatch之间徘徊。 如果遇到批量操作,频繁与数据库进行交互,容易造成效率的下降。
针对JDBC存在的问题,使用Mybatis就能解决以下问题:
- Mybatis使用配置文件加载数据库配置信息,很好地解决了硬编码问题。
- 对于创建和释放数据库连接等步骤,Mybatis直接使用连接池进行解决。
- 针对“sql语句、设置参数及获取结果集参数均存在硬编码”的问题,Mybatis也使用配置文件解决了该问题。(这里一般不和数据库配置信息在同一个配置文件中进行配置,因为数据库配置信息在一个项目中只配置一次,但sql语句等经常会发生变化)。
- 对于结果集的封装操作,Mybatis使用反射和内省进行解决。
和JDBC相比,hibernate也具有很多优点:
Hibernate利用面向对象的技术操作数据库,是一个面向对象操作数据库的orm框架,是基于JDBC开发的。
Hibernate实现了面向对象的数据库编程
Hibernate比起JDBC来,在代码的书写上比较简单化了。
Hibernate提出了缓存机制,这样可以使访问数据的效率提高很大。
Hibernate切换数据库非常简单
二.在IDEA环境下以Mybatis为例对比说明Mybatis对JDBC的改造 1.在IDEA中使用JDBC操作数据库1、Hibernate对JDBC访问数据库的代码做了封装,大大简化
了数据访问层繁琐的重复性代码。
2、Hibernate是一个基于jdbc的主流持久化框架,是一个优秀 的orm实现,它很大程度的简化了dao层编码工作。
3、Hibernate使用java的反射机制,而不是字节码增强程序类实现 透明性
4、Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵 活性很出色。它支持很多关系型数据库,从一对一到多对多的各
种复杂关系。
5、Hibernate使数据库的操作完全面向对象。而不是从前的面向关系进行操作。
Conn.java
//导入包
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Conn {
public static void main(String[] args) {
Connection con;
//jdbc驱动
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/studentcourseadmin?&useSSL=false&serverTimezone=UTC";
String user="root";
String password="123456";
try {
//注册JDBC驱动程序
Class.forName(driver);
//建立连接
con = DriverManager.getConnection(url, user, password);
if (!con.isClosed()) {
System.out.println("数据库连接成功");
}
Statement stmt=con.createStatement();
String sql;
sql="select id,name,major from student";
ResultSet ret=stmt.executeQuery(sql);
while (ret.next()){
int id=ret.getInt("id");
String name=ret.getString("name");
String major=ret.getString("major");
System.out.print("学号:"+id);
System.out.print("姓名:"+name);
System.out.println("专业:"+major);
}
con.close();
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动没有安装");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
运行:
2.在IDEA中使用Mybatis操作数据库在IDEA中新建一个Maven项目并导入依赖
pom.xml
4.0.0 org.example mybatistest 1.0-SNAPSHOT 8 8 mysql mysql-connector-java 5.1.47 junit junit 4.12 org.mybatis mybatis 3.5.7
为该项目创建如下文件
StudentMapper
package top.upstudy.dao;
import top.upstudy.pojo.Student;
public interface StudentMapper{
Student getStudent(int i);
}
Student
package top.upstudy.pojo;
public class Student {
private int id;
private String name;
private String major;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getMajor() {
return this.major;
}
public void setMajor(String major) {
this.major = major;
}
}
MybatisUtils
package top.upstudy.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//绑定配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
Mapper.xml
select * from student where id = #{id}
mybatis-config.xml
StudentMapperTest
package top.upstudy.dao;
import junit.framework.TestCase;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import top.upstudy.pojo.Student;
import top.upstudy.utils.MybatisUtils;
import java.util.List;
public class StudentMapperTest extends TestCase {
@Test
public void testfindStudent(){
//获取连接
SqlSession session = MybatisUtils.getSession();
//绑定mapper接口
StudentMapper mapper = session.getMapper(StudentMapper.class);
//以id查询查询学生数据
Student student = mapper.getStudent(1);
System.out.print("id:"+student.getId());
System.out.print("name:"+student.getName());
System.out.print("major:"+student.getMajor());
//关闭连接
session.close();
}
}
运行结果如下:
Mybatis不需要我们边写JDBC代码,只需要关注SQL的编写以及mapper文件的对应,配置完成后进行增删改查操作是十分方便的。
3.从JDBC到Mybatis的改进三.总结
- 通过对比可以发现,Mybatis使用数据库连接池解决了JDBC数据库连接的获取和关闭造成的资源浪费问题,实现反复利用已经建立好的连接访问数据库,减少连接开启和关闭的时间。
- Mybatis将SQL语句写在配置文件中通过xml或注解的方式将要执行各种statement配置好,通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。这样当需要更改 SQL时,只需要更改配置文件。
- Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对 结果的解析处理过程。
使用Mybatis连接数据库能够免除很多麻烦,通过配置文件的修改,能够很方便的为项目增减相关配置,不用一开始就将所有配置设置好,还可以根据自己的需要随时修改配置版本等,在对数据库的操作中,Mybatis帮我们做了很多工作,连接池的使用节约了数据库反复连接关闭的时间,更加合理。
项目代码:
https://github.com/Parallel-leaves/jdbctest
https://github.com/Parallel-leaves/mybatistest
MyBatis-从JDBC到Spring整合MyBatis_zgliulin-CSDN博客
https://blog.csdn.net/xxssyyyyssxx/article/details/50125077
https://www.cnblogs.com/blayn/p/12768268.html
https://blog.csdn.net/u010176014/article/details/52028854
https://blog.csdn.net/mahaokun/article/details/103221874/
https://blog.csdn.net/qq_36172505/article/details/84102468
https://blog.csdn.net/weixin_43878332/article/details/107615069



