如何模拟编写MyBatis之DataSource与Session呢?
迪丽瓦拉
2024-03-07 19:07:54
0

转自:

如何模拟编写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,代入数据库信息取出一个连接@Overridepublic 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;}@Overridepublic void exec(String sql) throws SQLException {Statement stmt = null;ResultSet rs = null;try {// 从连接中创建一个statementstmt = 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 {// 创建VDataSourceDataSource data = new VDataSource(driverClassName, url, "root", "123456");// 创建SessionSession session = new VSession(data);// 执行查询sqlsession.exec("select * from users where id=1");}
}

相关内容