
META-INF.resources.admin.docs.dao.jsp Maven / Gradle / Ivy
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="admin" uri="http://www.infop.cn/tag/admin"%>
数据访问层
介绍
数据操作采用原生的SQL来访问数据库,目前仅通过对
MySQL 5.7
的测试,其他版本的数据库还未测试。层封装Apache Commons DBUtils库,简化
JDBC
操作数据库工作量。
当前封装的功能有:
- 插入数据。有两个方法,插入返回主键ID,适用于有主键自增的表;插入不返回任何数据,适用于采用字符类型作主键的表。
- 修改数据。
- 查询数据。有分页查询;有查询单条记录;有查询多条记录;有根据主键ID查询;从所有的记录中查询指定的字段;有查询一个字段;有查询一个字段一个值;有查询表总记录;有查询二进制流。
- SQL执行器。
开发DAO层
开发数据访问层,也就是DAO层,需要继承
cn.infop.tools.BusinessDao
类,此类是一个抽象类,需要传递一个
POJO
类型作泛型参数。
例如。有一个叫
Persion
的POJOJ类,写一个
PersonDao
类,它的代码是这样的:
package cn.infop.dao;
import cn.infop.entity.Person;
import cn.infop.tools.JdbcUtils;
public class PersonDao extends BusinessDao<Person> {
private final String table = "(SELECT * FROM persons) t";
//必须要有一个无参数构造方法
public PersonDao() {
super(Person.class); //必须要超类的构造方法中填写POJO的class
super.multiTable = table; //指定用于多表查询的视图或表
super.singleTable = "persons"; //指定单表
}
}
cn.infop.tools.BusinessDao
在查询时会将查询结果封装成Bean对象,因此必须要传入一个
POJO
类型作泛型参数。否则不能实现将查询结果封装成Bean对象,不能简化JDBC操作数据库的工作量。
数据库存在表里,通常分开成多张表,以满足3NF——学过数据库理论就知道为什么表设计要满足3NF,在此不再详述。于是我在设计时,定义两个变量:
protected String singleTable;
protected String multiTable;
singleTable
用于单张表查询。
multiTable
用于多张表查询,先将相关的表写一个SQL查询赋值给变量multiTable。后面讲的分页查询用到
multiTable
变量。
插入数据 - 返回主键ID
插入数据,并返回主键ID,其实用得非常少——在Restful请求中需要返回主键。可是我在写代码时,将这个功能放在最常用的保存方法中。这个方法是:
insertWithReturnId(String[] fields, Object[] params)
第一个参数fields,是字符串类型的数组。应该这样创建:
String[] fields = new String[]{key1,key2...}
第一个参数params,是Object类型的数组。应该这样创建:
Object[] params = new Object[]{value1,value2...}
此方法的目的是为了不写SQL。
我想您会发现,它是对应INSERT INTO这样的SQL中的字段和值。
还有一个方法,重点介绍:
public int insertWithReturnId(String sql, Object[] params)
执行插入SQL,必须指定参数。其实上面的
save
本质上还是调用这个
insertWithReturnId
方法。
插入数据 - 不返回任何数据
插入数据不返回主键。这个方法是:
insertWithoutReturnId(String[] fields, Object[] params)
第一个参数fields,是字符串类型的数组。应该这样创建:
String[] fields = new String[]{key1,key2...}
第一个参数params,是Object类型的数组。应该这样创建:
Object[] params = new Object[]{value1,value2...}
我想您会发现,它是对应INSERT INTO这样的SQL中的字段和值。
修改数据
修改数据是将SQL的update语句进行封装。考虑到修改数据时可带参考,或不带参数。有以下方法:
public int update(String[] fields, Object[] params, int ConditionalLocation)
修改数据,指定3个参数,参数fields
是字段的集合,参数params
是值的集合,参数ConditionalLocation
是指where条件从第几个字段起;按索引从0开始,如果where
条件字段在第5个,那ConditionalLocation
的值应该是5-1=0。此方法的目的是为了不写SQL。
public int update(String sql, Object[] params)
,执行SQL更新,必须指定参数。
分页查询
分页 查询是我注入精力比较的多工作,从2018年开始,到2020年,先后写了JDBC版、JPA版,现在没打算做超大型应用,JPA版中止放弃。
分页查询封装jQuery DataTables插件,方法
public DataTablesResponse<T> findAll(DataTablesRequest dtr, String[] searchFields)
- 参数dtr是
DataTablesRequest
类型,它将HttpServletRequest
对象带入过的参数解析,再进行封装。
- 参数
searchFields
是要搜索的字段,即显示在jQuery DataTables上的字段。
- 返回数据
DataTablesResponse<T>
,其T是DAO构造函数中的泛型类,DataTablesResponse返回的有分页信息,还有数据。
其它查询方法
除了上面典型的查询方法,还有提供一个比较底层的类
cn.infop.tools.JdbcUtils
,提供一些方法,不详情说明,列出看后有个印象,方便运用。
public static <T> T getBean(String sql, Class<T> clazz)
,查询单条记录,无参数。泛型参数POJO类的class。
public static <T> T getBean(String sql, Class<T> clazz, Object... params)
,查询单条记录,必须指定参数。泛型参数POJO类的class。
public static <T> List getBeans(String sql, Class<T> clazz)
,查询多条记录,无参数。泛型参数POJO类的class。
public static <T> List getBeans(String sql, Class<T> clazz, Object... params)
,查询多条记录,必须指定参数。泛型参数POJO类的class。
public static List<String> getColumns(String sql)
,查询单单个字段,并放到List,无参数。
public static List<String> getColumns(String sql, Object[] params)
,查询单单个字段,并放到List,必须指定参数。
public static String getOneString(String sql)
,查询单条记录,无参数。
public static String getOneString(String sql, Object[] params)
,查询单条记录,必须指定参数。
public static int count(String sql)
,统计记录数,无参数。
public static int count(String sql, Object[] params)
,统计记录数,必须指定参数。
public static int insertWithReturnId(String sql, Object[] params)
,插入单条记录,并返回主键id,必须指定参数。
public static void insertWithoutReturnId(String sql, Object[] params)
,插入单条记录,不返回任何信息,适用于复合主键、字符类型主键的表插入数据,必须指定参数。
public int execute(String sql)
,SQL执行器,可执行Insert、Update、Delete等SQL,无参数。
public int execute(String sql, Object[] params)
,SQL执行器,可执行Insert、Update、Delete等SQL,必须指定参数。