一、简易封装JDBC工具类:
package com.jackie.MyBatis.main; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbcHelper { private static Connection conn = null; static { try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"; String user = "jackie"; String pass = "123456"; conn = DriverManager.getConnection(url, user, pass); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } private void close(ResultSet rs, Statement stmt, Connection conn) { try { if(rs != null && !rs.isClosed()) { rs.close(); } if(stmt != null && !stmt.isClosed()) { stmt.close(); } if(conn != null && !conn.isClosed()) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } public Role getRole(int id) { PreparedStatement ps = null; ResultSet rs = null; try { String sql = "select * from role where id=?"; ps = conn.prepareStatement(sql); ps.setInt(1, id); // 注意从1开始计数 rs = ps.executeQuery(); Role role = null; while(rs.next()) { int roleId = rs.getInt("id"); String name = rs.getString("name"); role = new Role(roleId, name); } return role; } catch (SQLException e) { e.printStackTrace(); return null; } finally { this.close(rs, ps, conn); } } }
实体类Role:
package com.jackie.MyBatis.main; public class Role { private int id; private String name; public Role(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "[" + id + "," + name + "]"; } // getter and setter omitted }
使用:
public class Test { public static void main(String[] args) { JdbcHelper helper = new JdbcHelper(); System.out.println(helper.getRole(1)); } }
二、三层架构:
配置数据源 context.xml(也可以使用一些第三方的数据源库,如 c3p0):
<?xml version="1.0" encoding="UTF-8"?> <context> <resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jackie" password="123456" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8" /> </context>
Dao层:
BaseDao:
package com.jackie.MyBatis.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class BaseDao { /** * 查找JNDI,获得数据源对象,再获得数据库连接对象 */ private Connection getConnection() { Connection conn = null; Context ctx = null; try { ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql"); conn = ds.getConnection(); } catch (NamingException | SQLException e) { e.printStackTrace(); } if(conn == null) { System.err.println("无法建立数据库连接"); } return conn; } private void closeAll(Connection conn, Statement stmt, ResultSet rs) { try { if(rs != null & !rs.isClosed()) { rs.close(); } if(stmt != null & !stmt.isClosed()) { stmt.close(); } if(conn != null & !conn.isClosed()) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } private void closeAll(Connection conn, Statement stmt) { closeAll(conn, stmt, null); } public int executeUpdate(String sql, Object... params) { int result = 0; Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection(); if(conn != null && !conn.isClosed()) { pstmt = conn.prepareStatement(sql); if(params != null) { for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } } result = pstmt.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } finally { closeAll(conn, pstmt); } return result; } public Object executeQuery(RSProcessor processor, String sql, Object... params ) { Object result = null; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); if(conn != null && !conn.isClosed()) { pstmt = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } rs = pstmt.executeQuery(); result = processor.process(rs); } } catch (SQLException e) { e.printStackTrace(); } finally { closeAll(conn, pstmt, rs); } return result; } }
RSProcessor:
package com.jackie.MyBatis.dao; import java.sql.ResultSet; import java.sql.SQLException; /** * 用于将Result对象指向的数据,转换成想要的对象 */ public interface RSProcessor { Object process(ResultSet rs) throws SQLException; }
数据Dao —— UserDao:
package com.jackie.MyBatis.dao; import java.util.List; import com.jackie.MyBatis.domain.User; public interface UserDao { List<User> getAllUsers(); User getUserByName(String userName); int addUser(User user); }