JDBC简介
JDBC(Java Database Connectivity)是标准Java访问数据库API,在java.sql下。
必须把mysql-connector-java-5.1.7-bin.jar导入到tomcat的lib目录下面!
在java项目中,只需要引入mysql-connector-java-5.1.7-bin.jar就可以运行java项目。
在web项目中,当Class.forName("om.mysql.jdbc.Driver");时myeclipse是不会去查找字符串,不会去查找驱动的。所以只需要把mysql-connector-java-5.1.7-bin.jar拷贝到tomcat下lib目录就可以了。
Java使用JDBC访问数据库简单的例子
访问JDBC访问数据库一般步骤:注册驱动,获取连接,获取Statement,执行SQL返回结果集,遍历结果集,释放连接。
importjava.sql.DriverManager;
import java.sql.ResultSet;
//importjava.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
public class DUBtil {
private staticfinal String
URL =
"jdbc:mysql://localhost:3306/databaseWeb";
private static final String USER
= "root";
private static final String PASSWORD
= "0000";
public static void main(String[] args)
throws Exception {
// 1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 2.获得数据库连接
Connection conn =
DriverManager.getConnection(URL,
USER,
PASSWORD);
// 3.通过数据库连接操作数据库,增删改查
Statement stmt =conn.createStatement();
ResultSet rs =stmt.executeQuery("select
* fromtb_person");
while (rs.next()) {
System.out.println(rs.getString("id") + rs.getString("name"));
}
}
}
注册数据库驱动
三种方法:
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); new com.mysql.jdbc.Driver(); Class.forName("com.mysql.jdbc.Driver");
JDBC基本操作:CRUD
CRUD:create、read、update、delete
executeQuery(String sql)用于执行SELECT语句,返回
executeUpdate(String sql)用于执行INSERT、UPDATE、DELETE。
流程与上面的例子类似。
注意是取 request 参数而不是地址栏参数,因此用 getAttribute 方法而不是 getParameter
Statement和PreparedStatement
使用Statement是最简单的方式,使用SQL语言然后执行executeQuery或executeUpdate。
PreparedStatement接口继承Statement接口,是Statement子类。最大区别是PreparedStatement可以使用参数。
如:
Statement:
Statement stmt = new Statement();//不需要传参
String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERECOF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);
PreparedStatement:
PreparedStatement preStmt = con.prepareStatement("UPDATE COFFEES SETSALES = ? WHERE COF_NAME LIKE ? ");//需要以SQL语句为参数传入
preStmt.setInt(1, 75);// 占位符编号从1开始
preStmt.setString(2, "Colombian");
preStmt.executeUpdate();
批处理
批处理需要将connection自动提交设置为false
即:conn.setAutoCommit(false);
Statement执行批量SQL语句使用stmt.addBatch(String sql);//不同的sql语句
PreparedStatement执行批量SQL语句使用preStmt.addBatch();//同一条带参数的语句,preStmt已经set过参数。
步骤:
pstmt.addBatch()加入缓存
pstmt.executeBatch()提交
conn.commit()提交给数据库执行
preStmt.clearBatch();若存在重复提交情况可以清空缓存
批处理提交栗子:
public static void test() throws ClassNotFoundException, SQLException, IOException { // 1.加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 2.获得数据库连接 String mysql_url = "jdbc:mysql://localhost:3306/students?characterEncoding=utf-8"; Connection conn = DriverManager.getConnection(mysql_url,"root", "root"); Statement stmt =conn.createStatement(); ResultSet rs =stmt.executeQuery("select _id,sname from students"); conn.setAutoCommit(false);//设置自动提交为false int _id; int i=0,j=1; String str="some strs"; PreparedStatement preStmt = conn.prepareStatement ("UPDATE pageinfo SET copyright_code = ? WHERE _id = ? "); while (rs.next()) { _id=rs.getInt("_id"); preStmt.setString(1,str);//根据id更新该字段 preStmt.setInt(2,_id); // preStmt.executeUpdate();//一条条的提交特别慢 preStmt.addBatch(); if(((++i)%1000)==0){//每1000条提交一次,根据实际情况而定 int[] a =preStmt.executeBatch();//记录批量提交每次影响的行数,这里每次只影响一行 conn.commit();//提交给数据库处理 preStmt.clearBatch();//清空缓存 System.out.println("第"+j+"次提交"+a.length);//测试输出看看是否提交了那么多 i=0;j++; } } int[] a =preStmt.executeBatch(); conn.commit();//将最后不满足1000的尾子提交 preStmt.clearBatch(); System.out.println("第"+j+"次提交"+a.length); }
Statement和PrepareStatement区别:PrepareStatement能预处理,同时能防止SQL注入。
处理结果集
进行两次查询不必rs.close(),因为返回ResultSet时会自动关闭上一次查询的结果集。
Statement默认返回的ResultSet只可往后滚动,因此只有next()、last()方法可用,若想使用previous()、first(),需要
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
Pagination分页显示
MySQL分页是利用LIMIT实现,如:
SELECT * FROM tb_person LIMIT 21,10//只取出从第21行开始的10行记录
分页显示时需要先查询记录总数,如SELECT count(*) FROM tb_person
不同数据库采用不同的方式实现分页,语法不同。
ResultSetMetaData元数据
rs.getString(“name”)来获取name列内容。
ResultSet对象的列名可由ResultSetMetaData元数据获得
DAO模式
DAO(Database Access Object)数据库操作对象,保存数据时它将JavaBean属性拆分成正确的SQL语句保存到数据库中,读取数据时将数据库中数据通过setter方法设置到JavaBean中。
DAO的出现使数据库代码和业务代码分离,Servlet或JSP只操作JavaBean与DAO层,DAO层只操作数据库。
抛出异常自动回滚
conn.setAutoCommit(false);//将自动提交设置为False,默认true
再执行多条SQL语句执行完毕,确认没有发生错误,在执行
conn.commit()提交,如果有异常抛出或者返回值不对,执行
conn.rollback()回滚。
事务的提交必须执行conn.commit(),事务的回滚不一定要显示的执行conn.rollback(),如果程序直接抛出异常,事务也会回滚。
事务性是数据库区分与其他存储技术的重要特征之一,基本上所有的数据库编程都会涉及事务编程。
连接池
减少创建与断开Connection开销,要操作数据库,程序并不是直接创建Connection,而是向连接池申请。
。。。