您现在的位置:首页 >> 前端 >> 内容

javaweb中JDBC的常见知识点(一)

时间:2016/11/28 9:24:00 点击:

  核心提示:导读:{ 【1】什么是JDBC (JAVA DataBase Connectivity : java 数据库连接)?【2】如何连接数据库?【2.1】需要对应数据库的驱动jar 包 (Mysql 对应:...
导读:{ 【1】什么是JDBC (JAVA DataBase Connectivity : java 数据库连接)?
【2】如何连接数据库?
【2.1】需要对应数据库的驱动jar 包 (Mysql 对应: Mysql-connector-java-5.17.jar,不同的数据库对应不用的jar 包)放入到 web root/WEB-INF/lib/ 目录下面 【2.2】基本流程 【3】JDBC 的基本操作 (1)注册加载数据库驱动有下面三种方式 (2)对数据库的 增 删 改 查
(2.0) Statement 和 PreparedStatement 的区别:
(2.1)实现对数据库的查询操作。
(2.2)实现对数据库的增加数据
(2.3)实现对数据库的 删除数据操作。
(2.4)实现对数据库的 修改操作。 }

【1】什么是JDBC (JAVA DataBase Connectivity : java 数据库连接)?

是一套用于执行SQL语句的Java API。 应用程序可通过这套API连接到关系数据库, 并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。

【2】如何连接数据库?

javaweb中JDBC的常见知识点(一)
可以看出我们 需要有一个 对应数据库的驱动jar 文件,实现Driver 接口注册,再通过DiverManger 类来获取数据库的连接。

【2.1】需要对应数据库的驱动jar 包 (Mysql 对应: Mysql-connector-java-5.17.jar,不同的数据库对应不用的jar 包)放入到 web root/WEB-INF/lib/ 目录下面

javaweb中JDBC的常见知识点(一)
注意:记得先把电脑中的mysql 数据库的服务开启 ,否则不可能连接上 数据库的。
小知识点:开启数据库服务的方法
(1)点击windos 键,在弹出的搜索框中,输入cmd,右键“管理员身份运行”打开 javaweb中JDBC的常见知识点(一)
(2)输入 net start mysql ,这样就能开启mysql 服务了。 (我的这个是开启过了,有时候你清内存的时候,会把mysql 的服务关掉,再开一下就好了。) javaweb中JDBC的常见知识点(一)

【2.2】基本流程

JDBCUtils.java 主要实现的功能就是,返回出数据库的连接,释放数据库连接的资源 (1)注册Mysql 的驱动程序,通过反射拿到com.mysql.jdbc.Driver 这个类
(2)通过Mysql 的驱动管理者(DriverManager),返回数据库的连接(Connection)。
再获取数据库的连接时,需要设置 mysql 的路径,数据库用户名,数据库密码
{ static String url = "jdbc:mysql://localhost:3306/test"; static String user = "root"; static String password = "111"; } (3)通过数据库连接对象(Connection) 获取用于执行sql 语句的类 Statement 对象(或者 PerpardStatemnt)
注意:执行查询的sql 语句的时候会返回一个结果集 (ResultSet) (4)当执行完数据操作后,就需要关闭连接数据的资源(蓝色区域的部分)
原因:如果不关闭,会占用数据库的连接,可能导致后面的程序连接不上数据库。
所以这一部分的代码 最好写在 try ....finally{ }

  1. package demo;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8.  
  9. public class JDBCdemo01 {
  10.  
  11. static String url = "jdbc:mysql://localhost:3306/test";
  12. static String user = "root";
  13. static String password = "111";
  14. private static Connection connection; // 数据库连接
  15. private static ResultSet executeQuery;
  16. private static Statement statement;
  17.  
  18.  
  19. public static void main(String[] args) {
  20.  
  21. try {
  22. // [1] 加载数据库驱动程序
  23. Class.forName("com.mysql.jdbc.Driver");
  24. // [2] 连接Mysql数据库,拿到数据库连接
  25. connection = DriverManager.getConnection(url, user, password);
  26. // [3] 获取到可以执行sql语句的对象 statement
  27. statement = connection.createStatement();
  28. // [4] 执行sql语句 查询
  29. executeQuery = statement.executeQuery("select * from user");
  30. //推荐直接使用预编译的statement 对象,执行sql语句
  31. // connection.prepareStatement(sql)
  32. // 拿到我们需要的数据
  33. while (executeQuery.next()) {
  34.  
  35. int id = executeQuery.getInt("id");
  36. String name = executeQuery.getString("name");
  37. String password = executeQuery.getString("password");
  38. String email = executeQuery.getString("email");
  39. String birthday = executeQuery.getString("birthday");
  40.  
  41. System.out.println(id+""+name+""+password+""+email+""+birthday);
  42. }
  43.  
  44. } catch (Exception e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }finally{
  48.  
  49.  
  50.  
  51. if (executeQuery!=null) {
  52. try {
  53. executeQuery.close();
  54. } catch (SQLException e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. }
  58. executeQuery=null;
  59. }
  60.  
  61.  
  62.  
  63.  
  64. if (statement!=null) {
  65. try {
  66. statement.close();
  67. } catch (SQLException e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }
  71. statement=null;
  72. }
  73.  
  74.  
  75. if (connection!=null) {
  76. try {
  77. connection.close();
  78. } catch (SQLException e) {
  79. // TODO Auto-generated catch block
  80. e.printStackTrace();
  81. }
  82. connection=null;
  83. }
  84.  
  85.  
  86.  
  87. }
  88.  
  89.  
  90. }
  91.  
  92. }

【3】JDBC 的基本操作

(1)注册加载数据库驱动有下面三种方式

显示注册 DriverManager.registerDriver(newcom.mysql.jdbc.Driver()); 还可以使用这两种方式
(1.1) Class.forName("com.mysql.jdbc.Driver").newInstance(); (1.2)
Class.forName("com.mysql.jdbc.Driver"); // 我们查看源码会发现,执行forName 会调用newInstance() ,所以跟上面的方法一样。

(2)对数据库的 增 删 改 查

当我们使用Statement (或者 PreparedStatement)对数据库的增删改查 ,其中 增加,删除,修改 都是执行executeUpdate()方法 操作,查询是 executeQuary() 方法的操作,并且查询操作会返回一个结果集(ResultSet)。

(2.0) Statement 和 PreparedStatement 的区别:

我们可以利用 Statement 来实现对数据库的增删改查,我们只需要组织出正确的sql 语句,就可以实现。但是我们所写的sql 语句不可以使用参数代替。也就是(?)代替。 PreparedStatement 继承于 Statement 重写了Statement 的所有方法。 PreparedStatement 允许使用不完整的 sql 语句,空缺的值使用(?)代替,直到执行的时候,再输入进去就可以了。
例子: 使用Statement StatementcreateStatement=conn.createStatement(); intexecuteUpdate2=createStatement.executeUpdate("insertintouser(name,password)values('1','2')");
使用 preparedStatement //创建预编译语句对象 pstmt=conn.prepareStatement("insertintouser(name,password)values(?,?)"); //给4个占位符赋值 pstmt.setString(1,"ww"); pstmt.setString(2,"789"); //执行SQL语句(增加记录) intn=pstmt.executeUpdate();
所以推荐使用preparedStatement流行的框架中都倾向使用它。 下面的例子基本都是使用preparedStatement 来操作。

(2.1)实现对数据库的查询操作。


  1. package demo;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.Date;
  5. import java.sql.DriverManager;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9.  
  10. public class Ex01 {
  11.  
  12. /**
  13. * 演示:JDBC访问数据库的操作步骤 查询
  14. */
  15. public static void main(String[] args) {
  16. Connection conn = null;
  17. Statement stmt = null;
  18. ResultSet rs = null;
  19. try {
  20. //1、加载驱动程序
  21. Class.forName("com.mysql.jdbc.Driver").newInstance();
  22.  
  23. // 2、通过DriverManager建立数据库连接 Driver 驱动
  24. String url = "jdbc:mysql://127.0.0.1:3306/test";
  25. String user = "root";
  26. String password = "111";
  27. conn = DriverManager.getConnection(url, user, password);
  28. // 3.通过Connection获取语句对象Statement (声明)
  29.  
  30. stmt = conn.createStatement();
  31. // 4.使用语句对象执行SQL语句
  32. rs = stmt.executeQuery("select * from user");
  33. // 5.遍历结果集
  34. while (rs.next()) {
  35. // 取出当前行各个字段的值
  36. int id = rs.getInt("id");
  37. String name = rs.getString("name");
  38. String pwd = rs.getString("password");
  39.  
  40. System.out.println(id + " " + name + " " + pwd);
  41. }
  42. } catch (Exception e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. } finally {// 一定会执行的代码块,无论是否发生异常
  46. // 6.释放相关资源
  47. if (rs != null) {
  48. try {
  49. rs.close();
  50. } catch (SQLException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. }
  54. rs = null;
  55. }
  56. if (stmt != null) {
  57. try {
  58. stmt.close();
  59. } catch (SQLException e) {
  60. // TODO Auto-generated catch block
  61. e.printStackTrace();
  62. }
  63. stmt = null;
  64. }
  65. if (conn != null) {
  66. try {
  67. conn.close();
  68. } catch (SQLException e) {
  69. // TODO Auto-generated catch block
  70. e.printStackTrace();
  71. }
  72. conn = null;
  73. }
  74. }
  75.  
  76. }
  77.  
  78. }
我们操作的是 test 数据库中的 user 表,执行的sql 语句是"select * from user" 遍历结果集 拿到我们在表中存放的数据。

(2.2)实现对数据库的增加数据


  1. package demo;
  2.  
  3. import java.sql.CallableStatement;
  4. import java.sql.Connection;
  5. import java.sql.Date;
  6. import java.sql.DriverManager;
  7. import java.sql.PreparedStatement;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10.  
  11. public class Ex02 {
  12.  
  13. /**
  14. * 演示:预编译语句对象PreparedStatemet的使用
  15. */
  16. public static void main(String[] args) {
  17. Connection conn = null;
  18. PreparedStatement pstmt = null;
  19. try {
  20. Class.forName("com.mysql.jdbc.Driver");
  21. String url = "jdbc:mysql://127.0.0.1:3306/test";
  22. String user = "root";
  23. String password = "111";
  24. conn = DriverManager.getConnection(url, user, password);
  25. pstmt = conn
  26. .prepareStatement("insert into user(name,password,email,birthday) values(?,?,?,?)");
  27. // 给4个占位符赋值
  28. pstmt.setString(1, "ww");
  29. pstmt.setString(2, "789");
  30. pstmt.setString(3, "ww@qq.com");
  31. pstmt.setDate(4, Date.valueOf("2016-01-01"));
  32. // 执行SQL语句(增加记录)
  33. int n = pstmt.executeUpdate();
  34. if (n > 0) {
  35. System.out.println("增加记录成功");
  36. }
  37. } catch (ClassNotFoundException e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. } catch (SQLException e) {
  41. // TODO Auto-generated catch block
  42. e.printStackTrace();
  43. } finally {
  44. if (pstmt != null) {
  45. try {
  46. pstmt.close();
  47. } catch (SQLException e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. }
  51. pstmt = null;
  52. }
  53. if (conn != null) {
  54. try {
  55. conn.close();
  56. } catch (SQLException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. }
  61. }
  62.  
  63. }
  64.  
  65. }
在使用executeUpdate() 方法时,会返回一个 int 类型,我们可以根据 这个int 值是否大于0 来,判断我们的操作是否成功。

(2.3)实现对数据库的 删除数据操作。

//根据Id删除记录

  1. pstmt = conn.prepareStatement("delete from user where id=?");
  2. pstmt.setInt(1, id);
  3. int n = pstmt.executeUpdate();
  4. if(n>0){
  5. return true; // 操作成功
  6. }else{
  7. return false; // 操作石板
  8. }
  9.  

(2.4)实现对数据库的 修改操作。

根据id 修改数据

  1. pstmt = conn.prepareStatement("update user set name=?,password=?,email=?,birthday=? where id=?");
  2. pstmt.setString(1, user.getName());
  3. pstmt.setString(2, user.getPassword());
  4. pstmt.setString(3, user.getEmail());
  5. pstmt.setDate(4, user.getBirthday());
  6. pstmt.setInt(5, user.getId());
  7. int n = pstmt.executeUpdate();
  8. if(n>0){
  9. return true;
  10. }else{
  11. return false;
  12. }

Tags:JA AV VA AW 
作者:网络 来源:qq11640147