数据库的增删改查,是管理系统的核心业务,所以针对数据库的常规操作和返回,进行了封装。在使用时,直接调用即可。
奇点的QiDianWebCommon包,是一个封装了常用WEB业务操作的功能包。针对MySQL数据库,提供增删改查等功能。
数据库执行类是DbManager类文件,包含有以下几大方法:
- 读取数据库连接配置文件,获取连接账号密码,建立连接,放入连接池。并提供获取连接方法。
- 执行更新、插入、批量插入、批量执行、事务执行。
- 查询第一行第一列数据(查询单元格数据)
- 查询结果是否存在
- 查询第一行数据
- 查询第一列数据
- 查询两列多行数据
- 查询多列多行数据
下面进行详细说明。
1、数据库连接
DbManager类中采用连接池技术提高性能,具体技术则是采用Tomcat的jdbc驱动。DbManager类中各个方法为静态方法,可直接使用。
在调用DbManager类的增删改查静态方法时,该方法内部会首先自动建立连接,连接成功后再执行具体方法。如果连接失败,则会抛出异常。
1.1、建立数据库连接
建立连接时,需要获取数据库连接信息,包括连接URL、数据库名称、账号、密码等信息。这些信息统一存放到dbconn.properties文件中。因此,在引入QiDianWebCommon包后,需要在当前项目的WEB-INF目录中,新建classes文件夹,再建立dbconn.properties文件。用于设定数据库连接账号信息,具体的配置项如下。
#
# *************************************************************
# 文件:dbconn.properties 模块:TaiJiAdmin 项目:TaiJiAdmin
# 当前修改时间:2019年02月24日 17:53:45
# 上次修改时间:2019年02月23日 16:57:06
# 作者:李露
# Copyright (c) 2018-2019 苏州奇点智能科技有限公司
# *************************************************************
#
dbUrl=jdbc:mysql://localhost:3306/dbtest?useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true
dbUsername=username
dbPassword=mypassword
#isDebug=1或者0。表示是否开始调试模式。如果开启,则会输出每次执行的SQL语句。以system.out方式输出。
dbDebug=1
#连接池设置。根据实际在线量进行设置,可以在管理后台查看当前的连接池实时状态,再进行调整。
#初始化链接数量。根据实际访问量进行设置。开发模式设置为1足以。
initSize=1
#最大活动连接数。超过了连接数,新连接就要等待。
maxActive=20
#最小空闲连接数
minIdle=1
#最大空闲连接数
maxIdle=4
配置项说明如下:
- 连接账号信息。dbUrl、dbUsername、dbPassword分别为数据库连接的URL、账号、密码。可参考上面样例进行修改。
- dbDebug。调试开关。设置为1时,会在IDEA编辑器的控制台,或者在Tomcat的日志文件中,输出每次调用执行的SQL语句和参数。建议在开发测试时设置为1打开,在部署到Tomcat后设置为0关闭,否则会在服务器上存储大量的SQL执行日志记录。
- 连接池设置。后面的4个参数,配置连接池体量。一般调试测试时,都设置较小。初始化连接数量、最小最大空闲连接数都为1即可。正式上线后,如果访问量大,就调大。
1.2、获取数据库连接
如果是直接调用数据库的增删改查方法,则完全不用获取数据库连接,因为方法内部会自动建立连接。
要获取数据库连接,一般用于自定义的事务执行。DbManager类中虽然也有事务执行方法,但是是按顺序批量执行SQL语句,有些事务功能无法这样执行。比如某个功能需求,是要先插入一条语句,再根据新插入记录的主键Id进行下一步的操作。那么就只能自己单独去写事务执行过程。该样例技巧在本文的事务章节中进行介绍。
获取数据库连接,调用DbManager.getConnection方法。如下样例所示,获取数据库连接后,自己写查询,自己关闭。效果一样。
//获取数据库连接样例。将异常抛给逻辑层。
public int AddUser() throws SQLException {
Connection conn = DbManager.getConnection();
if (conn == null) {
//处理,返回错误
System.out.println("数据库连接失败");
return -1;
}
//新的finally写法。conn会自动关闭
try (conn) {
Object[] params = {"test", "123456", 1};
String sql = "insert into qd_user(UserName,Password,Sex) values(?,?,?)";
//采用QueryRunner进行数据库执行。其内部封装了prepareStatement的处理,更加方便。
QueryRunner queryRunner = new QueryRunner();
return queryRunner.update(conn, sql, params);
}
}
1.3、获取数据连接池及属性
除了可以获取数据库连接,也可以获取数据库连接池。通过读取连接池的属性数据,可以及时了解连接池的状态。
获取连接池,采用DbManager.getDatasource方法。如下样例所示,可以获取连接池的各个状态值。
也可以直接调用DbManager.getDataSourceProperties方法,获取连接池状态属性。
//获取数据库连接池状态数据
public static Map<String, Object> getDataSourceProperties() {
//采用Tomcat的数据库连接池
org.apache.tomcat.jdbc.pool.DataSource dataSource = DbManager.getDataSource();
if (dataSource == null) {
return null;
}
//连接池属性
ConnectionPool pool = dataSource.getPool();
Map<String, Object> mapProp = new LinkedHashMap<>();
mapProp.put("以下为当前实时状态", "实时状态值");
mapProp.put("size", pool.getSize());
mapProp.put("busy", pool.getActive());
mapProp.put("idle", pool.getIdle());
mapProp.put("waitCount", pool.getWaitCount());
mapProp.put("borrowedCount", pool.getBorrowedCount());
mapProp.put("returnedCount", pool.getReturnedCount());
mapProp.put("createdCount", pool.getCreatedCount());
mapProp.put("releasedCount", pool.getReleasedCount());
mapProp.put("releasedIdleCount", pool.getReleasedIdleCount());
mapProp.put("reconnectedCount", pool.getReconnectedCount());
mapProp.put("removeAbandonedCount", pool.getRemoveAbandonedCount());
return mapProp;
}
2、执行更新插入语句
2.1、执行更新
执行更新,调用update方法。返回执行影响的行数。