All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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,必须指定参数。




© 2015 - 2025 Weber Informatics LLC | Privacy Policy