转自:
如何模拟编写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");
}
}