JDBC的学习--尚硅谷

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC的学习--尚硅谷相关的知识,希望对你有一定的参考价值。

 

 

1.数据库的连接

 

 

[java] view plain copy
 
  1. /** 
  2.      * DriverManager 是驱动的管理类.  
  3.      * 1). 可以通过重载的 getConnection() 方法获取数据库连接. 较为方便 
  4.      * 2). 可以同时管理多个驱动程序: 若注册了多个数据库连接, 则调用 getConnection() 
  5.      * 方法时传入的参数不同, 即返回不同的数据库连接。  
  6.      * @throws Exception  
  7.      */  
  8.   
  9.   
  10.   
  11. @Test  
  12.     public void testGetConnection2() throws Exception{  
  13.         System.out.println(getConnection2());   
  14.     }  
  15.       
  16.     public Connection getConnection2() throws Exception{  
  17.         //1. 准备连接数据库的 4 个字符串.   
  18.         //1). 创建 Properties 对象  
  19.         Properties properties = new Properties();  
  20.           
  21.         //2). 获取 jdbc.properties 对应的输入流  
  22.         InputStream in =   
  23.                 this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");  
  24.           
  25.         //3). 加载 2) 对应的输入流  
  26.         properties.load(in);  
  27.           
  28.         //4). 具体决定 user, password 等4 个字符串.   
  29.         String user = properties.getProperty("user");  
  30.         String password = properties.getProperty("password");  
  31.         String jdbcUrl = properties.getProperty("jdbcUrl");  
  32.         String driver = properties.getProperty("driver");  
  33.           
  34.         //2. 加载数据库驱动程序(对应的 Driver 实现类中有注册驱动的静态代码块.)  
  35.         Class.forName(driver);  
  36.           
  37.         //3. 通过 DriverManager 的 getConnection() 方法获取数据库连接.   
  38.         return DriverManager.getConnection(jdbcUrl, user, password);  
  39.     }  

 

2.statement 和prepareStatement

 

 

[java] view plain copy
 
  1. @Test  
  2. public void testPreparedStatement() {  
  3.     Connection connection = null;  
  4.     PreparedStatement preparedStatement = null;  
  5.   
  6.     try {  
  7.         connection = JDBCTools.getConnection();  
  8.         String sql = "INSERT INTO customers (name, email, birth) "  
  9.                 + "VALUES(?,?,?)";  
  10.   
  11.         preparedStatement = connection.prepareStatement(sql);  
  12.         preparedStatement.setString(1, "ATGUIGU");  
  13.         preparedStatement.setString(2, "[email protected]");  
  14.         preparedStatement.setDate(3,  
  15.                 new Date(new java.util.Date().getTime()));  
  16.   
  17.         preparedStatement.executeUpdate();  
  18.     } catch (Exception e) {  
  19.         e.printStackTrace();  
  20.     } finally {  
  21.         JDBCTools.releaseDB(null, preparedStatement, connection);  
  22.     }  
  23. }  


 

 

[java] view plain copy
 
  1. /** 
  2.  * SQL 注入. 
  3.  */  
  4. @Test  
  5. public void testSQLInjection() {  
  6.     String username = "a‘ OR PASSWORD = ";  
  7.     String password = " OR ‘1‘=‘1";  
  8.   
  9.     String sql = "SELECT * FROM users WHERE username = ‘" + username  
  10.             + "‘ AND " + "password = ‘" + password + "‘";  
  11.   
  12.     System.out.println(sql);  
  13.   
  14.     Connection connection = null;  
  15.     Statement statement = null;  
  16.     ResultSet resultSet = null;  
  17.   
  18.     try {  
  19.         connection = JDBCTools.getConnection();  
  20.         statement = connection.createStatement();  
  21.         resultSet = statement.executeQuery(sql);  
  22.   
  23.         if (resultSet.next()) {  
  24.             System.out.println("登录成功!");  
  25.         } else {  
  26.             System.out.println("用户名和密码不匹配或用户名不存在. ");  
  27.         }  
  28.   
  29.     } catch (Exception e) {  
  30.         e.printStackTrace();  
  31.     } finally {  
  32.         JDBCTools.releaseDB(resultSet, statement, connection);  
  33.     }  
  34. }  

 

 

 

