JDBC回顾

Class.forName

package com.zhou.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcDemo1 {
    public static void main(String[] args) throws Exception {

        String url="jdbc:mysql://localhost:3306/javaweb?serverTimezone=GMT%2B8";
        String username="root";
        String password="zmc19";

        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection con = DriverManager.getConnection(url, username, password);
        //3.定义SQL语句
//        String sql="update books set bookCounts = 500 where bookID =5";
          String sql="select * from books";
        //4.获取执行SQL对象
        Statement smt = con.createStatement();
        //5.执行SQL
//        int i = smt.executeUpdate(sql);
        ResultSet rs = smt.executeQuery(sql);
        //6.处理结果
        while(rs.next()){
            System.out.println("id="+rs.getObject("bookID"));
            System.out.println("name="+rs.getObject("bookName"));
            System.out.println("counts="+rs.getObject("bookCounts"));
            System.out.println("details="+rs.getObject("detail"));
            System.out.println("======================");
        }
        //7.释放资源
        rs.close();
        smt.close();
        con.close();


    }
}

详解各个对象

  • DriverManager:驱动管理对象

    ​ 功能:

    ​ 1.注册驱动:告诉程序要使用哪个驱动jar包

    static void registerDriver(Driver driver) : 注册与给定的驱动程序 DriverManager

    image-20200512233152004

    mysql 5 之后的jar包可以省略注册驱动的步骤 ,但我们一般不这样干。

    ​ 2.获取数据库的连接

     Connection con = DriverManager.getConnection(url, username, password);
    

    ​ 三个参数:

    //String url="jdbc:mysql://localhost:3306/javaweb?serverTimezone=GMT%2B8";
    String url="jdbc:mysql:///javaweb?serverTimezone=GMT%2B8";  //可以简写代码
    String username="root";
    String password="zmc19";
    
  • Connection:数据库连接对象

    ​ 功能:

    Statement smt = con.createStatement();
    

    ​ 1.获取执行sql的对象 statement

    ​ 2.管理事务(要么同时成功,要么同时失败)

    • 开启事务: void setAutoCommit(boolean autoCommit):默认为false,即为开启事务
    • 提交事务:commit();
    • 回滚事务: rollback();
  • Statement:执行SQL的对象

    ResultSet rs = smt.executeQuery(sql);
    
    • 查询:executeQuery(sql); 返回 rs

    • 增删改:.executeUpdate(sql); 返回影响的行数

  • ResultSet:返回结果集

    ​ 结果集的处理:

    image-20200512235220188

    方法:

    ​ next (); 游标移动至下一行

    ​ getXXX() ; 获取数据类型 里面的参数为数据库中的字段名

    使用步骤:

    • 右边向下移动一行
    • 判断是否有数据
    • 获取数据并且打印处理
  • PreparedStatement:预编译

练习

需求:

  • 增加
image-20200513001548134
  • 修改
  String sql="update books set bookName='测试' where bookId = 6";
  String url="jdbc:mysql://localhost:3306/javaweb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";

有时候会出现乱码问题在url上进行添加约束:

image-20200513002612367

​ 一般情况:这三个同时加上就没问题了!!!

  • 删除
