栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

从JDBC到Mybatis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从JDBC到Mybatis

文章目录
      • 一.为什么要抛弃JDBC这样传统的数据库访问模式而进化到数据持久层框架Mybatis或Hibernate
      • 二.在IDEA环境下以Mybatis为例对比说明Mybatis对JDBC的改造
        • 1.在IDEA中使用JDBC操作数据库
        • 2.在IDEA中使用Mybatis操作数据库
        • 3.从JDBC到Mybatis的改进
      • 三.总结
      • 四.参考链接

一.为什么要抛弃JDBC这样传统的数据库访问模式而进化到数据持久层框架Mybatis或Hibernate

首先观察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!");
    }
}

代码运行结果:

观察发现以下问题:

  1. 数据库配置信息存在硬编码问题,当我们使用不同数据库时,代码中的数据库驱动信息和连接信息都要修改。
  2. 需要频繁创建和释放数据库连接。
  3. SQL语句,设置参数及获取结果集参数均存在硬编码问题。
  4. 需要手动封装返回结果集。
  5. java是面向对象的,JDBC没有做到使数据能够面向对象的编程,使程序员的思考仍停留在SQL语句上。操作比较繁琐,很多代码需要重复写很多次,在trycatch之间徘徊。 如果遇到批量操作,频繁与数据库进行交互,容易造成效率的下降。

针对JDBC存在的问题,使用Mybatis就能解决以下问题:

  1. Mybatis使用配置文件加载数据库配置信息,很好地解决了硬编码问题。
  2. 对于创建和释放数据库连接等步骤,Mybatis直接使用连接池进行解决。
  3. 针对“sql语句、设置参数及获取结果集参数均存在硬编码”的问题,Mybatis也使用配置文件解决了该问题。(这里一般不和数据库配置信息在同一个配置文件中进行配置,因为数据库配置信息在一个项目中只配置一次,但sql语句等经常会发生变化)。
  4. 对于结果集的封装操作,Mybatis使用反射和内省进行解决。

和JDBC相比,hibernate也具有很多优点:

Hibernate利用面向对象的技术操作数据库,是一个面向对象操作数据库的orm框架,是基于JDBC开发的。

​ Hibernate实现了面向对象的数据库编程

​ Hibernate比起JDBC来,在代码的书写上比较简单化了。

​ Hibernate提出了缓存机制,这样可以使访问数据的效率提高很大。

​ Hibernate切换数据库非常简单

1、Hibernate对JDBC访问数据库的代码做了封装,大大简化

​ 了数据访问层繁琐的重复性代码。
2、Hibernate是一个基于jdbc的主流持久化框架,是一个优秀

​ 的orm实现,它很大程度的简化了dao层编码工作。
3、Hibernate使用java的反射机制,而不是字节码增强程序类实现

​ 透明性
4、Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵

​ 活性很出色。它支持很多关系型数据库,从一对一到多对多的各

​ 种复杂关系。

5、Hibernate使数据库的操作完全面向对象。而不是从前的面向关系进行操作。

二.在IDEA环境下以Mybatis为例对比说明Mybatis对JDBC的改造 1.在IDEA中使用JDBC操作数据库

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的改进
  1. 通过对比可以发现,Mybatis使用数据库连接池解决了JDBC数据库连接的获取和关闭造成的资源浪费问题,实现反复利用已经建立好的连接访问数据库,减少连接开启和关闭的时间。
  2. Mybatis将SQL语句写在配置文件中通过xml或注解的方式将要执行各种statement配置好,通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。这样当需要更改 SQL时,只需要更改配置文件。
  3. 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327827.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号