1、传智播客李勇Jdbc视频笔记1、jdbc的理论概述: JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API。 J2SE的一部分,由java.sql,javax.sql包组成 2、编写简单的jdbc的例子 3、分析jdbc程序的编写步骤和原理: 代码示例: Java代码 1. staticvoidtest()throwsSQLException,ClassNotFoundException 2. /1.注册驱动 3. DriverManager.registerDriver(newcom.mysql.jdbc.Driver(); 4.
2、 System.setProperty(jdbc.drivers,com.mysql.jdbc.Driver); 5. Class.forName(com.mysql.jdbc.Driver);/推荐方式 6. 7. /2.建立连接 8. Stringurl=jdbc:mysql:/localhost:3306/jdbc; 9. Stringuser=root; 10. Stringpassword=; 11. Connectionconn=DriverManager.getConnection(url,user,password); 12. 13. /3.创建语句 14. Statement
3、st=conn.createStatement(); 15. 16. /4.执行语句 17. ResultSetrs=st.executeQuery(select*fromuser); 18. 19. /5.处理结果 20. while(rs.next() 21. System.out.println(rs.getObject(1)+t+rs.getObject(2)+t22. +rs.getObject(3)+t+rs.getObject(4); 23. 24. 25. /6.释放资源 26. rs.close(); 27. st.close(); 28. conn.close(); 29.
4、 static void test() throws SQLException, ClassNotFoundException / 1.注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver(); System.setProperty(jdbc.drivers, com.mysql.jdbc.Driver); Class.forName(com.mysql.jdbc.Driver);/ 推荐方式 / 2.建立连接 String url = jdbc:mysql:/localhost:3306/jdbc; String user =
5、 root; String password = ; Connection conn = DriverManager.getConnection(url, user, password); / 3.创建语句 Statement st = conn.createStatement(); / 4.执行语句 ResultSet rs = st.executeQuery(select * from user); / 5.处理结果 while (rs.next() System.out.println(rs.getObject(1) + t + rs.getObject(2) + t + rs.getO
6、bject(3) + t + rs.getObject(4); / 6.释放资源 rs.close(); st.close(); conn.close(); 注册驱动的三种方式: Java代码 1. Class.forName(“com.mysql.jdbc.Driver”); 2. 推荐这种方式,不会对具体的驱动类产生依赖。 3. DriverManager.registerDriver(com.mysql.jdbc.Driver); 4. 会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。 5. /可以注册多个驱动用冒号分隔 6. System.setPro
7、perty(“jdbc.drivers”,“driver1:driver2”); 7. 虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。Class.forName(“com.mysql.jdbc.Driver”); 推荐这种方式,不会对具体的驱动类产生依赖。 DriverManager.registerDriver(com.mysql.jdbc.Driver); 会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。 /可以注册多个驱动用冒号分隔 System.setProperty(“jdbc.drivers”, “driver1:driver2”)
8、; 虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。4、jdbc代码的规范和封装: /封装成Jdbc工具类 Java代码 1. publicfinalclassJdbcUtils 2. privatestaticStringurl=jdbc:mysql:/localhost:3306/jdbc; 3. privatestaticStringuser=root; 4. privatestaticStringpassword=; 5. 6. privateJdbcUtils() 7. 8. 9. /用静态语句块来注册驱动,只注册一次。 10. static 11. try 12. C
9、lass.forName(com.mysql.jdbc.Driver); 13. catch(ClassNotFoundExceptione) 14. thrownewExceptionInInitializerError(e); 15. 16. 17. 18. /得到链接 19. publicstaticConnectiongetConnection()throwsSQLException 20. returnDriverManager.getConnection(url,user,password); 21. 22. 23. /释放链接 24. publicstaticvoidfree(R
10、esultSetrs,Statementst,Connectionconn) 25. try 26. if(rs!=null) 27. rs.close(); 28. catch(SQLExceptione) 29. e.printStackTrace(); 30. finally 31. try 32. if(st!=null) 33. st.close(); 34. catch(SQLExceptione) 35. e.printStackTrace(); 36. finally 37. if(conn!=null) 38. try 39. conn.close(); 40. catch(
11、SQLExceptione) 41. e.printStackTrace(); 42. 43. 44. 45. 46. 47. 48. /在main函数的调用封装 49. staticvoidtemplate()throwsException 50. Connectionconn=null; 51. Statementst=null; 52. ResultSetrs=null; 53. try 54. /2.建立连接 55. conn=JdbcUtils.getConnection(); 56. /conn=JdbcUtilsSing.getInstance().getConnection()
12、; 57. /3.创建语句 58. st=conn.createStatement(); 59. 60. /4.执行语句 61. rs=st.executeQuery(select*fromuser); 62. 63. /5.处理结果 64. while(rs.next() 65. /参数中的1,2,3,4是指sql中的列索引 66. System.out.println(rs.getObject(1)+t+rs.getObject(2) 67. +t+rs.getObject(3)+t+rs.getObject(4); 68. 69. finally 70. JdbcUtils.free(r
13、s,st,conn); 71. 72. 73. public final class JdbcUtils private static String url = jdbc:mysql:/localhost:3306/jdbc; private static String user = root; private static String password = ; private JdbcUtils() /用静态语句块来注册驱动,只注册一次。 static try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundExcepti
14、on e) throw new ExceptionInInitializerError(e); /得到链接 public static Connection getConnection() throws SQLException return DriverManager.getConnection(url, user, password); /释放链接 public static void free(ResultSet rs, Statement st, Connection conn) try if (rs != null) rs.close(); catch (SQLException e
15、) e.printStackTrace(); finally try if (st != null) st.close(); catch (SQLException e) e.printStackTrace(); finally if (conn != null) try conn.close(); catch (SQLException e) e.printStackTrace(); /在main函数的调用封装 static void template() throws Exception Connection conn = null; Statement st = null; Result
16、Set rs = null; try / 2.建立连接 conn = JdbcUtils.getConnection(); / conn = JdbcUtilsSing.getInstance().getConnection(); / 3.创建语句 st = conn.createStatement(); / 4.执行语句 rs = st.executeQuery(select * from user); / 5.处理结果 while (rs.next() / 参数中的1,2,3,4是指sql中的列索引 System.out.println(rs.getObject(1) + t + rs.g
17、etObject(2) + t + rs.getObject(3) + t + rs.getObject(4); finally JdbcUtils.free(rs, st, conn); 总结: 释放ResultSet, Statement,Connection. 数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致 系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放 5、采用单例的方式完成上面的JdbcUtils类:首先把上面类中的static方法都改成不是静态的,然后 对外提供一个获得对象的方法: Jav
18、a代码 1. /privatestaticJdbcUtilsSinginstance=newJdbcUtilsSing(); 2. privatestaticJdbcUtilsSinginstance=null; 3. 4. privateJdbcUtilsSing() 5. 6. 7. publicstaticJdbcUtilsSinggetInstance() 8. /延迟加载:等要调用我这个方法的时候才new一个对象,否则在static时候创建了一个对象, 9. /有可能会用不到。 10. if(instance=null) 11. /解决多线程访问的问题,把这个同步如果加到方法上,那么
19、我们每次的调用都会进行同步会影响性能如果我们按照下面的方法 12. /将同步缩小了范围之后只是会同步一次,下一次有对象了之后instance!=null同步方法就不会执行 13. /为什么要判断两次instance=null:假设有两个线程同时访问这个方法,同时判断到第一个instance=null,然后其中一个线程会 14. /先拿到锁,我们假设没有第二个判断,那么这个时候创建完对象之后,返回对象,而第二个线程有会创建一个实例但此时instance已经 15. /不是null了,所以我们要进行第二次的判断。 16. synchronized(JdbcUtilsSing.class) 17.
20、if(instance=null) 18. instance=newJdbcUtilsSing(); 19. 20. 21. 22. returninstance; 23. / private static JdbcUtilsSing instance = new JdbcUtilsSing(); private static JdbcUtilsSing instance = null; private JdbcUtilsSing() public static JdbcUtilsSing getInstance() /延迟加载:等要调用我这个方法的时候才new一个对象,否则在static时候
21、创建了一个对象, /有可能会用不到。 if (instance = null) /解决多线程访问的问题,把这个同步如果加到方法上,那么我们每次的调用都会进行同步 会影响性能 如果我们按照下面的方法 /将同步缩小了范围之后只是会同步一次,下一次有对象了之后instance != null 同步方法就不会执行 /为什么要判断两次instance = null:假设有两个线程同时访问这个方法,同时判断到第一个instance = null,然后其中一个线程会 /先拿到锁,我们假设没有第二个判断,那么这个时候创建完对象之后,返回对象,而第二个线程有会创建一个实例 但此时instance已经 /不是nu
22、ll了,所以我们要进行第二次的判断。 synchronized (JdbcUtilsSing.class) if (instance = null) instance = new JdbcUtilsSing(); return instance; 6、理解sql注入: /根据我传递的name名称来确定查询哪个字段。 Java代码 1. publicvoidread(Stringname) 2. . 3. Stringsql=select*fromxxxwherename=+name; 4. . 5. . 6. public void read(String name) . String sql
23、 = select * from xxx where name = + name ; . . 在上面这种情况下,如果我的name传值为 or 1 那 sql = select * from xxx where name = or 1 ; 因为or是数据库中的关键字,而在 数据库中1其实表示true ,所以会把所有的数据都会给查询上来。这叫做sql Injection(sql 注入) 7、PerparedStatement的应用: 在上面的例子中,我们看到了在构造sql语句的时候使用拼串的方式会有sql注入的问题,这个时候我们可以用 PreparedStatement 来解决这个问题 Java代码 1. publicvoidread(Stringname) 2. . 3. PreparedStatementps=null; 4. Stringsql=select*fromxxxwherename=?; 5. ps=conn.prepareStatement(sql); 6. ps.setString(1,name); 7. rs=ps.executeQuery(); 8. .
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2