ORM這一塊一直用第三方框架,都忘記原生jdbc怎么寫了,花了幾個小時回憶整理一下。
引用jar:mysql-connector-java-5.0.5-bin.jar
創建公用私有變量
public static final String url = "jdbc:mysql://127.0.0.1/oneshop"; public static final String name = "com.mysql.jdbc.Driver"; public static final String user = "root"; public static final String password = "root"; public Connection conn = null; private PreparedStatement pst = null; private ResultSet rs;
構造函數實例化打開連接
public DB() throws ClassNotFoundException, SQLException { Class.forName(name);// 指定連接類型 if (conn == null) conn = DriverManager.getConnection(url, user, password);// 獲取連接 }
關閉連接
public void close() throws SQLException { if (conn != null) conn.close(); if (pst != null) pst.close(); if (rs != null) rs.close(); }
執行sql方法
public Boolean execute(String sql, String... params) { boolean bool = false; try { pst = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pst.setString((i + 1), params[i]); } bool = pst.execute(); this.close(); } catch (SQLException e) { e.printStackTrace(); } return bool; }
查詢返回一條數據
public Map<String, Object> get(String sql, String... params) throws SQLException { pst = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pst.setString((i + 1), params[i]); } rs = pst.executeQuery(); Map<String, Object> map = new HashMap<String, Object>(); ResultSetMetaData rsmd = pst.getMetaData(); int col = rsmd.getColumnCount(); while (rs.next()) { for (int i = 1; i < col; i++) { map.put(rsmd.getColumnName(i), rs.getObject(i)); } } this.close(); return map; }
查詢返回集合
public List<Map<String, Object>> List(String sql, String... params) throws SQLException { pst = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pst.setString((i + 1), params[i]); } rs = pst.executeQuery(); List<Map<String, Object>> rList = new ArrayList<Map<String, Object>>(); Map<String, Object> map; ResultSetMetaData rsmd = pst.getMetaData(); int col = rsmd.getColumnCount(); while (rs.next()) { map = new HashMap<String, Object>(); for (int i = 1; i < col; i++) { map.put(rsmd.getColumnName(i), rs.getObject(i)); } rList.add(map); } return rList; }
我們常用返回的是實體,而不是map,所以使用了JSONArray
不過這個需要引用很多jar
分別是:
json-lib-2.4-jdk15.jar
ezmorph-1.0.6.jar
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-codec-1.6.jar
commons-io-2.2.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
這么一大堆jar是個什么鬼?現在可是輕量級服務,怎么能有這么多,,本人表示很煩,決定后面有時間寫一個,不過這里就算了,以后再說吧(偷個懶....)
單個查詢
public <T> T getEntity(String sql, Class<T> t) throws SQLException { pst = conn.prepareStatement(sql); rs = pst.executeQuery(); Map<String, Object> map = get(sql); JSONArray jr = JSONArray.fromObject(map); @SuppressWarnings("unchecked") T result = (T) JSONArray.toCollection(jr, t); return result; }
查詢返回集合
public <T> List<T> getList(String sql, Class<T> t) throws SQLException { pst = conn.prepareStatement(sql); rs = pst.executeQuery(); List<Map<String, Object>> rList = List(sql); JSONArray jr = JSONArray.fromObject(rList); @SuppressWarnings("unchecked") List<T> resultList = (List<T>) JSONArray.toCollection(jr, t); return resultList; }
這樣寫返回實體有2個限制:
1.實體字段名必須與查詢返回的字段名一致,否則無法賦值。
2.只能查詢當前實體
果然還是只能自己寫一個,思路也大概有了:
1.給實體添加注解,通過反射找到實體字段名與數據庫對應字段名,從而解決第一個問題。
2.外鍵關聯的字段可以通過查詢的時候as 表名.列名 去解析賦值,解決第二個問題。
嗯,就是這樣。