MyBatis学习01-前篇之JDBC

MyBatis学习01-前篇之JDBC

    • 1 前言
    • 2 JDBC
      • 2.1 官网地址
      • 2.2 简介
      • 2.3 示例
      • 2.4 JDBC 优缺点
        • 2.4.1 优点
        • 2.4.2 缺点

1 前言

在系统开发过程中,开发人员需要使用面向对象的思维实现业务逻辑,但设计数据库表或是操作数据库记录时,则需要通过关系型的思维方式考虑问题。应用程序与关系型数据库之间进行交互时,数据在对象和关系结构中的表、列、字段等之间进行转换。

目前常用的关系型数据库有 Mysql、Oracle、SqlServer,随着国产化的推行,国产化数据越来越多的出现在人们眼前,常用的国产化数据库如:达梦、人大金仓、神舟通用等。系统中操作的关系型数据库主要就是这些。

2 JDBC

2.1 官网地址

https://www.oracle.com/database/technologies/appdev/jdbc.html

2.2 简介

JDBC 是 Java 与数据库交互的统一 API,在实际开发 Java 系统时,我们可以通过 JDBC 完成多种数据库操作。这里以传统 JDBC 编程中的查询操作为例进行说明,其主要步骤如下:

  1. 注册数据库驱动类,明确指定数据库 URL 地址,数据库用户名、密码等连接信息。
  2. 通过 DriverManager 打开数据库连接。
  3. 通过数据库连接创建 PreparedStatement 对象。
  4. 通过 PreparedStatement 对象执行SQL 语句,得到 ResultSet 对象。
  5. 通过 ResultSet 对象,并将数据库转换成 JavaBean 对象。
  6. 关闭 ResultSet、PreparedStatement 对象以及数据库连接,释放资源。

2.3 示例

运行环境:Win10 + Jdk1.8 + Maven3 + Intellij IDEA 2020 + mysql5.7

1、示例代码地址

https://gitee.com/lif/study-mybatis/tree/master

2、目录结构如下

MyBatis学习01-前篇之JDBC_第1张图片

3、pom.xml 文件引入数据库驱动包




    4.0.0

    com.ddpyjqtd
    simple-jdbc
    1.0-SNAPSHOT

    simple-jdbc

    
        UTF-8
        1.8
        1.8
    

    
        
        
            org.projectlombok
            lombok
            1.18.10
            provided
        

        
        
            mysql
            mysql-connector-java
            8.0.20
        

        
        
            org.slf4j
            slf4j-api
            1.7.30
        

        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.13.3
            test
        

        
        
            org.apache.logging.log4j
            log4j-api
            2.13.3
        

        
        
            org.apache.logging.log4j
            log4j-core
            2.13.3
        

        
            junit
            junit
            4.11
            test
        
    



4、增加 model 类: Demo.java

package com.ddpyjqtd.demo.jdbc.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.Date;

/***
 * 测试表对应的demo类
 *
 * @author ddpyjqtd
 * @date 2020/5/27 21:54
 */
@Getter
@Setter
@ToString
public class Demo {
    /**
     * int 类型字段
     */
    private int demoInt;
    /**
     * String 类型字段
     */
    private String demoVarchar;
    /**
     * text 类型字段
     */
    private String demoText;
    /**
     * datetime 类型字段
     */
    private Date demoDateTime;
}

5、增加数据库配置文件:db.properties,内容如下:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username=root
password=root

6、增加日志配置文件 log4j2.xml,内容如下:




    
        
        d://logs
        simple-jdbc

        ${file_path}/${project_name}.log
        ${file_path}/${project_name}-sql.log
        ${file_path}/${project_name}-error.log
        %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c{36} %L %M - %m%n
    
    
        
        
            
            
        
        
        
            
            
        
        
        
            
            
        
    
    
        
        

        
        
            
            
            
        
    

7、增加数据库配置文件读取工具类:DbUtils.java,内容如下:

package com.ddpyjqtd.demo.jdbc.util;

import lombok.Getter;
import lombok.Setter;

import java.util.ResourceBundle;

/**
 * 数据库工具类
 *
 * @author: ddpyjqtd
 * @date: 2020/5/27 22:10
 */
public class DbUtils {
    private DbUtils() {
    }

    public static final String DRIVER;
    public static final String URL;
    public static final String USER_NAME;
    public static final String PASS_WORD;

