使用JDBC程序的問題總結

  1. 利用navicat,導入mybatis.sql,建立兩個數據表order表和user表。java

    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `orders`
    -- ----------------------------
    DROP TABLE IF EXISTS `orders`;
    CREATE TABLE `orders` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL COMMENT '下單用戶id',
      `number` varchar(32) NOT NULL COMMENT '訂單號',
      `createtime` datetime NOT NULL COMMENT '建立訂單時間',
      `note` varchar(100) DEFAULT NULL COMMENT '備註',
      PRIMARY KEY (`id`),
      KEY `FK_orders_1` (`user_id`),
      CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of orders
    -- ----------------------------
    INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);
    INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);
    INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);
    
    -- ----------------------------
    -- Table structure for `user`
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(32) NOT NULL COMMENT '用戶名稱',
      `birthday` date DEFAULT NULL COMMENT '生日',
      `sex` char(1) DEFAULT NULL COMMENT '性別',
      `address` varchar(256) DEFAULT NULL COMMENT '地址',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', '王五', null, '2', null);
    INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市');
    INSERT INTO `user` VALUES ('16', '張小明', null, '1', '河南鄭州');
    INSERT INTO `user` VALUES ('22', '陳小明', null, '1', '河南鄭州');
    INSERT INTO `user` VALUES ('24', '張三丰', null, '1', '河南鄭州');
    INSERT INTO `user` VALUES ('25', '陳小明', null, '1', '河南鄭州');
    INSERT INTO `user` VALUES ('26', '王五', null, null, null);
  2. idea建立工程,導入驅動包mysql-connector-java-5.1.37-bin.jar到lib文件夾mysql

  3. 7步使用jdbcsql

    1. 註冊驅動(從 JDBC3 開始,目前已經廣泛使用的版本。能夠不用註冊驅動而直接使用。故7步)
    2. 獲取數據庫鏈接對象 Connection
    3. 定義sql,?表示佔位符
    4. 獲取預處理statement(prepareStatement)
    5. 設置sql語句中的參數(使用preparedStatement)
    6. 執行sql,接受返回結果
    7. 處理結果
    8. 釋放資源

代碼以下:數據庫

import java.sql.*;

/**
 * @ClassName: JdbcTest
 * @author: benjamin
 * @version: 1.0
 * @description: TODO
 * @createTime: 2019/07/12/16:27
 */

public class JdbcTest {
    public static void main(String[] args) {
        //數據庫鏈接
        Connection connection = null;
        //預編譯的Statement,使用預編譯的Statement提升數據庫性能
        PreparedStatement preparedStatement = null;
        //結果集
        ResultSet resultSet = null;
        try {
            String url = "jdbc:mysql://192.168.214.128:3306/mybatis?characterEncoding=utf-8";
            //1. 經過驅動管理類獲取數據庫連接
            connection =  DriverManager.getConnection(url, "root", "ben123");
            //2. 定義sql語句 ?表示佔位符
            String sql = "select * from user where username = ?";
            //3. 獲取預處理statement(prepareStatement)
            preparedStatement = connection.prepareStatement(sql);
            //4. 設置參數,第一個參數爲sql語句中參數的序號(從1開始),第二個參數爲設置的參數值
            preparedStatement.setString(1, "王五");
            //5. 向數據庫發出sql執行查詢,查詢出結果集
            resultSet =  preparedStatement.executeQuery();
            //6. 執行結果(遍歷查詢結果集)
            while(resultSet.next()){
                System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //7. 釋放資源
            if(resultSet!=null){
                try {
                    // 先關閉resultSet
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(preparedStatement!=null){
                try {
                    //再關閉preparedStatement
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    // 最後關閉connection
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

結果以下:mybatis

1 王五 26 王五ide

問題總結

  1. 數據庫鏈接建立、釋放頻繁形成系統資源浪費,從而影響系統性能。若是使用數據庫鏈接池可解決此問題。
  2. Sql語句在代碼中硬編碼,形成代碼不易維護,實際應用中sql變化的可能較大,sql變更須要改變java代碼。
  3. 使用preparedStatement向佔有位符號傳參數存在硬編碼,由於sql語句的where條件不必定,可能多也可能少,修改sql還要修改代碼,系統不易維護。
  4. 對結果集解析存在硬編碼(查詢列名),sql變化致使解析代碼變化,系統不易維護,若是能將數據庫記錄封裝成pojo對象解析比較方便。
相關文章
相關標籤/搜索