自己动手写一个持久层框架 (5)

获取SQL语句
我们mapper.xml的SQL语句是这样的select * from user where id = #{id} and username = #{username},需要转换为select * from user where id = ? and username =? 这样JDBC才能认。同时我们需要把#{}中的参数赋值到?这个占位符处。
这里我们定义了一个getBoundSql方法,通过标记处理类(配置标记解析器来完成对占位符的处理工作)解析成带有?的sql,同时把#{}里面的内容传入ParameterMapping中。

通过connection.prepareStatement(boundSql.getSqlText())得到预处理对象

设置参数,我们在mapper.xml文件中已经写了paramterType,有了入参类型的全路径我们可以通过反射获取其对象。
根据ParameterMapping中存入的的#{}中的内容,通过反射获取其值,然后与下标绑定。

执行SQL

封装返回结果集 这里使用内省

返回(List<E>) objects

7.结束

此时我们框架中的代码已经写完了。

8.测试类 package com.dxh.test; import com.dxh.io.Resource; import com.dxh.pojo.User; import com.dxh.sqlSession.SqlSession; import com.dxh.sqlSession.SqlSessionFacetory; import com.dxh.sqlSession.SqlSessionFacetoryBuild; import org.dom4j.DocumentException; import org.junit.Test; import java.beans.PropertyVetoException; import java.io.InputStream; import java.util.List; public class IPersistenceTest { @Test public void test() throws Exception { InputStream resourceAsStream = Resource.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFacetory sqlSessionFacetory = new SqlSessionFacetoryBuild().build(resourceAsStream); SqlSession sqlSession = sqlSessionFacetory.openSession(); User user = new User(); user.setId(1); user.setUsername("lucy"); User user2 = sqlSession.selectOne("user.selectOne",user); System.out.println(user2.toString()); // List<User> userList = sqlSession.selectList("user.selectList"); // for (User user1 : userList) { // System.out.println(user1); // } } }

执行结果:

User{id=1, username='lucy'} 最终的目录结构:

image-20201108015103475

5. 自定义持久层框架的优化 优化:

我们的自定义持久层框架已经完成了,下面我们分析下这个框架,看看还有没有明显的弊端。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjfwx.html