外观
JDBC
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安装路径下
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));