全部章节 >>>>
本章目录
9.2.2 使用PreparedStatement执行insert操作
9.1 JDBC基础
9.1.1 JDBC简介
JDBC(Java Database Connectivity),即Java数据库连接。它是一种可以执行SQL语句的Java API。
- 通过JDBC API可连接到数据库,并使用结构化查询语句实现对数据库的查询、更新等操作。
- 使用JDBC开发数据库应用可以跨平台运行,并且可以跨数据库。
- 通过JDBC API,不必为访问Sybase、DB2等数据库学习新的API,从而极大的简化了开发人员使用Java语言对数据库的操作。
- 为使JDBC程序可以跨平台,需要不同的数据库厂商提供相应的驱动程序。
9.1.2 JDBC常用API简介
JDBC提供了独立于数据库的统一API,用于帮助用户建立与数据库的连接、执行SQL语句和检索结果集等。JDBC API位于java.sql包。
JDBC 常用API功能说明
类和接口 | 功能 |
java.sql.DriverManager | 管理JDBC驱动程序,使用它可以获取Connection对象 |
java.sql.Connection | 建立与特定数据库的连接(会话),建立后可以执行SQL语句 |
java.sql.Statement | 用于执行SQL语句 |
java.sql.PreparedStatement | 预编译的Statement,它是Statement的子接口 |
java.sql.CallableStatement | 用于执行存储过程的Statement,它是Statement的子接口 |
java.sql.ResultSet | 结果集对象。该对象包含访问查询结果的方法,Result可以通过索引或列名获得列数据 |
9.1.3 JDBC编程步骤
1、加载数据库驱动
将数据库驱动文件(jar文件)拷贝到classpath路径下。
加载驱动代码:Class.forName("com.mysql.jdbc.Driver");
2、获得数据库连接
Connection conn=DriverManager.getConnection(URL, USER, PASSWORD)
示例:
Connection conn = DriverManager.getConnection("jdbc:mysql:///localhost:3306/data","root", "root");
3、通过Connection实例获取Statement对象
Statement stmt = conn.createStatement();
4、使用Statement实例执行SQL语句
int executeUpdate(String sql) throws SQLException
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL语句(例如 CREATE TABLE 和 DROP TABLE)。
INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数。
对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
5、使用Statement实例执行SQL语句
ResultSet executeQuery(String sql) throws SQLException
用于产生单个结果集的语句,例如 SELECT 语句。
boolean execute(String sql) throws SQLException
运行可返回多个结果的SQL语句。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。
6、处理ResultRest结果集
如果执行的SQL语句是查询语句,则执行结果将返回一个ResultSet对象,该对象保存了与SQL语句查询的结果。
7、回收数据库资源
回收数据库资源,包括关闭ResultSet、Statement和Connection资源。
示例:演示JDBC编程步骤
public class DbConnection {
private static final String DRIVERNAME="com.mysql.jdbc.Driver"; //驱动类的类名
private static final String URL="jdbc:mysql://localhost:3306/data"; //连接数据的URL路径
private static final String USER="root"; //数据库登录账号
private static final String PASSWORD="root"; //数据库登录密码
static{ //1.加载驱动,驱动仅需加载一次即可
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获取数据库连接
public static Connection getConnection() {
Connection conn=null;
try {
return conn= DriverManager.getConnection(URL, USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
Connection conn=DbConnection.getConnection();
System.out.println("数据库连接="+conn);
}
}
9.1.4 实践练习
9.2 PreparedStatement执行DML语句
9.2.1 PreparedStatement接口
- PreparedStatement接口继承自Statement接口,其比Statement使用更为灵活高效。
- PreparedStatement接口提供了更为安全的预处理功能,此功能可以有效防止SQL注入。
- PreparedStatement接口会对sql语句进行预编译处理(如果JDBC驱动支持的话)。预编译的sql查询语句能在将来的查询中重用,因此查询速度更快。
- Connection实例生成PreparedStatement 实例时,对于SQL语句中输入参数的值,创建时并未被指定,而是保留问号“?”作为占位符。
PreparedStatement pst = conn.prepareStatement("update Emp set name=?,address=? ,phone=?,Where no=?");
/* 输入参数赋值时使用setXxx(index,value)方法,其中Xxx为参数数据类型,index为参数编号,
value为参数值 */
pst.setString(1,"李彦宏");
pst.setString(2,"中国北京");
pst.setInt(3,17710398436);
pst.setString(4,"EMP-001" );
9.2.2 使用PreparedStatement执行insert操作
示例: 新增一条员工数据
public class Emp { //员工实体类
private String no;//员工编号
private String name;//姓名
private String birthday;//生日
private String address;//住址
private String post;//职务
//省略属性的getter和setter方法
}
public class ExecuteStatement {
public boolean insertData(Emp emp){//向数据库中插入员工数据
...
try {
String sql=" insert into t_emp(no,name,birthday,address,post) values(?,?,?,?,?)";
conn=getConnection();//获取数据库连接
//获取PraparedStatement对象
pStmt=conn.prepareStatement(sql);
//将占位符“?”使用预处理的方式替换成员工的账号,1表示第一个“?”占位符
pStmt.setString(1, emp.getNo());
pStmt.setString(2, emp.getName());
...
//执行SQL语句
return pStat.executeUpdate()>0?true:false;
} catch (Exception e) {
e.printStackTrace();
}finally{ //关闭相关资源 }
return false;
}
public static void main(String[] args) { //测试新增一条员工数据 }
}
public class ExecuteStatement {
public boolean updateData(Emp emp){//更新员工数据
...
try {
String sql=" update t_emp set name=?,birthday=?,address=?,post=?"
+" where no=?";
conn=getConnection();//获取数据库连接
//获取PraparedStatement对象
pStmt=conn.prepareStatement(sql);
pStmt.setString(1, emp.getName());
...
pStmt.setString(5, emp.getNo());
//执行SQL语句
return pStat.executeUpdate()>0?true:false;
} catch (Exception e) {
e.printStackTrace();
}finally{ //关闭相关资源 }
return false;
}
public static void main(String[] args) { //测试更新一条员工数据 }
}
9.2.3 实践练习
9.3 数据库操作封装类DBConnection
9.3.1 定义数据库操作封装类
将数据连接与关闭操作封装成工具类DbConnection
public class DbConnection {
//驱动类的类名
private static final String DRIVERNAME="com.mysql.jdbc.Driver";
//连接数据的URL路径
private static final String URL="jdbc:mysql://localhost:3306/data";
//数据库登录账号
private static final String USER="root";
//数据库登录密码
private static final String PASSWORD="root";
//1.加载驱动,驱动仅需加载一次即可
static{
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接
public static Connection getConnection() throws Exception {
try {
return DriverManager.getConnection(URL, USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace(); throw new Exception();
}
}
//关闭连接
public static void colse(ResultSet rs,Statement stmt,Connection conn) throws Exception{
try { if (rs != null){ rs.close(); }
if (stmt != null) { stmt.cancel(); }
if (conn != null) { conn.close(); }
} catch (Exception e) {
e.printStackTrace(); throw new Exception();
}
}
}
9.3.2 实践练习
9.4 PreparedStatement执行查询语句
9.4.1 ResultSet对象
- Statement对象的executeQuery()方法的返回值为ResultSet对象,该对象保存了与SQL语句查询的结果。
- JDBC使用ResultSet封装查询到的结果,然后通过ResultSet记录的指针来获取结果集合的内容。
ResultSet类常用方法
方法名 | 作用 |
boolean next() | 判断Result结果集中是否还有数据,如果有返回true,没有返回false |
String getString(Stirng columnName) | 按照查询表的列名,获取该列所对应的列值 |
String getString(int columnIndex) | 按照查询表的列的序号,获取该列所对应的列值 |
9.4.2 操作ResultSet对象
示例:操作员工的ResultSet结果集获取员工信息
public List<Emp> queryEmp(){
Connection conn=null;
PreparedStatement pStmt=null;
ResultSet rs=null;
try {
String sql="select * from t_emp";
conn=DbConnection.getConnection();
pStmt=conn.prepareStatement(sql);
rs=pStat.executeQuery(); //返回ResultSet实例
List<Emp> empList=new ArrayList<Emp>();
//判断结果集中是否还有数据
while(rs.next()){
String no=rs.getString("no"); //通过列名为no获取对应的列值
String name=rs.getString("name"); //通过列名为name获取对应的列值
...
Emp emp=new Emp();
//将从ResultSet结果集获取到信息封装至emp对象中
emp.setNo(no);
emp.setName(name);
...
}
return empList;
} catch (Exception e) {e.printStackTrace();}
finally{
try { DbConnection.colse(rs, pStat, conn); //释放资源 }
catch (Exception e) {e.printStackTrace();}
}
return null;
}
9.4.3 实践练习
总结:
- 通过JDBC API可连接到数据库,并使用结构化查询语句实现对数据库的查询、更新等操作。使用JDBC开发数据库应用可以跨平台运行,并且可以跨数据库。
- JDBC编程步骤:1.加载数据库驱动 2.获得数据库连接 3.通过Connection实例获取Statement对象 4.使用Statement实例执行SQL语句 5.处理ResultRest结果集 6.回收数据库资源
- PreparedStatement接口继承自Statement接口,该接口会对sql语句进行预编译处理,因此查询速度更快。Connection实例生成PreparedStatement 实例时,对于SQL语句中输入参数的值,创建时并未被指定,而是保留问号“?”作为占位符。
- Statement对象的executeUpdate(String sql) 返回受影响的行数,Statement对象的executeQuery(String sql) 返回查询结果集,即ResultSet对象。
- 可以通过ResultSet记录的指针来获取结果集合的内容。