JAVA笔记之JDBC
1.JDBC简介
JDBC是Java语言中用于规范与数据库连接操作的一组接口,它的全称是(Java Database Connectivity)通过这套规范,我们可以在Java中对不同数据库厂商的数据库进行访问与操作。
2.JDBC使用
1.加载驱动获取数据库连接对象
要使用jdbc,要先导入驱动,即数据库厂商实现的jar包,以mysql为例,将其jar包导入到项目中,就可以正常使用JDBC进行对数据库的操作了;
导入jar包后,我们要获取数据库连接对象,也就是Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,创建方法为:
//1.加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//2.标识url,用于告诉连接数据库的地址
String url = "jdbc:mysql://localhost:3306/";
//3.数据库用户名
String user = "root";
//4.密码
String pass = "123123";
//5.获取连接对象
Connection connection = DriverManager.getConnection(url, user, pass);
获取到数据库连接对象后,我们就可以进行一系列对数据库的增删查改操作了,上面的代码还可以进行优化,例如使用读取配置文件的方式来读取数据库的四大参数,方便得到不同数据库的连接对象时的配置操作;
示例:
public static Connection getConnection() {
//得到配置文件的输入流,这里的获取输入流方式随着你的文件位置和项目类型进行改变
InputStream iStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//获取Properties对象,该对象可以方便的对键值对形式的文件进行读取封装
Properties prop = new Properties();
try {
//加载配置文件
prop.load(iStream);
} catch (IOException e) {
e.printStackTrace();
}
//得到数据库四大参数
String user = prop.getProperty("user");
String pass = prop.getProperty("pass");
String url = prop.getProperty("url");
String driver = prop.getProperty("driver");
try {
//加载驱动
Class.forName(driver);
//获取连接对象
Connection connection = DriverManager.getConnection(url, user, pass);
return connection;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
2.执行SQL语句之Statement
JDBC程序中的Statement对象用于向数据库发送SQL语句,创建方法为:
//获取SQL语句发送器对象,con是Connection连接对象
Statement stm = con.createStatement();
Statement对象常用方法:
方法 | 含义 |
---|---|
executeQuery(String sql) | 用于向数据库发送查询语句,返回一个结果集对象 |
executeUpdate(String sql) | 用于向数据库发送insert、update或delete语句 |
execute(String sql) | 用于向数据库发送任意sql语句 |
addBatch(String sql) | 把多条sql语句放到一个批处理中 |
executeBatch() | 向数据库发送一批sql语句执行 |
Statement stm = null;
//获取用于向数据库发送sql语句的statement
stm = conn.createStatement();
//向数据库发sql
String sql = "select id,name,password,email,birthday from users";
//得到一个结果集对象,后面可以通过结果集对象的方法来获取查询到的信息
stm.executeQuery(sql);
3.执行SQL语句之PreperedStatement
PreperedStatement是Statement类的子类,它的实例对象可以通过调用:
PreperedStatement stm = null;
//sql语句,其中?是占位符,表示参数
String sql = "select * from users where name=? and password=?";
//获取用于向数据库发送sql语句的Preperedstatement
stm = con.preparedStatement(sql);//在此次传入sql,进行预编译
//给第一个占位符设置值,注意索引是从1开始
stm.setString(1, username);
stm.setString(2, password);
//4.向数据库发sql
stm.executeQuery();//在这里不需要传入sql
比较:
相对于Statement对象而言,PreperedStatement可以避免SQL注入的问题。Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。
并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。
此外,如果需要批量处理大量sql语句或者操作大数据类型(Blob)时,建议使用PreparedStatement,此外,在对很多条sql语句处理时,可以先关闭Connection对象的自动提交方法,等到所有sql语句都添加到批处理中(缓存)时,再手动提交可以提升效率。
例子:
Connection con = null;
PreparedStatement pstm = null;
try {
// 获取连接对象,这里使用了自己封装的JDBC工具类来获取
con = JDBCUtil.getConnection();
//设置连接不自动提交
con.setAutoCommit(false);
String sql = "insert into goods(name) values(?)";
// 获取PreparedStatement对象
pstm = con.prepareStatement(sql);
for (int i = 0; i < 1000000; i++) {
pstm.setObject(1, "name_" + i);
//添加到批处理中
pstm.addBatch();
if(i % 500 == 0) {
//如果已经添加了500条批处理语句,就执行
pstm.executeBatch();
//清空批处理空间,即清理缓存
pstm.clearBatch();
}
}
//提交事务
con.commit();
} catch (Exception e) {
e.printStackTrace();
}
4.获取结果集ResultSet
当我们使用JDBC的一些操作时,会产生一个结果集,例如在查询操作时,就会返回一个ResultSet对象,Resultset封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
1、获取行
ResultSet提供了对结果集进行滚动的方法:
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面。
2、获取值
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
获取任意类型的数据
getObject(int index)
getObject(string columnName)
获取指定类型的数据,例如: