当前位置: 首页 > wzjs >正文

网站布局方法随州论坛

网站布局方法,随州论坛,斐讯路由器做网站映射,深圳做网站的公司的区域学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS 文章目录 1.问题2. 解决思路分析3. 生成代理对象 1.问题 上一章框架使用端在测试类中使用框架查询数据库的代码如下: public class IpersistentTest {Testpublic void test1() throws …

学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS

文章目录

  • 1.问题
  • 2. 解决思路分析
  • 3. 生成代理对象

1.问题

上一章框架使用端在测试类中使用框架查询数据库的代码如下:

public class IpersistentTest {@Testpublic void test1() throws Exception {InputStream resource = Resources.getResource("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);// 创建SqlSession,过程中创建了executor,executor用于执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();User user = new User();user.setId(1);user.setUsername("xiaoming");Object o = sqlSession.selectOne("user.selectOne", user);System.out.println("selectOne返回结果:" + o.toString());List<Object> users = sqlSession.selectList("user.selectList", null);System.out.println("selectLit返回结果:" + users.toString());sqlSession.close();}
}

不过这是在测试类中执行的,如果要在项目中实际使用,需要定义UserDao 接口并实现,将上述操作封装进实现类方法中。如下:
接口

public interface UserDao {List<User> findAll() throws Exception;User findByCondition(User user) throws Exception;
}

实现类


public class UserDaoImpl implements UserDao {@Overridepublic List<User> findAll() throws Exception {InputStream resource = Resources.getResource("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);// 创建SqlSession,过程中创建了executor,executor用于执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();List<User> users = sqlSession.selectList("user.selectList", null);sqlSession.close();return users;}@Overridepublic User findByCondition(User user) throws Exception {InputStream resource = Resources.getResource("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);// 创建SqlSession,过程中创建了executor,executor用于执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();User res= sqlSession.selectOne("user.selectOne", user);sqlSession.close();return res;}
}

可以很明显这种方式查询数据库存在的3个问题:
1. 实现类中存在重复代码。包括:加载配置文件,创建会话,关闭会话。
2. selectOne和selectList参数statmentId存在硬编码问题。如果配置文件中改了,代码也要改。
3. 对于每一个表,都需要一个dao。每个dao都需要也给实现类,显然这是比较麻烦的。这一点视频中没有提到,但我觉得是很重要的一个问题。

2. 解决思路分析

  1. 第1个问题比较好解决,因为我们可以使用单例模式保证执行一次后生成的sqlSessionFactory 对象,可以复用 。而且项目大概率会集成spring,所以加载配置文件,执行一次就可以了。
  2. 第2 个问题我们想到可以通过将mapper.xml中的namespace和select标签id 与类全路径和方法名进行绑定(这是非常关键的一点,有一种依赖导致的感觉!!之前是xml里配置什么,我们写代码时候就要传什么,现在是代码写什么,xml里就配置什么)。即xml中的namespace为dao接口的全路径,select标签id 为方法名。这样再调用方法的时候,就能根据类和方法名拼接出statmentId,委托给excutor执行。
  3. 解决了1和2,就会发现我们不需要dao接口的实现类了。只需要创建一个接口的代理对象即可。代理对象去执行真正的操作。同时,就解决了问题3。

3. 生成代理对象

生成代理的对象具体执行逻辑也有2个小问题:

  1. 怎么知道是调哪种SQL类型的方法?如select ? update? delete等
    这个可以在解析xml加下标签类型,比如是select标签,那就是调用selectOne或者selectList。
  2. 怎么知道是调用selectOne还是selectList,如果选择的不对,返回值就会和方法的返回值类型不一致而报错。
    这个可以根据调用方法的返回值确定。获取方法的返回值类型,如果返回值类型是个泛型。如List 、List、Map<String,String>等,那就是 selectList,否则selectOne。

最终核心代码如下:

public class DefaultSqlSession implements SqlSession {//......@Overridepublic <T> T getMapper(Class<?> mapperClass) {Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{mapperClass}, new InvocationHandler() {/*** porxy代理对象的引用,* method被代理对象的方法* objects*/@Overridepublic Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {// 具体的逻辑:执行JDBCString methodName = method.getName();//接口中的全路径要和namespace的值一致String className = method.getDeclaringClass().getName();String statementId = className + "." + methodName;MappedStatement mappedStatement = configuration.getMappedStatementMap().get(statementId);String sqlCommandType = mappedStatement.getSqlCommandType();if ("select".equals(sqlCommandType)) {Type genericReturnType = method.getGenericReturnType();// 通过判断方法的返回值是否为泛型,决定调用selectOne或者selectListif (genericReturnType instanceof ParameterizedType) {return selectList(statementId, objects == null ? null : objects[0]);}return selectOne(statementId, objects == null ? null : objects[0]);} else {return null;}}});return (T) o;}
}
public class IpersistentTest {@Testpublic void test1() throws Exception {InputStream resource = Resources.getResource("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);// 创建SqlSession,过程中创建了executor,executor用于执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();User user = new User();user.setId(1);user.setUsername("xiaoming");Object o = sqlSession.selectOne("user.selectOne", user);System.out.println("selectOne返回结果:" + o.toString());List<Object> users = sqlSession.selectList("user.selectList", null);System.out.println("selectLit返回结果:" + users.toString());sqlSession.close();}// 使用代理类的方式调用@Testpublic void test2() throws Exception {InputStream resource = Resources.getResource("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);// 创建SqlSession,过程中创建了executor,executor用于执行sql语句SqlSession sqlSession = sqlSessionFactory.openSession();UserDao userDaoProxy = sqlSession.getMapper(UserDao.class);List<User> all = userDaoProxy.findAll();System.out.println("findAll返回结果:" + all.toString());User user = new User();user.setId(1);user.setUsername("xiaoming");User use1 = userDaoProxy.findByCondition(user);System.out.println("findByCondition返回结果:" + use1.toString());}
}

可以看到结果也可以正确返回了
在这里插入图片描述


文章转载自:

http://kMfOFLwR.qbwtb.cn
http://tvSNa5U6.qbwtb.cn
http://HQYIoD0D.qbwtb.cn
http://gvSSCqJo.qbwtb.cn
http://oXzWkCfp.qbwtb.cn
http://shjPjefa.qbwtb.cn
http://YupCwOEe.qbwtb.cn
http://CFEaHCjK.qbwtb.cn
http://JQVRVddd.qbwtb.cn
http://HXClAo9W.qbwtb.cn
http://ogoCDUgj.qbwtb.cn
http://RhtYXX0e.qbwtb.cn
http://XKSkDFow.qbwtb.cn
http://bCGbdTaR.qbwtb.cn
http://Frp1TcFM.qbwtb.cn
http://qfZP9DwD.qbwtb.cn
http://LdUARbQ8.qbwtb.cn
http://WcXtQCgC.qbwtb.cn
http://aVt4GwBO.qbwtb.cn
http://Iph0Ny4I.qbwtb.cn
http://BPGbw8Ij.qbwtb.cn
http://U3I1nBFl.qbwtb.cn
http://9fEPKzaJ.qbwtb.cn
http://vbVa0iJ9.qbwtb.cn
http://PN0PVRdf.qbwtb.cn
http://NaDPAeZa.qbwtb.cn
http://GVyHOILd.qbwtb.cn
http://Mp8lQmEu.qbwtb.cn
http://0GiQNKHF.qbwtb.cn
http://r7dIPh7d.qbwtb.cn
http://www.dtcms.com/wzjs/766108.html

相关文章:

  • 郑州威盟网站建设公司怎么样做网站 不是计算机专业
  • 怎么知道网站关键词的搜索来源网站设计背景怎么写
  • 做数学题目在哪个网站好2345网址导航大全
  • 网站链接建设的作用响应式网站免费模板下载
  • 济南济阳哪有做网站的企业邮箱多少钱
  • 温州专业制作网站网站开发技术项目式教程
  • 网站运营需要哪些资质石家庄公司网络推广
  • 网站 反链wordpress更新文件放在哪里
  • 酒店网站建设报价单wordpress完全版教材
  • 台州椒江区建设局网站网站建设专家是干嘛的
  • 富阳做网站公司微信网站应用开发
  • 个人网站页面设计素材1m带宽可以建设电商网站吗
  • 网站删除模块做推广哪些网站好
  • 怎么搜索别人的wordpress模板济南seo优化
  • 查网站域名备案天津做做网站
  • 定兴网站建设猎头公司网站建设
  • 移动网站开发基础知识上海智能网站建设公司
  • 做网站生意不赚钱dede网站建设流程
  • 做企业网站需要注意什么国内网站设计
  • 北京网站建设公司服务哪家好网站权重高+做别的关键词
  • 合肥专门做网站的公司有哪些找客户的软件
  • 东莞一站式网站建设wordpress您的主题支持一个菜单
  • 网站怎么做登录界面好订单网服装外发加工
  • 中英双语 网站 模板不用花生壳做网站服务器
  • 吉林城市建设学校网站百度网盘免费下载
  • 成品网站w灬源码在线看昆明网站运营
  • 沙田镇网站仿做wordpress 建站专家
  • 做网站python和php站长网站被跳转怎么办
  • 旅游网站设计完整代码创意平面设计公司
  • 做网站可以用什么软件动漫做a视频网站有哪些