3.JDBCTools

 

 

[java] view plain copy
 
  1. package com.atguigu.jdbc;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.sql.Connection;  
  6. import java.sql.DriverManager;  
  7. import java.sql.PreparedStatement;  
  8. import java.sql.ResultSet;  
  9. import java.sql.SQLException;  
  10. import java.sql.Statement;  
  11. import java.util.Properties;  
  12.   
  13. public class JDBCTools {  
  14.   
  15.     /** 
  16.      * 执行 SQL 语句, 使用 PreparedStatement 
  17.      * @param sql 
  18.      * @param args: 填写 SQL 占位符的可变参数 
  19.      */  
  20.     public static void update(String sql, Object ... args){  
  21.         Connection connection = null;  
  22.         PreparedStatement preparedStatement = null;  
  23.           
  24.         try {  
  25.             connection = JDBCTools.getConnection();  
  26.             preparedStatement = connection.prepareStatement(sql);  
  27.               
  28.             for(int i = 0; i < args.length; i++){  
  29.                 preparedStatement.setObject(i + 1, args[i]);  
  30.             }  
  31.               
  32.             preparedStatement.executeUpdate();  
  33.               
  34.         } catch (Exception e) {  
  35.             e.printStackTrace();  
  36.         } finally{  
  37.             JDBCTools.releaseDB(null, preparedStatement, connection);  
  38.         }  
  39.     }  
  40.       
  41.     /** 
  42.      * 执行 SQL 的方法 
  43.      *  
  44.      * @param sql: insert, update 或 delete。 而不包含 select 
  45.      */  
  46.     public static void update(String sql) {  
  47.         Connection connection = null;  
  48.         Statement statement = null;  
  49.   
  50.         try {  
  51.             // 1. 获取数据库连接  
  52.             connection = getConnection();  
  53.   
  54.             // 2. 调用 Connection 对象的 createStatement() 方法获取 Statement 对象  
  55.             statement = connection.createStatement();  
  56.   
  57.             // 4. 发送 SQL 语句: 调用 Statement 对象的 executeUpdate(sql) 方法  
  58.             statement.executeUpdate(sql);  
  59.   
  60.         } catch (Exception e) {  
  61.             e.printStackTrace();  
  62.         } finally {  
  63.             // 5. 关闭数据库资源: 由里向外关闭.  
  64.             releaseDB(null, statement, connection);  
  65.         }  
  66.     }  
  67.   
  68.     /** 
  69.      * 释放数据库资源的方法 
  70.      *  
  71.      * @param resultSet 
  72.      * @param statement 
  73.      * @param connection 
  74.      */  
  75.     public static void releaseDB(ResultSet resultSet, Statement statement,  
  76.             Connection connection) {  
  77.   
  78.         if (resultSet != null) {  
  79.             try {  
  80.                 resultSet.close();  
  81.             } catch (SQLException e) {  
  82.                 e.printStackTrace();  
  83.             }  
  84.         }  
  85.   
  86.         if (statement != null) {  
  87.             try {  
  88.                 statement.close();  
  89.             } catch (SQLException e) {  
  90.                 e.printStackTrace();  
  91.             }  
  92.         }  
  93.   
  94.         if (connection != null) {  
  95.             try {  
  96.                 connection.close();  
  97.             } catch (SQLException e) {  
  98.                 e.printStackTrace();  
  99.             }  
  100.         }  
  101.   
  102.     }  
  103.   
  104.     /** 
  105.      * 获取数据库连接的方法 
  106.      */  
  107.     public static Connection getConnection() throws IOException,  
  108.             ClassNotFoundException, SQLException {  
  109.         // 0. 读取 jdbc.properties  
  110.         /** 
  111.          * 1). 属性文件对应 Java 中的 Properties 类 2). 可以使用类加载器加载 bin 目录(类路径下)的文件 
  112.          */  
  113.         Properties properties = new Properties();  
  114.         InputStream inStream = ReviewTest.class.getClassLoader()  
  115.                 .getResourceAsStream("jdbc.properties");  
  116.         properties.load(inStream);  
  117.   
  118.         // 1. 准备获取连接的 4 个字符串: user, password, jdbcUrl, driverClass  
  119.         String user = properties.getProperty("user");  
  120.         String password = properties.getProperty("password");  
  121.         String jdbcUrl = properties.getProperty("jdbcUrl");  
  122.         String driverClass = properties.getProperty("driverClass");  
  123.   
  124.         // 2. 加载驱动: Class.forName(driverClass)  
  125.         Class.forName(driverClass);  
  126.   
  127.         // 3. 调用  
  128.         // DriverManager.getConnection(jdbcUrl, user, password)  
  129.         // 获取数据库连接  
  130.         Connection connection = DriverManager.getConnection(jdbcUrl, user,  
  131.                 password);  
  132.         return connection;  
  133.     }  
  134.   
  135. }  


 

 

 

 

 

 

