如何模拟编写MyBatis之DataSource与Session呢?
下文笔者讲述mybatis之模拟DateSource和Session的方法分享,如下所示
DataSource和Session简介
DataSource: 实现标准的javax.sql.DataSource接口,用于获取数据库连接 Session: 可以直接调用exec(sql)来执行sql语句(在DataSource指定的数据库中操作)
DataSource创建
public class VDataSource implements DataSource { private String url; private String user; private String password; // 构架函数,创建时尝试加载数据库驱动类 public VDataSource(String driverClassName, String url, String user, String password) throws ClassNotFoundException { Class.forName(driverClassName); this.url = url; this.user = user; this.password = password; } // 使用自带的java.sql.DriverManager,代入数据库信息取出一个连接 @Override public Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } }
Session
public interface Session { void exec(String sql) throws SQLException; } 新建一个VSession类实现这个接口 public class VSession implements Session { private DataSource dataSource; private Connection conn; public VSession(DataSource dataSource) { this.dataSource = dataSource; } // 若还Session新建后未连接过,从dataSource中获取一个 public Connection getConnection() throws SQLException { if (conn == null) { conn = dataSource.getConnection(); } return conn; } @Override public void exec(String sql) throws SQLException { Statement stmt = null; ResultSet rs = null; try { // 从连接中创建一个statement stmt = getConnection().createStatement(); // statement执行一句sql查询 rs = stmt.executeQuery(sql); // 结果的元数据,包括别名、列名、类型等 ResultSetMetaData rsmd = rs.getMetaData(); // 将所有结果输出 if (rs.next()) { for (int i=1; i<=rsmd.getColumnCount(); i++) { System.out.println(rsmd.getColumnLabel(i)+"="+rs.getObject(i)); } System.out.println(); } } finally { if (rs != null) rs.close(); if (stmt != null) stmt.close(); } } }测试代码
public class MyTest { private static String driverClassName = "com.mysql.jdbc.Driver"; // 数据库可改为自己需要的地址 private static String url = "jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf8"; public static void main(String args[]) throws Exception { // 创建VDataSource DataSource data = new VDataSource(driverClassName, url, "root", "123456"); // 创建Session Session session = new VSession(data); // 执行查询sql session.exec("select * from users where id=1"); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。