    static {
        ResourceBundle bundle = ResourceBundle.getBundle("db");
        DRIVER = bundle.getString("driver");
        URL = bundle.getString("url");
        USER_NAME = bundle.getString("username");
        PASS_WORD = bundle.getString("password");

    }
}

8、编写数据库操作类:DemoDao.java,内容如下:

package com.ddpyjqtd.demo.jdbc.dao;

import com.ddpyjqtd.demo.jdbc.model.Demo;
import com.ddpyjqtd.demo.jdbc.util.DbUtils;
import lombok.extern.slf4j.Slf4j;

import java.sql.*;

/**
 * Demo 实例对象数据库查询方法
 *
 * @author: ddpyjqtd
 * @date: 2020/5/27 21:52
 */

@Slf4j
public class DemoDao {

    /**
     * 通过ID获取DEMO对象信息
     *
     * @param demoId 主键ID
     * @return com.ddpyjqtd.demo.jdbc.model.Demo
     * @author ddpyjqtd
     * @date 2020/5/27 21:56
     */
    public Demo findDemoById(int demoId) {
        Connection conn = null;
        PreparedStatement pst = null;
        ResultSet rs = null;
        Demo demo = null;
        try {
            // 加载驱动包
            Class.forName(DbUtils.DRIVER);

            // 获取数据库连接
            conn = DriverManager.getConnection(DbUtils.URL,DbUtils.USER_NAME, DbUtils.PASS_WORD);

            // 预加载
            pst = conn.prepareStatement("select * from demo where demo_int = ? ");
            pst.setInt(1, demoId);

            // 获取结果集
            rs = pst.executeQuery();

            // 将结果集映射到对象中
            while (rs.next()) {
                demo = new Demo();
                demo.setDemoInt(rs.getInt("demo_int"));
                demo.setDemoText(rs.getString("demo_text"));
                demo.setDemoVarchar(rs.getString("demo_varchar"));
                demo.setDemoDateTime(rs.getTime("demo_date_time"));
                log.info("demo info: {}", demo.toString());
            }
        } catch (Exception e) {
            log.error("error:", e);
        } finally {
            // 资源回收
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                   log.error("rs close error : ", throwables);
                }
            }
            if (pst != null) {
                try {
                    pst.close();
                } catch (SQLException throwables) {
                    log.error("pst close error : ", throwables);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    log.error("conn close error : ", throwables);
                }
            }
        }
        return  demo;
    }
}

9、执行 SQL

CREATE TABLE demo  (
  demo_int int(255) NOT NULL COMMENT 'int 类型字段',
  demo_varchar varchar(255)  NULL DEFAULT NULL COMMENT 'String 类型字段',
  demo_text text  NULL COMMENT 'text 类型字段',
  demo_date_time datetime(0) NULL DEFAULT NULL COMMENT 'datetime 类型字段',
  PRIMARY KEY (demo_int) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '示例表,各个字段为数据库的各种类型' ROW_FORMAT = Dynamic;


insert into demo (demo_int, demo_varchar, demo_text, demo_date_time)
VALUES (1, 'this is demo_varchar', 'this is demo_text', now());

10、编写测试类:TestDemoDao.java,内容如下:

package com.ddpyjqtd.demo.jdbc.dao;

import com.ddpyjqtd.demo.jdbc.model.Demo;
import org.junit.Assert;
import org.junit.Test;

/**
 * 测试类
 *
 * @author: ddpyjqtd
 * @date: 2020/5/27 22:28
 */
public class TestDemoDao {

    @Test
    public void testFindDemoById() {
        int demoInt = 1;
        DemoDao dao = new DemoDao();
        Demo demo = dao.findDemoById(demoInt);
        Assert.assertNotNull(demo);
    }
}

11、运行测试类,执行结果如下:

在这里插入图片描述

2.4 JDBC 优缺点

2.4.1 优点

  • 所有 ORM 框架底层最终都会使用到 JDBC 方式,JDBC 方式是所有 ORM 框架的基石。掌握 JDBC 有助于学习后续所有的 ORM 框架。
  • 性能是最快的。
  • 兼容所有的数据库(只要有对应的数据库驱动包)。

2.4.2 缺点

  • 封闭程度不够,需要开发写的代码比较多。
  • 数据库连接、预加载、结果集等资源需要开发单独进行管理。
  • SQL 存在硬编码。
  • 结果集进行对象映射还需要单独进行抽取才能适应不同的对象。

你可能感兴趣的:(MyBatis,java,mybatis)