什么是JDBC?
概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库。
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
JDBC快速入门:
* 步骤:
1. 注册驱动
2. 获取数据库连接对象 Connection
3. 定义sql
4. 获取执行sql语句的对象 Statement
5. 执行sql,接受返回结果
6. 处理结果
7. 释放资源
JDBC中需要用到的对象
1.DriverManager:驱动管理对象
注册驱动:告诉程序该使用哪一个数据库驱动jar
2. Connection:数据库连接对象
(1).获取执行sql 的对象
(2).管理事务:
开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
3.Statement:执行sql的对象
(1). boolean execute(String sql) :可以执行任意的sql 了解
(2). int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
(3). 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
4.ResultSet:结果集对象,封装查询结果
5.PreparedStatement:执行sql的对象(是Statement的子类,使用该对象可避免SQL注入问题)
1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
使用代码将数据库与java连接
//向数据库中创建的表中插入内容
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class MyJdbc02 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=UTF8&serverTimezone=UTC";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);
// Statement stmt = connection.createStatement();
String sql = "insert into student (name,sex,age) values ('张三','男',22)";
Statement statement = connection.createStatement();
int res = statement.executeUpdate(sql);
System.out.println(res);
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
//将数据库中的字段封装成一个对象
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MyJdbc07 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc?user=root&password=123456&characterEncoding=UTF8&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
String sql = "select * from student";
ResultSet res = stmt.executeQuery(sql);
ResultSetMetaData metaData = res.getMetaData();
int colCount = metaData.getColumnCount();
int count = metaData.getColumnCount();
List<HashMap<String, Object>> list = new ArrayList<>();
while(res.next()) {
HashMap<String, Object> map = new HashMap<>();
//获取该调记录中每一列的值
for(int i = 1;i<=count;i++) {
String key = metaData.getColumnLabel(i);
Object value = res.getObject(i);
map.put(key, value);
}
list.add(map);
}
System.out.println(list);
if(res!=null&&!res.isClosed()) {
res.close();
res = null;
}
if (stmt != null&&!stmt.isClosed()) {
stmt.close();
stmt = null;
}
if (conn != null&&!conn.isClosed()) {
conn.close();
conn = null;
}
}
}
//使用PreparedStatement对象,可以有效避免SQL注入问题
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class MyJdbc09 {
public static void main(String[] args)throws Exception {
/*
* sql注入:通过向sql语句传递参数时,通过参数改变原有的sql语句结构
* 防止SQL注入:外部传递进来的所有类容,都看作是值,而不是SQL语句的部分
*/
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc?user=root&password=123456&characterEncoding=UTF8&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url);
//?部分不管将来是什么内容,不会更改现有的SQL结构
String sql = "select * from student where id = ?";
//SQL语句的执行,检查SQL语法
PreparedStatement prep = conn.prepareStatement(sql);
//为问好部分赋值
prep.setInt(1, 1);
ResultSet res = prep.executeQuery();
/*第一个参数代表?的位置
* 第二个参数代表给?赋值
*
*/
// int count = prep.executeUpdate();
// System.out.println(count);
System.out.println(prep);
if (res != null && !res.isClosed()) {
res.close();
res = null;
}
if (prep != null && !prep.isClosed()) {
prep.close();
prep = null;
}
if (conn != null && !conn.isClosed()) {
conn.close();
conn = null;
}
}
}
//前面的代码每次都只能执行一条语句,因此降低了效率,使用数组将所要执行的SQL语句保存下来,然后调用addBatch(方法),添加所有需要执行的SQL语句
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Arrays;
//sql语句的批量执行,只能批量执行DML,只能通过Statement执行
public class MyJdbc10 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc?user=root&password=123456&characterEncoding=UTF8&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url);
String sql1 = "insert into student (name,sex,age) values('lisi','男',23)";
String sql2 = "insert into student (name,sex,age) values('瓜娃','男',27)";
String sql3 = "insert into student (name,sex,age) values('张武器','男',26)";
String sql4 = "insert into student (name,sex,age) values('李华','男',29)";
String sql5 = "delete from student where id = 1";
String[] sql = { sql1, sql2, sql3, sql4, sql5 };
Statement stmt = conn.createStatement();
for (String s : sql) {
// 将需要执行的所有SQL语句添加
stmt.addBatch(s);
}
// 执行SQL语句
int[] rowCounts = stmt.executeBatch();
System.out.println(Arrays.toString(rowCounts));
if (stmt != null && !stmt.isClosed()) {
stmt.close();
stmt = null;
}
if (conn != null && !conn.isClosed()) {
conn.close();
conn = null;
}
}
}
//事物的回滚,默认是自动提交事物的,因此需要将其关闭setAutoCommit(false);
Oracle默认则是关闭的
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Savepoint;
import java.sql.Statement;
public class MyJdbc11 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc?user=root&password=123456&characterEncoding=UTF8&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url);
conn.setAutoCommit(false);//关闭自动提交
//自动提交不关闭不能使用comment和rollback方法
String sql = "insert into student (name) values ('cc')";
Statement stmt = conn.createStatement();
int count =stmt.executeUpdate(sql);
System.out.println(count);
//添加存档点
Savepoint sp = conn.setSavepoint();
String sql1 = "insert into student (name) values ('bb')";
Statement stmt1 = conn.createStatement();
int count1 =stmt1.executeUpdate(sql);
System.out.println(count1);
//回滚事务
//conn.rollback();
//回滚到指定的存档点
conn.rollback(sp);
//提交事务
conn.commit();
if (stmt != null && !stmt.isClosed()) {
stmt.close();
stmt = null;
}
if (conn != null && !conn.isClosed()) {
conn.close();
conn = null;
}
}
}