前言:
最近研究了一下Mybatis的底层代码,写了一个操作数据库的小工具,实现了Mybatis的部分功能:
1.SQL语句在mapper.xml中配置。
2.支持int,String,自定义数据类型的入参。
3.根据mapper.xml动态创建接口的代理实现对象。
功能有限,目的是搞清楚MyBatis框架的底层思想,多学习研究优秀框架的实现思路,对提升自己的编码能力大有裨益。
小工具使用到的核心技术点:xml解析+反射+jdk动态代理
接下来,一步一步来实现。
首先来说为什么要使用jdk动态代理。
传统的开发方式:
1.接口定义业务方法。
2.实现类实现业务方法。
3.实例化实现类对象来完成业务操作。
接口:
public interface UserDAO {
public User get(int id);
}
实现类:
public class UserDAOImpl implements UserDAO{
@Override
public User get(int id) {
Connection conn = JDBCTools.getConnection();
String sql = "select * from user where id = ?";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
if(rs.next()){
int sid = rs.getInt(1);
String name = rs.getString(2);
User user = new User(sid,name);
return user;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCTools.release(conn, pstmt, rs);
}
return null;
}
}
测试:
public static void main(String[] args) {
UserDAO userDAO = new UserDAOImpl();
User user = userDAO.get(1);
System.out.println(user);
}
Mybatis的方式: