目标了解预制语句的原理掌握预制语句的使用理解JDBC中事务的处理掌握JavaBean的创建概述封装数据库访问连接工厂类JavaBean类高级 数据库访问预制语句元数据事务预置语句PreparedStatement接口继承自Statement编译一次可重复执行的语句接口在s ql语句中通过使用占位符来代替常量字段值,setXXX方法来填充字段值,取代掉占位符,形成完整的可执行的sql语句预置语句创建预置 语句对象,在sql语句中使用占位符String SQL="insert into dept(deptno,dname) value s(?, ?)" ;PreparedStatement ps = con.prepareStatement(SQL);预置语句使用 setXXX()方法为参数赋值用 executeUpdate() 方法执行SQL语句ps.setInt( 1, 60 );ps.s etString( 2, "客服部" );ps.executeUpdate();预置语句 示例:使用预置语句插入数据String sql = "insert into emp(empno,ename,hiredate) values(?,?,?)";Prepa redStatement pstmt = con.prepareStatement(sql);pstmt.setInt( 1, 2 234 );pstmt.setString( 2, "张三" );pstmt.setDate( 3, Date.valueOf(" 2004-3-3") );pstmt.executeUpdate();System.out.println("行已添加");元数据 元数据是描述一个RDBMS提供何种功能和数据库中数据类型的数据(数据字典)JDBC提供了两个元数据接口:DatabaseMetaD ata 数据库元数据ResultSetMetaData 结果集元数据 元数据DatabaseMetaData对象提供关于数据库 的信息:数据库与用户、数据库标识符以及函数与存储过程数据库支持与不支持的功能数据库限制,如数据库中名称的最大长度架构、编目、表和列 元数据ResultSetMetaData对象可以获得关于结果集对象的元数据信息:结果集中列的名称、类型、是NULL还是NOT N ULL、精度等信息 获取ResultSetMetaData对象:ResultSet rs = stmt.executeQuery (sql);ResultSetMetaData rsmd = rs.getMetaData();元数据读取结果集元数据的方法 元数 据查看emp表的字段名和字段类型String sql="select from emp " ;PreparedStateme nt pstmt = con.prepareStatement(sql);ResultSet rs = pstmt.execute Query();ResultSetMetaData rsmd = rs.getMetaData();int count = rsm d.getColumnCount();for(int i=1; i<=count; i++){ System.out.print( rsmd.getColumnName(i) + "(" + rsmd.getColumnTypeName(i) + ")\ t" );}事务事务的主要用途:把数据库从一个一致状态带到下一个一致状态 事务具备的属性:原子性、一致性、隔离性、耐久性控制事务的 主要语句:提交、回退事务JDBC通过Connection对象的setAutocommit(boolean)方法决定是否启用自动提交 当自动提交模式被设置成false时,事务管理必须由代码来明确控制 调用连接对象的commit()方法和rollback()方法来提 交和回退事务 事务利用事务完成两条记录的插入 try { …… con=DriverManager.getConnec tion(url,"scott","tiger"); con.setAutoCommit(false); String sql = "insert into emp(empno,ename,hiredate) values(?,?,?)"; pstmt = con.prepareStatement(sql); //插入第一条记录 //插入第二条记录 c on.commit(); ……}catch(Exception e) { …… con.rollback(); ……}封装数据访问 在一个工程中可以定义出一个类专门用于完成数据库连接,这个类可以当作工厂类 public class C onnectionFactory { //静态变量,用于调用私有构造方法 private static Connect ionFactory ref = new ConnectionFactory(); //私有构造方法,用于加载驱动程序 private ConnectionFactory(){ … } //获取连接对象 public static Co nnection getConnection()throws SQLException{ … } public static void close(ResultSet rs){ … } //关闭结果集对象 public static voi d close(Statement stmt){ … } //关闭语句对象 public static void close (Connection con){ … } //关闭连接对象}连接工厂类获取一个连接对象Connection con = Conn ectionFactory.getConnection();释放数据库资源ConnectionFactory.close( rs );ConnectionFactory.close( stmt );ConnectionFactory.close( con ); JavaBean类JavaBean是基于可重用的软件组件模型开发出来的。被用于封装各种操作的细节JavaBean的要求:类中数据成 员不能直接访问,必须通过access方法来访问accessor方法通常成对出现:setXXX(),getXXX()JavaBean 中必须包含无参构造函数JavaBean类JavaBean对数据的映射映射单个实体:即映射表中的一条记录 映射实体集:即映射数据库中 的一张表或映射一张视图 JavaBean类 映射单个实体class Customer { protected String cu stomerID; protected String customerName; protected String custo merType; protected String comments; public void setCustomerID(S tring vCustomerID) { customerID = vCustomerID; } public Stri ng getCustomerID() { return customerID; } …… public void u pdateToDB() { //将当前对象中的数据更新至数据库 }JavaBean类映射实体集ResultSet对象的维持 需要占用数据库连接,不利于多用户并发访问数据库。可以将记录集的数据按行读取出来,保存在集合中,由JavaBean维持该集合 该Ja vaBean中还提供实体集所对应数据库的数据处理功能 JavaBean类 映射实体集public class SQL06 { //获得所有的员工数据 public ArrayList getAllEmp()throws Exception{…} //根据特定字段获得纪录 public ArrayList getEmpBySomeField(String fieldNam e, String fieldValue)throws Exception{…} //插入纪录 public voi d insertToDB(int empno,String ename)throws Exception{…} //根据员工编 号删除纪录 public void deleteFromDB(int empno) throws Exception{ / /根据员工编号更新纪录 public void updateToDB(int empno,String ename)throws Exception{…}}总结预制语句:编译一次可重复运行。通过预制语句对数据库进行增加、删除、修改、查询 ,效率更高。预制语句的核心思想是通过使用占位符来代替sql语句的常量字段值,再利用该对象的setXXX()方法来填充字段值 通过元数据可以反向获取了数据库中表的结构:字段数目、字段名称、字段类型等JDBC的事务处理主要包括提交和回退,JDBC的默认事务处理方式:自动事务 |
|