1.介绍
JDBC是Java DataBase Connectivity的缩写,中文意思是Java数据库连接,是Java中用来规范客户端程序如何来访问数据库的应用程序接口。
本文使用mysql数据库,所以需要下载mysql驱动,本文用的是mysql-connector-java-5.1.48.jar
2.JDBC常用的接口
1.Driver接口,用来驱动不同的数据库,连接数据库前必须先装载驱动,方法如下:
Class.forName("com.mysql.jdbc.Driver"); //装载MySQL驱动
Class.forName("oracle.jdbc.driver.OracleDriver"); //装载Oracle驱动
2.Connection接口,表示与特定数据库的连接会话
Connection conn = DriverManager.getConnection("jdbc:mysql://host:port:/database","user","password"); //连接MySQL数据库
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password"); //连接Oracle数据库
它有如下方法:
- Statement createStatement() 创建向数据库发送sql的statement对象
- PreparedStatement prepareStatement(String sql) 创建向数据库发送sql预编译的 statement对象
- setAutoCommit(boolean autoCommit) 设置实务是否自动提交
- commit() 在此连接上提交实务
- rollback() 在此连接上回滚实务
3.Statement接口,用于执行sql语句并返回结果集
- Statement 用于执行简单sql
- PreparedStatement 用于执行sql预处理,语句中的?号将被setString(int index,String value)
替换为值,可以有效的防止sql注入,建议使用,它继承自Statement接口
它有如下方法:
- boolean execute(String sql) 执行sql,返回是否有结果集
- ResultSet executeQuery(String sql) 执行select语句,返回ResultSet结果集对象
- int executeUpdate(String sql) 执行insert/delete/update 语句,返回更新的行数
- addBatch(String sql) 把多条sql语句放到一个批处理中
- executeBatch() 批量执行sql
4.ResultSet接口,它是执行sql查询语句的结果集对象,它有如下方法
检索不同字段:
- getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
- getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
- getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
- getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
- getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
结果集滚动:
- next()移动指针到下一行,注意默认的指针没有指向数据,next第一次调用指向第一行
- previous() 移动指针到上一行
- absolute(int row) 移动到指定行
- beforeFirst() 移动到最前面
- afterLast() 移动到最后面
3.编写JDBC
根据使用编辑器的不同,首先需要导入数据库驱动jar包,以MySQL数据库和IDEA编辑器为例:
导包步骤: 点击IDEA当前项目左上角File—>Project Structur—>Modules—>点击右边+号—>Jars Or directories
1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch(ClassNotFoundException e) {
e.printStackTrace();
}
2.创建数据库连接
Connection conn = null;
try {
conn = Driver.getConnection("jdbc:mysql://localhost:3306/mydb?charaterEncoding=UTF-8","root","root");
} catch(SQLException e) {
e.printStackTrace();
}
3.创建Statement对象并发起查询
Statement st = null;
try {
st = conn.createStatement();
String sql = "select * from user_profile where id = 1";
ResultSet rs = st.executeQuery(sql);
}catch(SQLException e) {
e.printStackTrance();
}
直接使用Statement对象执行sql会有注入的风险,建议PreperedStatement
PreparedStatement ps = null;
try {
String sql = "select * from user_profile where id = ?"; //注意?号会被替换
ps = conn.preparedStatement(sql);
ps.setString(1,1); //注意setString(int index,String value) index下标是从1开始
ResultSet rs = ps.executeQuery();
} catch(SQLException e) {
e.printStackTrance();
}
4.处理ResultSet对象结果集
while(rs.next()) {
int id = rs.getInt(1);//使用索引
String username = rs.getString("name"); //使用字段名
String age = rs.getString("age");
System.out.println("user name is:" + username + "age is " + age);
}
5.关闭连接
finlay {
if (conn != null) {
try {
conn.close();
}catch(SQLException e) {
e.printStackTrance();
}
}
if(ps !=null) {
try {
ps.close();
} catch(SQLException e) {
e.printStackTrance();
}
}
if(rs !=null) {
try {
rs.close();
} catch(SQLException e) {
e.printStackTrance();
}
}
}
完整例子
package com.mike.jdbc.eg;
import java.mysql.Connection;
import java.mysql.PerparedStatement;
import java.mysql.ResultSet;
@author mike
@date 2020-12-05
@desc jdbc操作数据库
public class JdbcDemo {
public static void mian(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//导入数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
conn = DriverManager(
"jdbc:mysql://localhost:3306/mydb?character=UTF-8", //数据库DSN
"root", //用户名
"root"//密码
);
//查询
String sql = "select * from user_profile where id = ?";
ps = conn.perparedStatement(sql);
ps.setString(1,"1");//id替换为1
rs = ps.executeQuery();
// insert查询,update更新,delete删除 使用ps.executeUpdate()方法即可
//处理结果集
while(rs.next()) {
int id = rs.getInt(1);//获取数据为整形结果
String username = rs.getString("name");
String age = rs.getString("age");
System.out.println("username is: " + username + "age is:" + age);
}
} catch(ClassNotFoundException e) {
e.printStackTrance();
} catch(SQLException e) {
e.printStackTrance();
} finally { //关闭连接
if (conn != null) {
try {
conn.close();
} catch(SQLException e) {
e.printStackTrance();
}
}
if (ps != null) {
try {
ps.close();
} catch(SQLException e) {
e.printStackTrance();
}
}
if (rs != null) {
try {
rs.close();
} catch(SQLException e) {
e.printStackTrance();
}
}
}
}
}