Java数据持久层

一、前言 1.持久层

Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦。

我从整体角度,依次阐述JDBC、MybatisMybatisPlus。
前者总是后者的依赖。只有在了解前者,才可以更好地学习后者。

2.技术选型

ciwai ,还有Hibernate、SpringData、JPA等。
至于Hibernate作为知名框架,其最大的特点,是支持面向对象的数据管理。但成也萧何,败也萧何。Hibernate的该功能,导致其太重了。而大多数场景下,我们是不需要这个功能的。另外,Hibernate的该功能,使用起来过于复杂。其设计关联关系&映射关系,带来了太多复杂度。
SpringData,则是我看好的另一个Spring原生支持。但是目前主流还是Mybatis,其发展&主流的切换,还需要时间。就让子弹飞一会儿吧。
至于MybatisPlus,是我在工业物联网公司时所采用的一个技术方案。其符合“约定大于配置”的技术趋势,减少了Mybatis那样的配置成本,但是比JPA更加灵活。更棒的是,它支持stream这样的编码方式进行Sql支持(错误可以在编译期透出)。但如果是大型公司,个人的建议是,谨慎考虑,再进行使用。抛开技术方面的考量,MybatisPlus虽然是优秀的开源软件,但其开源社区&软件管理确实相对过于薄弱。对于大公司的技术生态而言,这是一个不得不重视的风险点。

3.文章脉络

不过,Mybatis作为现在最流行的ORM框架,还是值得大家相信的。所以经过考虑,这边文章虽然包含三块内容,但是JDBC更多作为一个依赖,进行了解。而MybatisPlus主要侧重于其核心功能-BaseMapper的实现,以及其扩展Mybatis得到的扩展实现方式。整篇文章的重点,还是落在Mybatis,对其投入较大的精力进行描述。

4.文章优势

又到了王婆卖瓜的阶段。
文章最大的两个优点:图&结构。
本篇文章采用了数十张图,用于展现对应关系。毕竟一图胜千言嘛。
而结构方面,文章采用MECE原则。文章分为JDBC、Mybatis、MybatisPlus。核心的Mybatis分为静态结构&运行流程。静态结构对Mybatis的架构,以及模块进行了展开。运行流程则是针对Mybatis的初始化&运行两个重要生命周期节点,进行展开。最后,通过Mybatis的核心Configuration的核心字段解析(作用、来源、去向)进行总结收纳。

5.文章遗憾

遗憾主要集中在两个方面:

由于是一个长文(接近6W字),最近事情又多(财年底,大家懂的),所以难免有一些疏漏。欢迎大家指出来哈。

战线拖得太长(写了快两个月)。虽然还有很多地方可以展开&深入,但是经过考虑后,还是放弃了。

文章中有很多补充部分,大家可以自行查阅,扩展知识面。虽然我查询了一些资料,但是有点整理不动(又不知大家是否感兴趣)。当然,如果大家对某部分感兴趣,可以提出来,我出个单章。

二、JDBC 1.简介

JDBC是一个规范,其分为两个部分:

厂商:完成数据库驱动

Java开发者:调用统一接口

在这里插入图片描述

2.整体结构

在这里插入图片描述

对应组件:

DriverManager:数据库驱动管理器

Driver:数据库驱动的抽象接口,用于与数据库服务进行通信

Connection:与数据库的连接

Statement:用于提交SQL语句

Statement:通用接口,继承自Wrapper。普通的不带参的查询SQL;支持批量更新,批量删除;

PreparedStatement:预编译接口,继承自Statement。可变参数的SQL,编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题;

CallableStatement:继承自PreparedStatement。支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;

ResultSet:用于保存数据库结果

SQLException:数据库异常

3.生命周期 a.初始化过程

驱动注册&配置注入

b.执行过程

在这里插入图片描述

4.代码示例

原生JDBC较为原始,架构上的设计也是非常薄的。
所以,说得太多,还不如看看应用代码。

// 1. 注册驱动 // 使用java.sql.DriverManager类的静态方法registerDriver(Driver driver) // Driver是一个接口,参数传递:MySQL驱动程序的实现类 // DriverManager.registerDriver(new Driver()); // 查看驱动类源码,注册两次驱动,浪费资源 Class.forName("com.mysql.jdbc.Driver"); // 2. 获得连接 // uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字 String url = "jdbc:mysql://localhost:3306/TEST"; // static Connection getConnection(String url, String user, String password) // 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中 Connection conn = DriverManager.getConnection(url, "root", "123456"); // conn.setAutoCommit(false); // 用于事务提交conn.commit(),conn.rollback() System.out.println(conn);// com.mysql.jdbc.JDBC4Connection@10d1f30 // 3. 获得语句执行平台,通过数据库连接对象,获取到SQL语句的执行者对象 //conn对象,调用方法 Statement createStatement() 获取Statement对象,将SQL语句发送到数据库 //返回的是Statement接口的实现类对象,在MySQL驱动程序中 Statement statement = conn.createStatement(); System.out.println(statement);//com.mysql.jdbc.StatementImpl@137bc9 // 4. 执行sql语句 //通过执行者对象调用方法执行SQL语句,获取结果 //int executeUpdate(String sql) 执行数据库中的SQL语句,仅限于insert,update,delete //返回值int,操作成功数据库的行数 ResultSet resultSet = statement.executeQuery("SELECT * from user where id = 1"); System.out.println(resultSet); // 5. 释放资源 statement.close(); conn.close(); 5.总结

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

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