热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

构建Java自定义持久层框架:实现数据访问与存储的高效解决方案

JDBC连接数据库步骤:Connection连接对象,PreparedStatement

JDBC连接数据库

步骤:



    1. Connection连接对象,

    2. PreparedStatementsql操作独对象,

    3. ResultSet结果集对象

    2.加载数据库驱动

    3.定义sql语句

    4.获取预处理statement

    5.设置查询参数

    5.从结果集中取出数据


      package com.mybatis.jdbc.JDBCUtil;


      import com.mybatis.jdbc.pojo.Emp;


      import java.sql.*;


      public class JDBC {
      public static void main(String[] args) {
      Connection cOnnection=null;
      PreparedStatement preparedStatement=null;
      ResultSet resultSet=null;


      try {
      Class.forName("com.mysql.jdbc.Driver");
      cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/tr18lx","root","333");


      String sql="select * from emp where JOB=?";


      preparedStatement= connection.prepareStatement(sql);
      preparedStatement.setString(1,"job");
      resultSet = preparedStatement.executeQuery();


      while(resultSet.next()){


      int empno=resultSet.getInt("empno");
      String ename=resultSet.getString("ename");
      String job=resultSet.getString("job");
      int mgr=resultSet.getInt("mgr");
      String hiredate=resultSet.getString("hiredate");
      int sal=resultSet.getInt("sal");
      int comm=resultSet.getInt("comm");
      int deptno=resultSet.getInt("deptno");


      Emp emp = new Emp();
      emp.setEmpno(empno);
      emp.setComm(comm);
      emp.setDeptno(deptno);
      emp.setEname(ename);
      emp.setHiredate(hiredate);
      emp.setJob(job);
      emp.setMgr(mgr);
      emp.setSal(sal);


      String s = emp.toString();
      System.out.println(s);
      }


      } catch (ClassNotFoundException e) {
      e.printStackTrace();
      } catch (SQLException e) {
      e.printStackTrace();
      }


      }
      }


      JDBC问题分析:


        1. 硬编码问题,参数设置,获取结果集,sql语句,数据库配置信息存在硬编码。


        1. 频繁创建释放数据连接。


        1. 手动封装结果集较为繁琐。

      解决:1.使用配置文件,将参数放在配置文件中。把经常发生改变的                   信息和不经常改变的信息放在不同的文件中。

                  2.使用连接池

                  3.使用反射,内省,将结果集自动映射到实体类中。



          

    自定义持久层框架:

    思路:

    客户端:引入自定义持久层框架的jar包

        提供两部分配置信息:数据库配置信息,sql配置信息(sql语句,参数类        型,返回值类型)。使用配置文件提供这两部分信息。

        sqlMapConfig.xml,存放mapper.xml的全路径。在加载时只需要一次

        mapper.xml


    服务端:本质就是对JDBC代码进行了封装。

        1.加载配置文件 加载成流,存储在内存中。

     创建Resources类 方法:InputSteam getResourcesAsSteam(String path)

        2.加载完配置信息后,创建两个JavaBean存放配置信息。(容器对象)

      Configuration核心配置类:存放sqlMapConfig.xml解析出来的内容。

      MapperStatement映射配置类:映射配置文件类,存放mapper.xml映射出来的内容。

        3.解析配置文件 dom4j

        创建类:SqlSessionFactoryBuide   方法:buider(InputStream input)

            a.使用dom4j解析配置文件,将解析出来的内容放到bean中

           b.创建SQLSessionFactory对象:生产sqlSession:会话对象(工厂模式)

    4. 创建SqlSessionFactory接口及实现类DefaultSqlSessionFactory

        openSession():主要作用就是创建sqlSession对象。

    5.创建SqlSession接口及实现类DefaultSession:

        定义crud操作:selectAll(),selectOne(),update(),delete()

    6.创建Exexutor接口及实现类SimpleExecuter

        具体执行jdbc代码,query(Configuration,MapperStatement,Object... )




    问题分析:

        1.代码重复:dao层在加载配置文件,创建sqlsessionfactory,生产sqlsession重复

          2.存在硬编码问题。dao层在执行crud方法时,传入的statementid是写死的。


    解决思路:使用代理模式生成dao层的代理实现类。利用动态代理中的三个参数,动态生成statementId和params




    项目目录:


    自定义持久层:


    客户端:





    推荐阅读
    • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
    • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
    • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
    • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
    • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
    • DNN Community 和 Professional 版本的主要差异
      本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
    • UNP 第9章:主机名与地址转换
      本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
    • Java 中的 BigDecimal pow()方法,示例 ... [详细]
    • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
    • 深入理解 SQL 视图、存储过程与事务
      本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
    • 构建基于BERT的中文NL2SQL模型:一个简明的基准
      本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
    • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
    • 数据库内核开发入门 | 搭建研发环境的初步指南
      本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
    • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
    • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
    author-avatar
    益清613
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有