String sql="delete from books where bookID = 6";
  • 查询(select):查询books表中的数据将其封装为对象,然后转载集合返回

    ​ 步骤:

    ​ 1.定义一个实体类

    //封装books表的javaBean
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Book {
        private int bookID;
        private String bookName;
        private int bookCounts;
        private String detail;
    }
    

    ​ 2.定义方法 实现方法

    public class JdbcDemo3 {
        private Connection con;
        private Statement smt;
        ResultSet rs;
        List<Book> list = new ArrayList<Book>();
     String url="jdbc:mysql:///javaweb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
        String username="root";
        String password="zmc19";
        String sql="select * from books";
    		//定义方法
        public List<Book> findAll(){
            try {
                //1.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2.获取连接
                 con = DriverManager.getConnection(url,username,password);
                //3.获取执行Sql对象
                smt = con.createStatement();
                //4.执行sql
                 rs = smt.executeQuery(sql);
                //5.结果集处理 遍历 封装对象,转载集合
                Book book = null;
                while (rs.next()){
                    //获取数据
                    int id = rs.getInt("bookID");
                    String name = rs.getString("bookName");
                    int counts = rs.getInt("bookCounts");
                    String detail = rs.getString("detail");
                        //创建对象
                    book = new Book();
                    book.setBookID(id);
                    book.setBookName(name);
                    book.setBookCounts(counts);
                    book.setDetail(detail);
                    //装载集合
                    list.add(book);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //释放资源
                try {
                    rs.close();
                    smt.close();
                    con.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            return list;
        }
    }
    
    

    ​ 3.测试.........

    public class MyTest {
        @Test
        public void test(){
       		//创建对象
            List<Book> list = new JdbcDemo3().findAll();\
                //遍历
            for (Book book : list) {
                System.out.println(book);
            }
        }
    

    结果如图:

    image-20200513011553457

注册驱动的另外一种方式:

image-20200513003309000

工具类的使用 来简化代码 (抽取JDBC的工具类)

分析抽取的部分

  1. 注册驱动
  2. 抽取一个方法获取连接对象
  3. 抽取一个方法来释放资源
  • jdbc.properties

    url=jdbc:mysql://localhost:3306/javaweb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
     username=root
     password=zmc19
     driver=com.mysql.jdbc.Driver
    
  • 实体类

    //封装books表的javaBean
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Book {
        private int bookID;
        private String bookName;
        private int bookCounts;
        private String detail;
    
    
  • 工具类

    public class JDBCUtils {
       private static String url;
       private static String username;
       private static String password;
       private static String driver;
        /*
        期望:文件的读取,只需要读取一次就可以拿到这些值。使用静态代码块
        **/
        static{
            //1.读取资源文件,获取值   properties集合类来读取
            Properties pro = new Properties();
            try {
                //2.加载文件
                pro.load(new FileReader("D:\\Program Files\\JetBrains\\WorkSpasce\\IDEA\\JavaWeb\\JDBC-01\\src\\main\\resources\\jdbc.properties"));
                //3.获取数据
                url=pro.getProperty("url");
                username=pro.getProperty("username");
                password=pro.getProperty("password");
                driver=pro.getProperty("driver");
    
                //4.注册驱动
                Class.forName(driver);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        //1.抽取获取连接的方法 静态(方便调用)
        public  static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url,username,password);
        }
    
        //2.抽取释放资源的方法
        public static void close(Statement smt,Connection con) throws SQLException {
            if(smt!=null){
                smt.close();
            }
            if(con!=null){
                con.close();
            }
        }
    
        //方法的重载
        public static void close(ResultSet rs, Statement smt, Connection con) throws SQLException {
            if(smt!=null){
                smt.close();
            }
            if(con!=null){
                con.close();
            }
            if(rs!=null){
                rs.close();
            }
        }
    }
    
  • 调用类:

    public class JdbcDemo4 {
        private Connection con;
        private Statement smt;
        ResultSet rs;
        List<Book> list = new ArrayList<Book>();
        String sql="select * from books";
    
        public List<Book> findAll2() throws SQLException {
            try {
                    con = JDBCUtils.getConnection();
                    smt = con.createStatement();
                     rs = smt.executeQuery(sql);
                Book book = null;
                while (rs.next()){
                    //获取数据
                    int id = rs.getInt("bookID");
                    String name = rs.getString("bookName");
                    int counts = rs.getInt("bookCounts");
                    String detail = rs.getString("detail");
                        //创建对象
                    book = new Book();
                    book.setBookID(id);
                    book.setBookName(name);
                    book.setBookCounts(counts);
                    book.setDetail(detail);
                    //转载集合
                    list.add(book);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            JDBCUtils.close(rs,smt,con);
    
            return list;
        }
    }
    
    
  • 测试类:

      @Test
        public void test2() throws SQLException {
            List<Book> list = new JdbcDemo4().findAll2();
            for (Book book : list) {
                System.out.println(book);
            }
        }
    

    结果也一样:

    image-20200513020926787
posted on 2020-05-14 19:53  不羁的风啊  阅读(66)  评论(0)    收藏  举报