Java面向对象笔记 • 【第9章 JDBC编程】

全部章节   >>>>


本章目录

9.1 JDBC基础

9.1.1 JDBC简介

9.1.2 JDBC常用API简介

JDBC 常用API功能说明

9.1.3 JDBC编程步骤

9.1.4 实践练习

9.2 PreparedStatement执行DML语句

9.2.1 PreparedStatement接口

9.2.2 使用PreparedStatement执行insert操作

9.2.3 实践练习

9.3 数据库操作封装类DBConnection

9.3.1 定义数据库操作封装类

9.3.2 实践练习

9.4 PreparedStatement执行查询语句

9.4.1 ResultSet对象

ResultSet类常用方法

9.4.2 操作ResultSet对象

9.4.3 实践练习

总结:


9.1 JDBC基础

9.1.1 JDBC简介

JDBCJava Database ConnectivityJava数据库连接是一种可以执行SQL语句的Java API

  • 通过JDBC API连接到数据库,并使用结构查询语句实现对数据库的查询、更新等操作
  • 使用JDBC开发数据库应用可以跨平台运行并且可以数据库
  • 通过JDBC API,不必为访问SybaseDB2等数据库学习新的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

用于执行 INSERTUPDATE DELETE 语句以及 SQL DDL语句(例如 CREATE TABLE DROP TABLE)。

INSERTUPDATE 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、回收数据库资源

回收数据库资源,包括关闭ResultSetStatementConnection资源

示例:演示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记录的指针来获取结果集合的内容。

猜你喜欢

转载自blog.csdn.net/weixin_44893902/article/details/106746880