Skip to content

JDBC

1294字约4分钟

javajdbc

2024-10-24

1.JDBC的历史

ODBC:OpenDataBaseConnection

JDBC:JavaDataBaseConnection

1.1API连接

1.2JDBC-->ODBC-->DataBase

1.3纯Java实现的JDBC

JDBC:就是java发布的操作数据库的技术

Java发布接口,数据库厂家提供实现

数据库厂家提供的Java类,基本以jar包的形式提供(字节码文件)称为数据库驱动

2.JDBC操作过程

2.1引入驱动jar包(数据库驱动)

Oracle安装路径下

image-20211021195200806

2.2加载数据库驱动

String driverClassName = "oracle.jdbc.driver.OracleDriver";
// 显式加载
Class.forName(driverClassName);

2.3获取连接对象

url:jdbc:数据库类型(主协议名):次协议名:@数据库服务器地址:端口号:数据库系统标识符

String url = "jdbc:oracle:thin@localhost:1521:xe";
String user = "";
String password = "";
Connection connection = DriverManager.getConnection(url,user,password);

2.4获取Statement对象(语句/陈述)

Statement statement = connection.getStatement();

2.5执行statement对象

String sql = "";
statement.execute(sql);

2.6处理结果

ResultSet rs = statement.execute(sql);
rs.getXXX("字段名");// 获取对应字段的结果

2.7关闭资源

rs.close();
statement.close();
connection.close();

2.8举例

	String driverClassName = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@localhost:1521:xe";
	String user = "scott";
	String password = "tiger";
	Connection connection;
	PreparedStatement statement;
	ResultSet rs;
	public ResultSet executeQuery(String sql,Object...objects) {
		try {
            // 获取连接对象
			connection = DriverManager.getConnection(url,user,password);
            // 获取语句对象
			statement = connection.prepareStatement(sql);
			for (int i = 1; i <= objects.length; i++) {
				statement.setObject(i, objects[i-1]);
			}
            // 获取结果集,执行语句对象
			rs = statement.executeQuery();
			RowSetFactory factory = RowSetProvider.newFactory();
			CachedRowSet rowSet = factory.createCachedRowSet();
			rowSet.populate(rs);
            // 关闭连接
			rs.close();
			statement.close();
			connection.close();
			return rowSet;
//			return rs;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

3.JDBC常用类和接口

3.1DriverManager类

驱动管理类

setLoginTimeout(int second);// 设置连接超时时间
getConnection(String url,String user,String password);// 获得连接对象

3.2Connection接口

3.2.1获取语句对象

CallableStatement---->PreparedStatement---->Statement

继承关系

PreparedStatement预编译语句

CallableStatement可调用语句(调用存储过程)

3.2.2处理事务

connection.setAutoCommit(boolean autoCommit);// 设置事务是否自动提交

设置为fasle为手动提交

connection.commit();// 提交事务

connection.rollback();// 回滚事务

SavePoint savePoint = connection.setSavePoint(String name);// 设置事务保存点

connection.rollback(savePoint );// 回滚事务值指定保存点

connection.setTransactionIsoLation(int level);// 设置事务隔离级别

3.3Statement

1.类型

1.resultSetType

1.1ResultSet.TYPE_FORWARD_ONLY 前向结果集(效率最高)

1.2ResultSet.TYPE_SCROLL_INSENSITIVE 滚动不敏感

1.3ResultSet.TYPE_SCROLL_SENSITIVE 滚动敏感

2.resultSetConcurrency(并发性)

2.1ResultSet.CONCUR_READ_ONLY

2.2ResultSet.CONCUR_UPDATABLE

3.resultSetHoldability (可保存性)

3.1ResultSet.HOLD_CURSORS_OVER_COMMIT

3.2ResultSet.CLOSE_CURSORS_AT_COMMIT

2.常用操作

1.执行SQL命令

int executeUpdate(String sql) 执行增删改

(1) 对于 SQL 数据操作语言 (DML) 语句,返回行计数

(2) 对于什么都不返回的 SQL 语句,返回 0

ResultSet executeQuery(String sql) 执行select查询

boolean execute(String sql) 能做增删改,也能查询,true和false不代表成功失败

executeBatch 批量执行sql

3.绑定参数

​ SetXXX

for (int i = 1; i <= objects.length; i++) {
		statement.setObject(i, objects[i-1]);
	}
4.Statement与prepareedStatement的区别?

预编译的效率高

用'?'作为占位符代替参数可读性好

安全性高,防止SQL注入漏洞

		connection = DriverManager.getConnection(url,user,password);
			statement = connection.prepareStatement(sql);
			for (int i = 1; i <= objects.length; i++) {
				statement.setObject(i, objects[i-1]);
			}
			rs = statement.executeQuery();
5.ResultSet
1.移动

游标默认在第一行之前

rs.absolute(int row)// 将游标移动到此 ResultSet 对象的给定行编号

rs.last()// 将游标移动到最后一行

rs.previous()// 将游标移动到前一行

2.getXXX获取结果集数据

rs.getInt("id")// 获取结果集中的int值

rs.getString("name")// 获取结果集中的String值

rs.getDate("brithday")// 获取结果集中的Date值

3.getMetaData() 得到元数据

ResultSetMetaData data = rs.getMetaData() ;

date.getColumnCount()// 获取元数据数据列数

getColumnName()// 获取元数据列名

getColumnLabel()// 获取元数据列的别名

getColumnTypeName()// 获取元数据列的数据类型

4.JDBC开发规范

1.SQL语句必须在pld工具或其他工具中写好,测试完毕,再复制到Java代码中

2.不允许在pld工具中对数据进行增删改操作,如若进行修改,注意事务的提交

3.SQL语句要折行,折行后需强制在每行的开头添加空格

4.复制SQL语句时,注意不要复制';'

5.SQl应先定义一个String对象保存,在使用String对象执行

6.不允许select *

7.若预期结果集超过2行,必须显式排序(针对小数据量,10万条以下)

8.rs.getXXX()使用字段名进行数据获取,不要使用下标索引

9.使用PreparedStatement代替Statement(避免漏洞,灵活,安全)

5.Java常用连接池(数据源)

1.定义:连接池是创建和管理一个数据库连接的缓冲池技术,这些连接准备好被任何需要他们的线程(进程)使用

2.常用连接池

2.1.druid(阿里)

2.2.DBCP

2.3.C3P0

3.连接池的常用操作

1.加载配置文件

Properties properties = new Properties();
properties.load(new FileInputStream("配置文件路径"));

配置文件

driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=scott
password=tiger
initialSize=5
maxActive=10
maxWait=3000

2.建立数据库连接池对象

DruidDataSource dataSource = 
					(DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
QueryRunner queryRunner = new QueryRunner(dataSource);

3.获取结果集

	String sql = "insert into Students (id,name,brithday)"
				+ " values "
				+ "(?,?,?)";
		try {
            // eccute()执行SQL语句
			return queryRunner.execute(
					sql, student.getId(),
					student.getName(),
					student.getBrithday()) == 1;
		} catch (SQLException e) {
			e.printStackTrace();
		}
// 通过结果集创建对应的对象
queryRunner.query(sql,new BeanHandler<>(Student.class),index);
// 通过结果集创建对应对象的list集合
queryRunner.query(sql,new BeanListHandler<>(Student.class));