达内学习心得:JDBC总结:系列笔记之四

发布时间 : 星期二 文章达内学习心得:JDBC总结:系列笔记之四更新完毕开始阅读

System.out.println(tableName); }

/** 底层一定会用到网络socket和流,但我们不用关心使用字符还是字节接收,都由Statement做了 */ rs.close(); state.close();

}catch(Exception e){ e.printStackTrace(); }finally{

if(conn!=null){ try {

conn.close();

} catch (SQLException e) { e.printStackTrace(); } } }

u 注意事项: 养成良好的编码习惯:所有SQL关键字用纯大写,其他内容用纯小写 。 2.7案例:通过JDBC创建表 Connection conn=null; try{ //1 注册驱动

Class.forName(\

//2 打开连接,支持import java.sql.*,但全导入较耗费性能 conn=DriverManager.getConnection(

\//3 创建用于执行SQL语句的Statement Statement state=conn.createStatement(); //创建建表语句

String sql=\

\\\//execute()方法详见2.2节

if(!state.execute(sql)){ System.out.println(\创建表成功!\}else{ System.out.println(\创建失败!\state.close();

}catch (Exception e){ e.printStackTrace();

}finally{ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } 2.8案例:使用JDBC向表中插入数据 Connection conn=null;

try{ Class.forName(\conn=DriverManager.getConnection(

\Statement state=conn.createStatement();

//UUID详见2.5

String uuid=UUID.randomUUID().toString(); System.out.println(uuid);

String sql=\ALUES('\

//或String sql=\ALUES(sys_guid(),'chang',23,'1')\//判断insert语句是否成功,看返回值是否大于0,executeUpdate方法详见2.2 if(state.executeUpdate(sql)>0){ System.out.println(\插入数据成功\state.close();

}catch(Exception e){ e.printStackTrace();

}finally{ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } 2.9遍历Student_chang表 Connection conn=null;

try{ Class.forName(\conn=DriverManager.getConnection(

\Statement state=conn.createStatement();

String sql=\ResultSet rs=state.executeQuery(sql);

while(rs.next()){ String id=rs.getString(1);

String name=rs.getString(\不知第几列也可写列名 int age=rs.getInt(\

String sex=rs.getString(4).equals(\男\女\

System.out.println(id+\ } rs.close(); state.close();

}catch(Exception e){ e.printStackTrace();

}finally{ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }

三、JDBC核心API:PreparedStatement 3.1Statement的缺点

1)用Statement操作时代码的可读性和可维护性差,编写SQL语句复杂。

2)Statement操作SQL语句,每执行一次都要对传入的语句编译一次,效率比较差。 3)不安全可能出现SQL注入攻击,详见9.6案例step3。

4)扩展:XSS攻击、html代码注入攻击、struts2 OGNL存在可以远程执行底层操作系统命令的漏洞。

3.2PreparedStatement的优点

1)PreparedStatement实例包含已编译的SQL语句。包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定。该语句为每个IN参数保留一个问号(“?”)作为占位符,不考虑类型。每个问号的值必须在该语句执行之前,通过适当的setString、setInt、setDouble??等方法来提供。

2)由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。因此,多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。 3)PreparedStatement继承于Statement,其中三种方法:execute、executeQuery、executeUpdate都已被更改为不再需要参数了。因为我们在获取PreparedStatement时已经将SQL语句传入了。所以执行就可以,不需要再传入SQL。

4)PreparedStatement可以进行批量处理。 5)可以防止SQL注入攻击。 u 注意事项:

v 使用预编译语句,你传入的任何内容就不会和原来的语句发生任何匹配的关系,只要全使用预编译语句,你就不用对传入的数据作任何的过滤。

v 对一个表只作一个操作用PreparedStatement,效率高、方便 v 对表进行2种及以上的操作用Statement。 3.3案例详见第五章StudentDAO类 ???????? ????????

五、DAO

5.1持久类封装

对象关系映射(ORM)使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。1)表和类对应。2)表中的字段和类的属性对应。3)记录和对象对应。 5.2 DAO层

1)DAO:数据连接对象(DataAccessObjects)

2)作用:将数据库中的数据转化为Java的对象并返回(即读数据),将Java的对象转化为数据库中表的一条数据(即写数据)。

3)Java对象在这里就是所谓的实体entity,DAO要达到的目的:对数据库数据的操作面向对象化。

4)实体:用Java中的对象去描述数据库中的某表中的某一条记录。

比如:Student表有字段id、name、age、sex,则对应的Java类中有Student类,属性有id、name、age、sex

5)实体类:用于对应数据库中的表。通常实体类的名字和数据库中表的名字一致。 u 注意事项:实体类代表表,属性代表字段,对象代表一条数据。 5.3 Properties类

用于读取“.properties”文本文件的类,导入java.util.Properties包。 1)“.properties”文件是一个纯文本文件,里面定义的内容格式有要求,必须是key=value的形式,并且以行为单位。一行只记录一条数据! 2)Properties类可以方便的读取properties文件,并将内容以类似HashMap的形式进行读取。 3)db.properties文件里的内容如下:

jdbc.driver=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc:oracle:thin:@192.168.0.20:1521:tarena jdbc.user=jsd1304 jdbc.pwd=jsd1304

u 注意事项:读取的都是字符串!不用写双引号,无空格!

4)getProperty(String key)方法:该方法可以从properties文件中获取数据,如:jdbc.driver=oracle.jdbc.driver.OracleDriver。获取方式是将jdbc.driver以key作为参数调用方法。返回的就是等号右面的值oracle.jdbc.driver.OracleDriver了。

联系合同范文客服:xxxxx#qq.com(#替换为@)