(Java DataBase Connectivity)
JDBC是定義了一套數據庫的接口,他能夠用統一的一套Java代碼來操做數據庫html
咱們須要知道如下步驟:mysql
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++
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; } }
解決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; } }
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); } }
url=jdbc:mysql://localhost:3308/testuser=root password=mysql driver=com.mysql.jdbc.DriverJDBC Template(數據庫鏈接池)(Druid)
使用Druid+配置文件替代JDBC工具類數據庫
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=3000Spring JDBC
Spring JDBC是簡化了對類的封裝,簡化了不少沒必要要的操做,就是Druid+配置文件+Spring JDBC完成對數據庫的簡單封裝。
經過建立JdbcTemplate對象。依賴於DataSource 鏈接池:{ JdbcTemplate template = new JdbcTemplate(ds);}app
Spring提供的JDBC簡單封裝ide
有幾個好處:
簡化語句,封裝程度更搞!
能夠將查詢結果封裝爲指定的對象。
須要注意的是:
須要提早配置好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); } }