4.DAO

 

 

 

 

 

[java] view plain copy
 
  1. package com.atguigu.jdbc;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;  
  4. import java.sql.Connection;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.ResultSetMetaData;  
  8. import java.sql.SQLException;  
  9. import java.util.ArrayList;  
  10. import java.util.HashMap;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import org.apache.commons.beanutils.BeanUtils;  
  15.   
  16. public class DAO {  
  17.   
  18.     // INSERT, UPDATE, DELETE 操作都可以包含在其中  
  19.     public void update(String sql, Object... args) {  
  20.         Connection connection = null;  
  21.         PreparedStatement preparedStatement = null;  
  22.   
  23.         try {  
  24.             connection = JDBCTools.getConnection();  
  25.             preparedStatement = connection.prepareStatement(sql);  
  26.   
  27.             for (int i = 0; i < args.length; i++) {  
  28.                 preparedStatement.setObject(i + 1, args[i]);  
  29.             }  
  30.   
  31.             preparedStatement.executeUpdate();  
  32.         } catch (Exception e) {  
  33.             e.printStackTrace();  
  34.         } finally {  
  35.             JDBCTools.releaseDB(null, preparedStatement, connection);  
  36.         }  
  37.     }  
  38.   
  39.     // 查询一条记录, 返回对应的对象  
  40.     public <T> T get(Class<T> clazz, String sql, Object... args) {  
  41.         List<T> result = getForList(clazz, sql, args);  
  42.         if(result.size() > 0){  
  43.             return result.get(0);  
  44.         }  
  45.           
  46.         return null;  
  47.     }  
  48.   
  49.     /** 
  50.      * 传入 SQL 语句和 Class 对象, 返回 SQL 语句查询到的记录对应的 Class 类的对象的集合 
  51.      * @param clazz: 对象的类型 
  52.      * @param sql: SQL 语句 
  53.      * @param args: 填充 SQL 语句的占位符的可变参数.  
  54.      * @return 
  55.      */  
  56.     public <T> List<T> getForList(Class<T> clazz,   
  57.             String sql, Object... args) {  
  58.   
  59.         List<T> list = new ArrayList<>();  
  60.   
  61.         Connection connection = null;  
  62.         PreparedStatement preparedStatement = null;  
  63.         ResultSet resultSet = null;  
  64.   
  65.         try {  
  66.             //1. 得到结果集  
  67.             connection = JDBCTools.getConnection();  
  68.             preparedStatement = connection.prepareStatement(sql);  
  69.   
  70.             for (int i = 0; i < args.length; i++) {  
  71.                 preparedStatement.setObject(i + 1, args[i]);  
  72.             }  
  73.   
  74.             resultSet = preparedStatement.executeQuery();  
  75.               
  76.             //2. 处理结果集, 得到 Map 的 List, 其中一个 Map 对象  
  77.             //就是一条记录. Map 的 key 为 reusltSet 中列的别名, Map 的 value  
  78.             //为列的值.   
  79.             List<Map<String, Object>> values =   
  80.                     handleResultSetToMapList(resultSet);  
  81.               
  82.             //3. 把 Map 的 List 转为 clazz 对应的 List  
  83.             //其中 Map 的 key 即为 clazz 对应的对象的 propertyName,   
  84.             //而 Map 的 value 即为 clazz 对应的对象的 propertyValue  
  85.             list = transfterMapListToBeanList(clazz, values);  
  86.   
  87.         } catch (Exception e) {  
  88.             e.printStackTrace();  
  89.         } finally {  
  90.             JDBCTools.releaseDB(resultSet, preparedStatement, connection);  
  91.         }  
  92.   
  93.         return list;  
  94.     }  
  95.   
  96.     public <T> List<T> transfterMapListToBeanList(Class<T> clazz,  
  97.             List<Map<String, Object>> values) throws InstantiationException,  
  98.             IllegalAccessException, InvocationTargetException {  
  99.   
  100.         List<T> result = new ArrayList<>();  
  101.   
  102.         T bean = null;  
  103.   
  104.         if (values.size() > 0) {  
  105.             for (Map<String, Object> m : values) {  
  106.                 bean = clazz.newInstance();  
  107.                 for (Map.Entry<String, Object> entry : m.entrySet()) {  
  108.                     String propertyName = entry.getKey();  
  109.                     Object value = entry.getValue();  
  110.   
  111.                     BeanUtils.setProperty(bean, propertyName, value);  
  112.                 }  
  113.                 // 13. 把 Object 对象放入到 list 中.  
  114.                 result.add(bean);  
  115.             }  
  116.         }  
  117.   
  118.         return result;  
  119.     }  
  120.   
  121.     /** 
  122.      * 处理结果集, 得到 Map 的一个 List, 其中一个 Map 对象对应一条记录 
  123.      *  
  124.      * @param resultSet 
  125.      * @return 
  126.      * @throws SQLException 
  127.      */  
  128.     public List<Map<String, Object>> handleResultSetToMapList(  
  129.             ResultSet resultSet) throws SQLException {  
  130.         // 5. 准备一个 List<Map<String, Object>>:  
  131.         // 键: 存放列的别名, 值: 存放列的值. 其中一个 Map 对象对应着一条记录  
  132.         List<Map<String, Object>> values = new ArrayList<>();  
  133.   
  134.         List<String> columnLabels = getColumnLabels(resultSet);  
  135.         Map<String, Object> map = null;  
  136.   
  137.         // 7. 处理 ResultSet, 使用 while 循环  
  138.         while (resultSet.next()) {  
  139.             map = new HashMap<>();  
  140.   
  141.             for (String columnLabel : columnLabels) {  
  142.                 Object value = resultSet.getObject(columnLabel);  
  143.                 map.put(columnLabel, value);  
  144.             }  
  145.   
  146.             // 11. 把一条记录的一个 Map 对象放入 5 准备的 List 中  
  147.             values.add(map);  
  148.         }  
  149.         return values;  
  150.     }  
  151.   
  152.     /** 
  153.      * 获取结果集的 ColumnLabel 对应的 List 
  154.      *  
  155.      * @param rs 
  156.      * @return 
  157.      * @throws SQLException 
  158.      */  
  159.     private List<String> getColumnLabels(ResultSet rs) throws SQLException {  
  160.         List<String> labels = new ArrayList<>();  
  161.   
  162.         ResultSetMetaData rsmd = rs.getMetaData();  
  163.         for (int i = 0; i < rsmd.getColumnCount(); i++) {  
  164.             labels.add(rsmd.getColumnLabel(i + 1));  
  165.         }  
  166.   
  167.         return labels;  
  168.     }  
  169.   
  170.     // 返回某条记录的某一个字段的值 或 一个统计的值(一共有多少条记录等.)  
  171.     public <E> E getForValue(String sql, Object... args) {  
  172.           
  173.         //1. 得到结果集: 该结果集应该只有一行, 且只有一列  
  174.         Connection connection = null;  
  175.         PreparedStatement preparedStatement = null;  
  176.         ResultSet resultSet = null;  
  177.   
  178.         try {  
  179.             //1. 得到结果集  
  180.             connection = JDBCTools.getConnection();  
  181.             preparedStatement = connection.prepareStatement(sql);  
  182.   
  183.             for (int i = 0; i < args.length; i++) {  
  184.                 preparedStatement.setObject(i + 1, args[i]);  
  185.             }  
  186.   
  187.             resultSet = preparedStatement.executeQuery();  
  188.               
  189.             if(resultSet.next()){  
  190.                 return (E) resultSet.getObject(1);  
  191.             }  
  192.         } catch(Exception ex){  
  193.             ex.printStackTrace();  
  194.         } finally{  
  195.             JDBCTools.releaseDB(resultSet, preparedStatement, connection);  
  196.         }  
  197.         //2. 取得结果  
  198.           
  199.         return null;  
  200.     }  
  201.   
  202. }  


 

