一、JDBC简介
JDBC是连接数据库和Java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作。
JDBC制定了统一访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。
JDBC规范将驱动程序归结为以下几类(选自Core Java Volume Ⅱ——Advanced Features):
第一类驱动程序将JDBC翻译成ODBC,然后使用一个ODBC驱动程序与数据库进行通信。
第二类驱动程序是由部分Java程序和部分本地代码组成的,用于与数据库的客户端API进行通信。
第三类驱动程序是纯Java客户端类库,它使用一种与具体数据库无关的协议将数据库请求发送给服务器构件,然后该构件再将数据库请求翻译成数据库相关的协议。
第四类驱动程序是纯Java类库,它将JDBC请求直接翻译成数据库相关的协议。
二、通过JDBC操作数据库
我们需要访问数据库时,首先要加载数据库驱动,只需加载一次,然后在每次访问数据库时创建一个Connection实例,获取数据库连接,获取连接后,执行需要的SQL语句,最后完成数据库操作时释放与数据库间的连接。
1. 加载数据库驱动
Java加载数据库驱动的方法是调用Class类的静态方法forName(),语法格式如下:
Class.forName(String driverManager)
例如加载MySQL数据库驱动如下:
try {
Class.forName("com.mysql.jdbc.Driver");
} catch(ClassNotFoundException e) {
e.printStackTrace();
}
如果加载成功,会将加载的驱动类注册给DriverManager;如果加载失败,会抛出ClassNotFoundException异常。
需要注意的是,要在项目中导入mysq-connection-java的jar包,方法是在项目中建立lib目录,在其下放入jar包。
连接字符串:
5.1:
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-connect-drivermanager.html
6.0
com.mysql.cj.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/totoro-mall?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2b8
8.0
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-connect-drivermanager.html#connector-j-examples-connection-drivermanager
2. 建立连接
加载完数据库驱动后,就可以建立数据库的连接了,需要使用DriverManager类的静态方法getConnection()方法来实现。如下:
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/database_name";
String user = "root";
Strign password = "root"
//建立连接
Connection conn = DriverManager.getConnection(url, user, password);
url是数据库的url,其中mysql指定数据库为mysql数据库,localhost是本地计算机,可以换成IP地址127.0.0.1,3306为MySQL数据库的默认端口号,database_name是所要连接的数据库名;user和password对应数据库的用户名和密码;最后再通过getConnection建立连接。
3. 对数据库表中数据进行增删改查
建立了连接之后,就可以使用Connection接口的createStatement()方法来获取Statement对象,也可以调用prepareStatement()方法获得PrepareStatement对象,通过executeUpdate()方法来执行SQL语句。
三、jdbc.properties配置文件
driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
url = jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TTMS
username = root
password = root
四、DBUtils.java
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBUtil {
private final String dbConnFile = "resource/database/jdbc.properties";
private Connection conn=null;
private String dbDriver; //定义驱动
private String dbURL; //定义URL
private String userName; //定义用户名
private String password; //定义密码
//从配置文件取数据库链接参数
private void loadConnProperties(){
Properties props = new Properties();
try {
props.load(new FileInputStream(dbConnFile));//根据配置文件路径Conf加载配置文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
this.dbDriver = props.getProperty("driver");//从配置文件中取得相应的参数并设置类变量
this.dbURL = props.getProperty("url");
this.userName = props.getProperty("username");
this.password = props.getProperty("password");
}
public boolean openConnection(){
try {
loadConnProperties();
Class.forName(dbDriver);
this.conn = DriverManager.getConnection(dbURL,userName,password);
return true;
} catch(ClassNotFoundException classnotfoundexception) {
classnotfoundexception.printStackTrace();
System.err.println("db: " + classnotfoundexception.getMessage());
} catch(SQLException sqlexception) {
System.err.println("db.getconn(): " + sqlexception.getMessage());
}
return false;
}
protected void finalize() throws Exception{
try {
if(null!=conn)
conn.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
// 查询并得到结果集
public ResultSet execQuery(String sql) throws Exception {
ResultSet rstSet = null;
try {
if (null == conn)
throw new Exception("Database not connected!");
Statement stmt = conn.createStatement();
rstSet = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rstSet;
}
// 插入一条新纪录,并获取标识列的值
public ResultSet getInsertObjectIDs(String insertSql) throws Exception{
ResultSet rst = null;
try {
if(null==conn)
throw new Exception("Database not connected!");
Statement stmt = conn.createStatement();
stmt.executeUpdate(insertSql, Statement.RETURN_GENERATED_KEYS);
rst = stmt.getGeneratedKeys();
} catch (SQLException e) {
e.printStackTrace();
}
return rst;
}
//以参数SQL模式插入新纪录,并获取标识列的值
public ResultSet getInsertObjectIDs(String insertSql, Object[] params) throws Exception {
ResultSet rst = null;
PreparedStatement pstmt = null ;
try {
if (null == conn)
throw new Exception("Database not connected!");
pstmt = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
if(null != params){
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
pstmt.executeUpdate();
rst = pstmt.getGeneratedKeys();
} catch (SQLException e) {
e.printStackTrace();
}
return rst;
}
// 插入、更新、删除
public int execCommand(String sql) throws Exception{
int flag = 0;
try {
if(null==conn)
throw new Exception("Database not connected!");
Statement stmt = conn.createStatement();
flag = stmt.executeUpdate(sql);
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
// 存储过程调用
public void callStordProc(String sql, Object[] inParams, SqlParameter[] outParams) throws Exception {
CallableStatement cst = null ;
try {
if (null == conn)
throw new Exception("Database not connected!");
cst = conn.prepareCall(sql);
if(null != inParams){
for (int i = 0; i < inParams.length; i++) {
cst.setObject(i + 1, inParams[i]);
}
}
if (null!=outParams){
for (int i = 0; i < inParams.length; i++) {
cst.registerOutParameter(outParams[i].getName(), outParams[i].getType());
}
}
cst.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 释放资源
public void close(ResultSet rst) throws Exception {
try {
Statement stmt = rst.getStatement();
rst.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public PreparedStatement execPrepared(String psql) throws Exception {
PreparedStatement pstmt = null ;
try {
if (null == conn)
throw new Exception("Database not connected!");
pstmt = conn.prepareStatement(psql);
} catch (SQLException e) {
e.printStackTrace();
}
return pstmt;
}
// 释放资源
public void close(Statement stmt) throws Exception {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 释放资源
public void close() throws SQLException, Exception{
if(null!=conn){
conn.close();
conn=null;
}
}
public Connection getConn() {
return conn;
}
public static void main(String[] args) {
}
}
五、MySQL和Java数据类型对应
类型名称 | 显示长度 | 数据库类型 | JAVA类型 | JDBC类型索引(int) | 描述 |
---|---|---|---|---|---|
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 | |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 | |
DATE | 10 | DATE | java.sql.Date | 91 | |
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |