JDBC

 

1. 下载依赖文件 mysql-connector-java-version.jar,添加到项目

 

2. JDBC连接数据库的过程

(1)注册数据库驱动

  即加载数据库驱动相关的类到JVM

 

(2)构建数据库连接的URL

 

(3)获取数据库连接对象Connection

 

(4)SQL操作

 

3. 相关的接口和类

  3.1 DriverManager类

  管理驱动程序,建立应用和数据库之间的连接

(1)注册驱动

static void deregisterDriver(Driver driver) 从DriverManager管理列表中删除一个驱动
static void registerDriver(Driver driver) 向DriverManager注册一个驱动对象
static Enumeration<Driver> getDrivers() 获取当前DriverManager中已加载的全部驱动

(2)建立数据库连接

static Connection getConnection(String url)
static Connection getConnection(String url,Properties info)
static Connection getConnection(String url,String user,String password)

  url:"jdbc:mysql://ip:port/数据库名"

 

  3.2 Connection接口

  数据库连接

Statement createStatement()  执行SQL的对象
PreparedStatement prepareStatement(String sql) 将参数化的SQL语句预编译存储在PreparedStatement对象中

void close() 释放Connection对象的数据库连接占用的JDBC资源
boolean isClosed()  是否与数据库断开连接

boolean isReadOnly() Connection对象是否只读
void setReadOnly(boolean readOnly)  将Connection对象的连接模式设置只读
//事务
//开启事务
void setAutoCommit(boolean autoCommit) true,自动提交   false,手动提交(开启事务)
boolean getAutoCommit()  判断是自动提交还是手动提交
//保存点
Savepoint setSavepoint()   在当前事务中创建一个未命名的保存点
Savepoint setSavepoint(String name) 在当前事务中创建一个命名的保存点
void releaseSavepoint(Savepoint savepoint)  在当前事务中移除指定的保存点和后续保存点
//回滚事务
void rollback()  (手动提交模式下),回滚事务,释放Connection持有的数据库锁
void rollBakc(Savepoint savepoint) 回滚事务到该保存点

//提交事务
void commit()  (手动提交模式时)提交事务,释放Connection对象当前持有的所有数据库锁

//
void setTransactionIsolation(int level) 设置Connection对象的事物隔离级别
int getTransactionIsolation()  获取

 

  3.3 Statement

  执行SQL语句

void addBatch(String sql)  添加sql语句到Statement的当前命令列表中
void cleatBatch()    清空命令列表
int[] executeBatch()  将一批命令提交给数据库执行,返回更行计数数组

boolean execute(String sql)  
ResultSet executeQuery(String sql)    执行DQL(select)语句
int executeUpdate(String sql)  执行DML(insert、update、delete)、DDL(create、alter、drop)语句

void close()
boolean isClosed() 

Connection getConnection()

 

  3.4 ResultSet

  结果集

//
boolean next()  游标向下移动一行
boolean previous() 游标向上移动一行
boolean last()  游标移动到最后一行
boolean first() 游标移动到第一行
boolean absolute(int row) 游标移动到给定行
void beforeFirst()  移动游标到第一行之前
void afterLast() 移动游标到最后一行之后

//
InputStream getBinaryStream(String col) 以字节流方式获取当前行的指定列的值
Xx getXx(int colIndex) 以Xx方式获取当前行指定列的值(idnex从1开始) 
Xx getXx(String colLabel) 以Xx方式获取当前行指定列的值(参数为列名称)

//
ResultSetMetaData getMetaData()

  3.5  ResultSetMetaData

int getColumnCount() 列数
String getColumnName(int column)  获取列的字段原名
String getColumnLabel(int column) 获取用来展示的名字(SELECT name1 as label1,name2 as label2 FROM xx)

 

 

  3.6 PreparedStatement

  继承自Statement

 

void setBianryStream(int paramIndex,InputStream x)  输入流x作为第paramIndex个参数
void setXx(int paramIndex,Xx x)  x作为第paramIndex个参数

 

  例子:

Connection conn = DriverManager.getConnection(url,userName,password);
String sql = "insert into table1(name,price,bookCount,author) values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,"name1");
ps.setDouble(2,3.14);
ps.setInt(3,2);
ps.setString(4,"author1");
int row = ps.executeUpdate();

 

 

 

 

 

 

 

 

4. 例子

   jdbc.properties

url=jdbc:mysql://localhost:3306/testx
user=root
password=xxx
driver=com.mysql.jdbc.Driver

  JDBC工具类:

package utils.jdbcUtils;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    static {
        try {
            Properties pro = new Properties();

            //
            ClassLoader classLoader = JdbcUtils.class.getClassLoader();
            URL proUrl = classLoader.getResource("jdbc.properties");
            String proPath = proUrl.getPath();


            pro.load(new FileReader(proPath));
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
        }catch(FileNotFoundException e) {
            e.printStackTrace();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

    /*
    * 获取连接
    */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /*
    * 断开连接,释放资源
    */
    public static void close(Connection conn,Statement stmt,PreparedStatement pst,ResultSet res) {
        if(res != null) {
            try {
                res.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            res = null;
        }

        if(pst != null) {
            try {
                pst.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            pst = null;
        }

        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            stmt = null;
        }

        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            conn = null;
        }
    }
}

 

  调用:

package com.jdbc;

import utils.jdbcUtils.JdbcUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class TestJBDC2 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet result = null;
        try {
            conn = JdbcUtils.getConnection();
            stmt = conn.createStatement();
            String sql = "select * from person";
            result = stmt.executeQuery(sql);
            //获取结果集中数据
            ArrayList<Map<String,String>> res = new ArrayList<Map<String,String>>();
            ArrayList<String> colNames = new ArrayList<String>();
            ResultSetMetaData rsmd = result.getMetaData();
            //保存列名
            for(int i=1;i<=rsmd.getColumnCount();i++) {
                String name = rsmd.getColumnName(i);
                colNames.add(name);
            }
            //每行数据保存到Map,所有行数据保存到List
            while(result.next()) {
                Map<String,String> row = new HashMap<String,String>();
                for(int i=0;i<colNames.size();i++) {
                    String value = result.getString(colNames.get(i));
                    row.put(colNames.get(i),value);
                }
                res.add(row);
            }
            //打印数据
            for(int i=0;i<colNames.size();i++) {
                System.out.print(colNames.get(i)+"  ");
            }
            System.out.println();
            for(int i=0;i<res.size();i++) {
                Map<String,String> map = res.get(i);
                for(String key:map.keySet()) {
                    System.out.print(map.get(key)+"  ");
                }
                System.out.println();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

 

 

5. 问题

(1)较新的mysql驱动包为

com.mysql.cj.jdbc.Driver

 

(2)时区报错

  在URL后加

jdbc:mysql://localhost:3306/stus?serverTimezone=UTC

 

JDBC

上一篇:MySQL视图(3)


下一篇:SQL Server 基础知识回顾