5.事务和事务的隔离级别

 

 

[java] view plain copy
 
  1. package com.atguigu.jdbc;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.   
  8. import org.junit.Test;  
  9.   
  10. public class TransactionTest {  
  11.   
  12.     /** 
  13.      * 测试事务的隔离级别 在 JDBC 程序中可以通过 Connection 的 setTransactionIsolation 来设置事务的隔离级别. 
  14.      */  
  15.     @Test  
  16.     public void testTransactionIsolationUpdate() {  
  17.           
  18.         Connection connection = null;  
  19.   
  20.         try {  
  21.             connection = JDBCTools.getConnection();  
  22.             connection.setAutoCommit(false);  
  23.               
  24.             String sql = "UPDATE users SET balance = "  
  25.                     + "balance - 500 WHERE id = 1";  
  26.             update(connection, sql);  
  27.               
  28.             connection.commit();  
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.         } finally {  
  32.   
  33.         }  
  34.     }  
  35.       
  36.     @Test  
  37.     public void testTransactionIsolationRead() {  
  38.         String sql = "SELECT balance FROM users WHERE id = 1";  
  39.         Integer balance = getForValue(sql);  
  40.         System.out.println(balance);   
  41.     }  
  42.   
  43.     // 返回某条记录的某一个字段的值 或 一个统计的值(一共有多少条记录等.)  
  44.     public <E> E getForValue(String sql, Object... args) {  
  45.   
  46.         // 1. 得到结果集: 该结果集应该只有一行, 且只有一列  
  47.         Connection connection = null;  
  48.         PreparedStatement preparedStatement = null;  
  49.         ResultSet resultSet = null;  
  50.   
  51.         try {  
  52.             // 1. 得到结果集  
  53.             connection = JDBCTools.getConnection();  
  54.             System.out.println(connection.getTransactionIsolation());   
  55.               
  56. //          connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);  
  57.             connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  
  58.               
  59.             preparedStatement = connection.prepareStatement(sql);  
  60.   
  61.             for (int i = 0; i < args.length; i++) {  
  62.                 preparedStatement.setObject(i + 1, args[i]);  
  63.             }  
  64.   
  65.             resultSet = preparedStatement.executeQuery();  
  66.   
  67.             if (resultSet.next()) {  
  68.                 return (E) resultSet.getObject(1);  
  69.             }  
  70.         } catch (Exception ex) {  
  71.             ex.printStackTrace();  
  72.         } finally {  
  73.             JDBCTools.releaseDB(resultSet, preparedStatement, connection);  
  74.         }  
  75.         // 2. 取得结果  
  76.   
  77.         return null;  
  78. 以上是关于JDBC的学习--尚硅谷的主要内容,如果未能解决你的问题,请参考以下文章

    尚硅谷Spring学习笔记-- JdbcTemplate

    尚硅谷Redis学习笔记-- Redis数据类型

    尚硅谷全套课件整理:Java前端大数据安卓面试题

    尚硅谷MySQL从新手到老手(适合MySQL萌新零基础人员学习)2018高清完整资源

    2020年最新 尚硅谷大数据技术之MySQL高级,百度云网盘学习网课资料

    尚硅谷设计模式学习---[设计模式七大原则]