第三章 自定义Mybatis 第2节 基于XML的自定义mybatis框架
2019-09-08
| 持久化 | 阅读 | 1.2k 字 | 5 分钟3.3 基于XML的自定义mybatis框架
3.3.1 编写持久层接口和IUserDao.xml
1 2 3 4 5 6 7 8 9 10 11 12
|
public interface IUserDao {
List<User> findAll(); }
|
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="UTF-8"?> <mapper namespace="com.itheima.dao.IUserDao"> <select id="findAll" resultType="com.itheima.domain.User"> select * from user </select> </mapper>
|
注意: 此处我们使用的也是mybatis的配置文件,所以也要把约束删除了
3.3.2 编写构建者类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public class SqlSessionFactoryBuilder {
public SqlSessionFactory build(InputStream in) { DefaultSqlSessionFactory factory = new DefaultSqlSessionFactory(); factory.setConfig(in); return factory; } }
|
3.3.3 编写SqlSessionFactory接口和实现类
1 2 3 4 5 6 7 8 9 10 11 12
|
public interface SqlSessionFactory {
SqlSession openSession(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class DefaultSqlSessionFactory implements SqlSessionFactory { private InputStream config = null; public void setConfig(InputStream config) { this.config = config; } @Override public SqlSession openSession() { DefaultSqlSession session = new DefaultSqlSession(); XMLConfigBuilder.loadConfiguration(session, config); return session; } }
|
3.3.4 编写SqlSession接口和实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public interface SqlSession {
<T> T getMapper(Class<T> daoClass);
void close(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
public class DefaultSqlSession implements SqlSession { private Configuration cfg; public void setCfg(Configuration cfg) { this.cfg = cfg; } private Connection conn; public Connection getConn() { try { conn = DataSourceUtil.getDataSource(cfg).getConnection(); return conn; } catch (Exception e) { throw new RuntimeException(e); } }
@Override public <T> T getMapper(Class<T> daoClass) { conn = getConn(); System.out.println(conn); T daoProxy = (T) Proxy.newProxyInstance(daoClass.getClassLoader(),new Class[] {daoClass}, new MapperProxyFactory(cfg.getMappers(),conn)); return daoProxy; } @Override public void close() { try { System.out.println(conn); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } public <E> List<E> selectList(String statement){ Mapper mapper = cfg.getMappers().get(statement); return new Executor().selectList(mapper,conn); } }
|
3.3.5 编写用于创建Dao接口代理对象的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
public class MapperProxyFactory implements InvocationHandler { private Map<String,Mapper> mappers; private Connection conn; public MapperProxyFactory(Map<String, Mapper> mappers,Connection conn) { this.mappers = mappers; this.conn = conn; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); String className = method.getDeclaringClass().getName(); String key = className+"."+methodName; Mapper mapper = mappers.get(key); if(mapper == null) { throw new IllegalArgumentException("传入的参数有误,无法获取执行的必要条件"); } Executor executor = new Executor();return executor.selectList(mapper, conn); } }
|
3.3.6 运行测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
public class MybatisTest { public static void main(String[] args)throws Exception { InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); SqlSession session = factory.openSession(); IUserDao userDao = session.getMapper(IUserDao.class); List<User> users = userDao.findAll(); for(User user : users) { System.out.println(user); } session.close(); in.close(); } }
|
本文标题:第三章 自定义Mybatis 第2节 基于XML的自定义mybatis框架
文章作者:foreverSFJ
发布时间:2019-09-08 18:32:51
最后更新:2019-09-08 18:32:51
原始链接:Notes/Java/Persistence/Mybatis/03_02 基于XML的自定义.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!
分享