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

JAVAWEB 中JDBC 常见知识点(一)

导读:{
【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 的常见知识点(一)_第1张图片
可以看出我们 需要有一个 对应数据库的驱动jar 文件,实现Driver 接口注册,再通过DiverManger 类来获取数据库的连接。

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


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

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

【3】JDBC  的基本操作

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

            显示注册
    DriverManager.registerDriver(new com.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 
Statement createStatement = conn.createStatement();
int executeUpdate2 = createStatement.executeUpdate("insert into user(name,password) values('1','2')");   
使用 preparedStatement
                              //创建预编译语句对象
            pstmt = conn.prepareStatement("insert into user(name,password) values(?,?)");
            //给4个占位符赋值
            pstmt.setString(1, "ww");    
            pstmt.setString(2, "789");
            //执行SQL语句(增加记录)
            int n = pstmt.executeUpdate();   
所以推荐使用  preparedStatement  流行的框架中都倾向使用它。
下面的例子基本都是使用   preparedStatement 来操作。

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

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

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

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

(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. }

你可能感兴趣的:(javaweb基础学习)