【JavaSE】JDBC封裝(JDBC+Druid+Template)


文章目錄


(Java DataBase Connectivity)
JDBC是定義了一套數據庫的接口,他能夠用統一的一套Java代碼來操做數據庫html

  • JDBC怎麼操做它?裏面有幾個經常使用的方法,
    • 第一個是鏈接方法,還有的就是關閉方法,鏈接方法包括了加載驅動,創建鏈接,建立載體,
    • 關閉方法又包括了關閉返回集合,關閉載體,關閉鏈接
    • 查詢語句,獲得一條sql語句,而後咱們能夠對他進行查詢。返回一個array list集合。(其中咱們有用到result set meta data進行封裝結果集)
    • 最後咱們就能夠獲得這個集合,再封裝成array list集合返回給調用的函數。
    • 還有一個就是update。方法update方法是對數據庫進行一個更新的操做,也就是修改

咱們須要知道如下步驟:mysql

  1. Class.forName(「com.mysql.jdbc.Driver」);
  2. Connection conn = DriverManager.getConnection(「jdbc:mysql://localhost:3306/數據庫名」, 「數據庫用戶名」, 「數據庫密碼」);
  3. String sql = 「update 表名 set 字段 = 字段值 where id = 1」;
  4. Statement stmt = Connection對象.createStatement();
  5. int count = Statement對象.executeUpdate(sql);
  6. Statement對象.close();/Connection對象.close();釋放資源
JDBC工具類
public class JDBCTools {
    private String url = "jdbc:mysql://localhost:3308/hzyc98";
    private String username = "root";
    private String userpassword = "mysql";
    private Connection conn;
    private Statement stmt;
    private ResultSet reSet;

    //鏈接的封裝方法
    private void connect() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url, username, userpassword);
            stmt = conn.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 	

    /**
     * 操做查詢語句,查詢到該表以後返回一個集合
     * 返回一個類型爲:ArrayList<Map>的集合
     * 一條List表明着一行語句,這一行語句由Map,也就是表頭和內容所組成
     *
     * @param sql 一條SQL語句,(select語句)
     */
    public ArrayList<Map<String, String>> query(String sql) {
        ArrayList<Map<String, String>> rsList = null;
        try {
            rsList = new ArrayList<Map<String, String>>();
            connect();
            reSet = stmt.executeQuery(sql);
            //獲取結果集
            ResultSetMetaData rsmd = reSet.getMetaData();
            //一個reSet就是火車列表的一行數據。
            while (reSet.next()) {
                Map<String, String> reSetMap = new HashMap<String, String>();

                for (int c = 1; c <= rsmd.getColumnCount(); c++) {
                    String columeName = rsmd.getColumnName(c);
                    String value = reSet.getString(columeName);
                    reSetMap.put(columeName, value);
                }
                rsList.add(reSetMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return rsList;
    }
    
    //更新數據庫,使用stmt載體
    public void update(String sql) {
        try {
            connect();
            stmt.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close();
        }
    }}

這種方法比較萬能,不是將他封裝成一個固定的對象,而是將他封裝成爲一個萬能的集合。c++

JDBC的練習:從數據庫中查詢用戶

public class 練習{    public static void main(String[] args) {
        List<User> list = new JDBCutil().findAll();
        System.out.println(list);
    }    public List<User> findAll() {
        String sql = "select * from user";
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<User> list = null;
        try {
            conn = JDBCUtils.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            User u;
            list = new ArrayList<>();
            while (rs.next()) {
                u = new User();
                u.setId(rs.getString("id"));
                u.setUname(rs.getString("username"));
                u.setPwd(rs.getString("password"));
                list.add(u);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs,stmt,conn);
        }        return list;
    }
}

練習二:PreparedStatement

解決sql注入問題spring

引入PreparedStatement
set設置參數 使得sql執行的效率更高。sql

public class JDBCutil {    public static void main(String[] args) throws SQLException {
        List<User> list = new JDBCutil().findAll("23");
        System.out.println(list);
    }    public List<User> findAll(String id) throws SQLException {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<User> list = null;
        PreparedStatement pstmt;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select * from user where id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);//            stmt = conn.createStatement();
            rs = pstmt.executeQuery();
            User u;
            list = new ArrayList<>();
            while (rs.next()) {
                u = new User();
                u.setId(rs.getString("id"));
                u.setUname(rs.getString("username"));
                u.setPwd(rs.getString("password"));
                list.add(u);
            }
            System.out.println(list);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, conn);
        }        return list;
    }
}

JDBC工具類(放置更多操做給外部)

