JDBC

什么是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;
		}
		
	}
}
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值