12 数据库 05 SQL 数据查询
作者:谎言诞行    发布时间:2024年11月22日

1、简要说明

        在工具包中,数据库的交互处理分为2大部分:SQL 和 ORM。SQL 即通过各个数据库的sql语句,来操作(增、删、改、查)数据库的数据。ORM即通过数据库数据结构与Java 对象的映射,来操作(增、删、改、查)数据库的数据。

        在文章的编写顺序上,我们先学习关于SQL部分的处理,然后学习ORM部分的处理。因为,数据库只识别SQL形式的操作指令;即使是ORM方式,也只是通过ORM映射生成SQL语句,发送给数据库执行。大家对此有大概的了解即可。

        本章节,我们介绍关于数据的查询处理,即 select 语句。对于不懂sql语句语法的同学,可以参考以下教程网站: https://www.w3school.com.cn/sql/sql_select.asp

2、测试库表的设计

        为了更好的演示,我以 MySQL 8 数据库为例子。我用的客户端工具是官方客户端:MySQL Workbench 8.0 CE ,有兴趣可以自己去 Oracle 网站上下载。首先创建一个测试表,结构如下:

image.png

        注意:

        表名:test_insert

        数据字段:有3个,分别为:id 整型,主键,唯一索引,自增列;strings 字符类型 最大长度 100;ctime 时间类型。

        温馨提示,自增列一般不用作主键、唯一索引。唯一索引和主键,必须是有明确意义的字段。这里只是举例,请勿照搬。

2.1、测试数据如下:

image.png

3、关于JDBC的预处理

        在Java语言中,如果要连接数据库,需要使用JDBC驱动程序。JDBC 作为一个标准只制定了规范,没有做具体的实现,实现交给了各大数据库厂家。而JDBC标准中,提供了一种名为 java.sql.PreparedStatement 的接口。它一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。

        SQL语句会预编译在数据库系统中。执行计划同样会被缓存起来,它允许数据库做参数化处理。使用预处理语句比普通的语句更快,因为它做的工作更少。select 语句的预处理,语法如下图:

image.png

        从上图,我们可以看出,select 语句将要查询的处理条件都设置为英文的问号。其实,在具体执行时,一般以列表的方式传入预处理参数(参数顺序与预处理的 ’?’ 顺序相同)。数据库会动态处理英文的问号参数。

        注意:另外,本工具包对于 sql 语句有校验要求:语句至少包含一个预处理参数(即至少有一个 '?' )。否则语句校验不通过,无法执行。

4、事务处理

        对于查询语句,其实没啥事务同步与否的,因为它不涉及数据的变更。但是有一点要注意:在事务中插入、修改、删除的记录,要提交后才生效。如果事务还没提交就查询数据,所读取的信息是不准确的。比如下图:

image.png

image.png

        如上图所示,通过 db 对象,开一个新的连接,它是查询不到第一个连接中的未提交数据的。

5、数据查询举例

        现在,我们开始介绍几种常用的数据查询方式:分页查询、条件大小判断、条件等值判断、条件模糊匹配。这些处理不同数据库的语句可能会有略微差别,请自行区分。在演示时,我以 MySQL 8 为例子。

5.1、分页查询

image.png

image.png

5.2、条件大小判断

image.png

image.png

5.3、条件等值判断

image.png

image.png

5.4、条件模糊匹配

image.png

image.png

6、数据对象映射举例

        在查询数据时,我们除了可以获取一个 SimpleDBData 类型的对象外,还可以将结果映射为一个虚拟的 Java Bean 对象。在工具包中,我设计了一个虚拟实体的注解。通过这些注解,我们可以把结果自动映射为对象。现在我们具体举例说明。

6.1、创建虚拟实体对象

        其实虚拟实体对象,是一个普通的 Java Bean 类。它拥有标准的结构:类名、类属性、属性的get和set方法、无参构造函数、全参构造函数、以及toString 方法。下面我们分开一步步看这个类怎么构建。提示:如果大家使用的是Eclipse 或者 IDEA 这类开发平台,很多代码都可以自动生成的。

6.1.1、类注解

        虚拟实体类上,需要添加一个注解:@MyVirtualEntity。如下图:

image.png

6.1.2、属性注解

        在实体映射时,一个数据库字段,映射为一个独立的属性。属性需要添加注解 @MyColumn ,如下图:

image.png

6.1.3、设置getter 和 setter 方法

        设置好了属性的内容,接下来,用开发平台的工具,自动生成 每个属性的 set 和 get 方法。如下图:

image.png

6.1.4、构造函数

        设置好 get 和 set 方法,我们就构建 构造函数。构造函数有2个,一个是无参构造函数,另一个是全参构造函数。如下图:

image.png

6.1.5、重写默认的 toString 方法

        最后,我们需要重写 toString 方法,因为默认的方法显示格式不好看。如下图:

image.png

6.2、执行查询映射

        现在,虚拟实体已经构建完成。可以开始编写代码测试,如下图:

image.png

6.3、结果对比

image.png

image.png

        通过对比,我们可以发现,2个查询方式,得到的结果是完全一致的。


        本章节完结

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新