public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String dirver;

    /*
     * 靜態代碼塊用來加載jdbc中的配置文件
     * */
    static {
        try {//          Properties集合類
            Properties pro = new Properties();

            //獲取src路徑下的文件的方式--->ClassLoader 類加載器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();

            pro.load(new FileReader(path));
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            dirver = pro.getProperty("driver");
            Class.forName(dirver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }    /**
     * 釋放資源
     *
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt, Connection conn) {        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }    /**
     * 釋放資源
     *
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }    /**
     * 獲取鏈接
     *
     * @return 鏈接對象
     */
    public static Connection getConnection() throws SQLException {        return DriverManager.getConnection(url, user, password);
    }
}

JDBC配置文件

url=jdbc:mysql://localhost:3308/testuser=root
password=mysql
driver=com.mysql.jdbc.Driver

JDBC Template(數據庫鏈接池)(Druid)

使用Druid+配置文件替代JDBC工具類數據庫

JDBCUtils (Druid)

public class JDBCUtils {
    private static DataSource ds;

    static {
        try {            //1.加載配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.獲取DataSource(獲取鏈接池對象)
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    /**
     * 獲取鏈接
     */
    public static Connection getConnection() throws SQLException {        return ds.getConnection();
    }    /**
     * 釋放資源
     */
    public static void close(PreparedStatement stmt, Connection conn) {        close(null, stmt, conn);
    }    public static void close(ResultSet rs, PreparedStatement stmt, Connection conn) {        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }        if (conn != null) {
            try {
                conn.close();//歸還鏈接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }    /**
     * 獲取鏈接池方法
     */
    public static DataSource getDataSource() {        return ds;
    }
}

配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3308/testuser=root
password=mysql#初始個數initialSize=5maxActive=10maxWait=3000

Spring JDBC

Spring JDBC是簡化了對類的封裝,簡化了不少沒必要要的操做,就是Druid+配置文件+Spring JDBC完成對數據庫的簡單封裝。
經過建立JdbcTemplate對象。依賴於DataSource 鏈接池:{ JdbcTemplate template = new JdbcTemplate(ds);}app

Spring提供的JDBC簡單封裝ide

  • 使用的方法 :
    • update():執行DML語句。增、刪、改語句
    • queryForMap():查詢結果將結果集封裝爲map集合,將列名做爲key,將值做爲value 將這條記錄封裝爲一個map集合
    • queryForList():查詢結果將結果集封裝爲list集合
    • query():查詢結果,將結果封裝爲JavaBean對象
    • queryForObject:查詢結果,將結果封裝爲對象

有幾個好處:
簡化語句,封裝程度更搞!
能夠將查詢結果封裝爲指定的對象。
須要注意的是:
須要提早配置好JDK,通常這個Spring JDBC只能在Java1.8以上使用,不然會報錯:org/springframework/boot/SpringApplication : Unsupported major.minor version 52.0函數

public class template {
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    public void updatePwd(String id, String newPwd) {
        String sql = "update user set password = ? where id = ?";
        int count = template.update(sql, id, newPwd);
        System.out.println(count);
    }    public void insert() {
        String sql = "insert into user(username,password) values (?,?)";
        int count = template.update(sql, "23", "2323");
        System.out.println(count);
    }    public void delete(String id) {
        String sql = "delete from user where id = ?";
        int count = template.update(sql, id);
        System.out.println(count);
    }    public void queryForMap() {
        String sql = "select * from user where id = ? or id = ?";
        Map<String, Object> map = template.queryForMap(sql, "10", "12");
        System.out.println(map);
    }    public List<Map<String, Object>> queryForList() {
        String sql = "select * from user";
        List<Map<String, Object>> list = template.queryForList(sql);//        for (MapstringObjectMap : list) {//            System.out.println(stringObjectMap);//        }
        return list;
    }    public List<User> queryForList_User(){
        String sql = "select * from user";
        List<User> list = template.query(sql, new RowMapper<User>() {            public User mapRow(ResultSet rs, int i) throws SQLException {                User user = new User();
                user.setId(rs.getString("id"));
                user.setUname(rs.getString("username"));
                user.setPwd(rs.getString("password"));

                return user;
            }
        });//        for (User ele : list) {//            System.out.println(ele);//        }
        return list;
    }    public List<User> queryForList_User_2(){
        String sql = "select * from user";
        List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class));//        for (User ele : list) {//            System.out.println(ele);//        }
        return list;
    }    public void checkCount(){
        String sql = "select count(*) from user";
        Long total = template.queryForObject(sql, Long.class);
        System.out.println(total);
    }

}
相關文章
相關標籤/搜索