常用
一、Connection:Connection是一个接口类,其功能是与数据库进行连接。绑定数据库url,用户名,密码;
Connection connection = DriverManager.getConnection(url, userName, password);
二、Statement:Statement
接口是JDBC中的一个重要接口,它用于执行SQL语句并与数据库进行交互
Statement statement = connection.createStatement();
三、ResultSet:ResultSet
是Java JDBC中的一个接口,用于表示查询数据库的结果集。它是一个数据表,包含了满足SQL查询条件的数据行,
ResultSet resultset = statement.executeQuery(sql);
注:游标初始位置在第一行之前,索引值为-1,没调用一次next方法则判断一次是否有下一行数据,如果有则返回true,且游标下移一行,否则返回faluse; 列的索引值从1开始。resultset.next():下移游标,之后才能查询到数据
四、DriverManager:注册驱动,获取数据库连接
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, userName, password);
五、ResultSetMetaData它提供了关于结果集的元数据信息,例如列数、列名、列类型等,有结果集调用,输出数据库内信息
ResultSet resultset = statement.executeQuery(sql);
ResultSetMetaData metaData = resultset.getMetaData();
int columnCount = metaData.getColumnCount();
上文为输出要查询的列数,有那几列
六、连接池:本质属于创建一个集合,存放多个链接
LinkedList<Connection> coonPool = new LinkedList<>();
可将连接池封住出去,也就是链接池工具的思路
七、Properties:该类主要用于读取Java的配置文件,JDBC中多用于读取常用数据,例如用户名,密码等。
Properties properties = new Properties();
// properties.load(new FileInputStream("E:\\workspace\\05_javaSE_JDBC_01\\config\\jdbcConfig.properties"));
properties.load(TestJDBCConfig.class.getClassLoader().getResourceAsStream("jdbcConfig.properties"));
其配置文件常为.properties文件
八、JDBC事务:当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务**回滚(rollback)**到最初状态。
String sql = "update hero set h_name='女警'where h_id=7";
String sql2 = "update hero set h_name='妖姬'where h_id=8";
int num = statement.executeUpdate(sql);
int num2 = statement.executeUpdate(sql2);
if (num==1 && num2 == 1) {
connection.commit();
}else {
throw new Exception("执行异常,不能执行");
}
以上例子为同时修改两行数据库内容,要么同时成功,要么无法执行
九、事务的ACID属性:
原子性,一致性,隔离性,持久性
connection.setAutoCommit(true);
负责管理操作的自动提交
十、预处理对象:
PreparedStatement:因为有预先编译的功能,提高 SQL 的执行效率。 可以有效的防止 SQL 注入的问题,安全性更高
例如在sql语句中加入sql语句,使数据库崩溃,数据丢失:
String h_name = "abc ";
String h_id = "' or '1=1";
String sql = "select * from hero where h_name=?and h_id=?" ;
ResultSet resultSet = statement.executeQuery(sql);
引入后:
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, h_name);
ps.setObject(2, h_id);
ResultSet resultSet = ps.executeQuery();
对应位置替换数据由PreparedStatement交换,判断,也可封装方法,为后面常用工具的思路
十一、C3P0:C3P0 是一个开源的 JDBC 数据库连接池库
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--使用默认的配置读取数据库连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/ji?useSSL=false&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">10</property>
<!--最大的连接数量-->
<property name="maxPoolSize">15</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
</c3p0-config>
搭建环境:
machange-commons-java包中有c3p0所需方法,高版本多用两个;
创建方法:
DataSource dataSource = new ComboPooledDataSource(true);
括号中true或false为是否自动提交及connection.setAutoCommit(true)
十二、DbUtils
搭建环境:外部jar包,需要导入
常用方法:
public static void main(String[] args) throws Exception {
QueryRunner queryrunner = new QueryRunner();
Class.forName("com.mysql.cj.jdbc.Driver");
/*/用元的第二步
* 创建链接对象
* //&useUnicode=true&charac//
*/
String url = "jdbc:mysql://localhost:3306/ji?useSSL=false";
String userName = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, userName, password);
String sql = "select * from hero where h_hp > ?";
double h_hp = 300;
List<HeroMode1> heroMode1s = queryrunner.query(connection,sql, new BeanListHandler<HeroMode1>(HeroMode1.class),h_hp);
System.out.println(heroMode1s);
}
QueryRunner :它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少
注意:QueryRunner(true)中true不为能否自动提交,从源码中我们可知,true为是否获取sql语句置换的信息,若想使用手动提交
connection.setAutoCommit(true);
手动传入Connection对象,使用以上语句。
ResultSetHandler:执行处理一个结果集对象,将数据转变并处理为任何一种形式
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里,可使用自己实例。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。