002-基本业务搭建【日志,工具类dbutils,dbcp等使用】
一、需求分析
1.1、概述
1、用户进入“客户管理”,通过列表方式查看用户;
2、客户名称,模糊查询用户列表
3、客户名称,可查看客户详细信息
4、新增、编辑、删除功能等
二、系统设计
需要对原始需求进行分析,找出Use Case(用例),然后设计表结构,画原型图,定义URL规范。
设计过程是由粗到细,由表及里。注意:设计阶段不涉及具体技术实现。
2.1、用例设计
查询用户、显示客户列表、显示客户基本信息、创建客户、编辑客户、删除客户
建议使用UML用例图展示,更加直观
2.2、数据库表设计
2.3、设计界面原型
可以使用Mockplus、axure 等工具设计界面原型。
2.4、设计URL
注:还有其他设计过程,如数据模型,业务流程等。略。最终会形成一份设计文档。
三、代码开发
https://github.com/bjlhx15/smart-framework.git
知识点1 单元测试
引用包
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
在需要添加测试的类中使用快捷键:ctrl+alt+T即可
单元测试需要使用的配置,可在test下增加resources,并且右键→Mark Directory as/Resources Root。
需要注意main/java,main/resources,test/java,test/resources都是classpath的根目录,当运行单元测试的时候,遵循“就近原则”,即先从test/java,test/resources加载类或配置文件。
知识点2 日志使用
添加slf4j依赖,用于提供日志API,使用Log4j作为实现,POM配置
<!--slf4j 日志 默认使用log4j-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
在resource下增加log4j.properties文件
log4j.rootLogger=ERROR,console,file log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%m%n log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=${user.home}/logs/book.log
log4j.appender.file.DatePattern='_'yyyyMMdd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss SSS} %p %c (%L) %m%n log4j.logger.com.lhx=DEBUG
提供了两种方式的日志,包com.lhx下的日志级别是debug
知识点3 commons工具类的使用
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
知识点4 Dbutil应用以及threadlocal应用
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
DatabaseHelper代码
package com.lhx.chapter2.helper; import com.lhx.chapter2.util.PropsUtil;
import com.sun.org.apache.regexp.internal.REUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties; /**
* db链接工具
*/
public class DatabaseHelper {
private static final Logger log = LoggerFactory.getLogger(DatabaseHelper.class); private static final String DRIVER;
private static final String URL;
private static final String USERNAME;
private static final String PASSWORD; private static final QueryRunner QUERY_RUNNER ;
private static final ThreadLocal<Connection> CONNECTION_HOLDER ; static {
QUERY_RUNNER = new QueryRunner();
CONNECTION_HOLDER = new ThreadLocal<>();
Properties conf = PropsUtil.loadProps("config.properties");
DRIVER = conf.getProperty("jdbc.driver");
URL = conf.getProperty("jdbc.url");
USERNAME = conf.getProperty("jdbc.username");
PASSWORD = conf.getProperty("jdbc.password");
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
log.error("类加载失败", e);
}
} public static Connection getConnection() {
Connection conn = CONNECTION_HOLDER.get();
if (conn == null) {
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
log.error("获取链接失败", e);
} finally {
CONNECTION_HOLDER.set(conn);
}
}
return conn;
} public static void closeConnection() {
Connection conn = CONNECTION_HOLDER.get();
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
log.error("关闭链接失败", e);
} finally {
CONNECTION_HOLDER.remove();
}
}
} public static <T> List<T> queryEntityList(Class<T> entityClass, String sql, Object... parmas) {
List<T> entityList;
try {
entityList = QUERY_RUNNER.query(getConnection(), sql, new BeanListHandler<T>(entityClass), parmas);
} catch (SQLException e) {
log.error("查询实体失败", e);
throw new RuntimeException(e);
} finally {
closeConnection();
}
return entityList;
} public static <T> T queryEntity(Class<T> entityClass, String sql, Object... parmas) {
T entity;
try {
entity = QUERY_RUNNER.query(getConnection(), sql, new BeanHandler<T>(entityClass), parmas);
} catch (SQLException e) {
log.error("查询实体失败", e);
throw new RuntimeException(e);
} finally {
closeConnection();
}
return entity;
} public static List<Map<String, Object>> excuteQuery(String sql, Object... parmas) {
List<Map<String, Object>> result;
try {
result = QUERY_RUNNER.query(getConnection(), sql, new MapListHandler(), parmas);
} catch (SQLException e) {
log.error("查询失败", e);
throw new RuntimeException(e);
} finally {
closeConnection();
}
return result;
} public static int excuteUpdate(String sql, Object... parmas) {
int rows = 0;
try {
rows = QUERY_RUNNER.update(getConnection(), sql, parmas);
} catch (SQLException e) {
log.error("更新失败", e);
throw new RuntimeException(e);
} finally {
closeConnection();
}
return rows;
} private static String getTableName(Class<?> entityClass) {
return entityClass.getSimpleName();
} public static <T> boolean insertEntity(Class<T> entityClass, Map<String, Object> filedMap) {
if (MapUtils.isEmpty(filedMap)) {
log.error("请求插入的map不能为空");
return false;
} String sql = "insert into " + getTableName(entityClass);
StringBuilder columns = new StringBuilder("(");
StringBuilder values = new StringBuilder("(");
for (String filedName : filedMap.keySet()) {
columns.append(filedName).append(", ");
values.append("?, ");
}
columns.replace(columns.lastIndexOf(", "), columns.length(), ")");
values.replace(values.lastIndexOf(", "), values.length(), ")");
sql += columns + " values " + values;
Object[] parmas = filedMap.values().toArray();
return excuteUpdate(sql, parmas) == 1;
} public static <T> boolean updateEntity(Class<T> entityClass, long id, Map<String, Object> filedMap) {
if (MapUtils.isEmpty(filedMap)) {
log.error("请求更新的map不能为空");
return false;
} String sql = "update " + getTableName(entityClass) + " set ";
StringBuilder columns = new StringBuilder();
for (String filedName : filedMap.keySet()) {
columns.append(filedName).append("=?, ");
}
sql += columns.substring(0, columns.lastIndexOf(", ")) + " where id=?";
List<Object> paramsList = new ArrayList<>();
paramsList.addAll(filedMap.values());
paramsList.add(id);
Object[] parmas = paramsList.toArray();
return excuteUpdate(sql, parmas) == 1;
}
public static <T> boolean deleteEntity(Class<T> entityClass, long id) {
String sql = "delete from " + getTableName(entityClass) + " where id=? ";
return excuteUpdate(sql, id) == 1;
}
public static void excuteSqlFile(String filePath) {
String file = "sql/customer_init.sql";
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String sql;
try {
while ((sql = reader.readLine()) != null) {
excuteUpdate(sql);
}
} catch (IOException e) {
log.error("文件读取异常", e);
throw new RuntimeException(e);
}
}
}
知识点5 Dbutil、threadlocal、dbcp连接池应用
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
DatabaseDbcpHelper代码
package com.lhx.chapter2.helper; import com.lhx.chapter2.util.PropsUtil;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties; /**
*db链接工具
*/
public class DatabaseDbcpHelper {
private static final Logger log = LoggerFactory.getLogger(DatabaseHelper.class); private static final QueryRunner QUERY_RUNNER;
private static final ThreadLocal<Connection> CONNECTION_HOLDER;
private static final BasicDataSource DATA_SOURCE; static {
QUERY_RUNNER = new QueryRunner();
CONNECTION_HOLDER = new ThreadLocal<>();
DATA_SOURCE = new BasicDataSource();
Properties conf = PropsUtil.loadProps("config.properties");
String driver = conf.getProperty("jdbc.driver");
String url = conf.getProperty("jdbc.url");
String username = conf.getProperty("jdbc.username");
String password = conf.getProperty("jdbc.password");
DATA_SOURCE.setDriverClassName(driver);
DATA_SOURCE.setUrl(url);
DATA_SOURCE.setUsername(username);
DATA_SOURCE.setPassword(password);
} public static Connection getConnection() {
Connection conn = CONNECTION_HOLDER.get();
if (conn == null) {
try {
conn = DATA_SOURCE.getConnection();
} catch (SQLException e) {
log.error("获取链接失败", e);
} finally {
CONNECTION_HOLDER.set(conn);
}
}
return conn;
} public static <T> List<T> queryEntityList(Class<T> entityClass, String sql, Object... parmas) {
List<T> entityList;
try {
entityList = QUERY_RUNNER.query(getConnection(), sql, new BeanListHandler<T>(entityClass), parmas);
} catch (SQLException e) {
log.error("查询实体失败", e);
throw new RuntimeException(e);
}
return entityList;
} public static <T> T queryEntity(Class<T> entityClass, String sql, Object... parmas) {
T entity;
try {
entity = QUERY_RUNNER.query(getConnection(), sql, new BeanHandler<T>(entityClass), parmas);
} catch (SQLException e) {
log.error("查询实体失败", e);
throw new RuntimeException(e);
}
return entity;
} public static List<Map<String, Object>> excuteQuery(String sql, Object... parmas) {
List<Map<String, Object>> result;
try {
result = QUERY_RUNNER.query(getConnection(), sql, new MapListHandler(), parmas);
} catch (SQLException e) {
log.error("查询失败", e);
throw new RuntimeException(e);
}
return result;
} public static int excuteUpdate(String sql, Object... parmas) {
int rows = 0;
try {
rows = QUERY_RUNNER.update(getConnection(), sql, parmas);
} catch (SQLException e) {
log.error("更新失败", e);
throw new RuntimeException(e);
}
return rows;
} private static String getTableName(Class<?> entityClass) {
return entityClass.getSimpleName();
} public static <T> boolean insertEntity(Class<T> entityClass, Map<String, Object> filedMap) {
if (MapUtils.isEmpty(filedMap)) {
log.error("请求插入的map不能为空");
return false;
} String sql = "insert into " + getTableName(entityClass);
StringBuilder columns = new StringBuilder("(");
StringBuilder values = new StringBuilder("(");
for (String filedName : filedMap.keySet()) {
columns.append(filedName).append(", ");
values.append("?, ");
}
columns.replace(columns.lastIndexOf(", "), columns.length(), ")");
values.replace(values.lastIndexOf(", "), values.length(), ")");
sql += columns + " values " + values;
Object[] parmas = filedMap.values().toArray();
return excuteUpdate(sql, parmas) == 1;
} public static <T> boolean updateEntity(Class<T> entityClass, long id, Map<String, Object> filedMap) {
if (MapUtils.isEmpty(filedMap)) {
log.error("请求更新的map不能为空");
return false;
} String sql = "update " + getTableName(entityClass) + " set ";
StringBuilder columns = new StringBuilder();
for (String filedName : filedMap.keySet()) {
columns.append(filedName).append("=?, ");
}
sql += columns.substring(0, columns.lastIndexOf(", ")) + " where id=?";
List<Object> paramsList = new ArrayList<>();
paramsList.addAll(filedMap.values());
paramsList.add(id);
Object[] parmas = paramsList.toArray();
return excuteUpdate(sql, parmas) == 1;
} public static <T> boolean deleteEntity(Class<T> entityClass, long id) {
String sql = "delete from " + getTableName(entityClass) + " where id=? ";
return excuteUpdate(sql, id) == 1;
} public static void excuteSqlFile(String filePath) {
String file = "sql/customer_init.sql";
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String sql;
try {
while ((sql = reader.readLine()) != null) {
if (StringUtils.isNotEmpty(sql)) {
excuteUpdate(sql);
}
}
} catch (IOException e) {
log.error("文件读取异常", e);
throw new RuntimeException(e);
}
}
}
知识点6 Dbutils简述
DbUtils给我们提供了10个ResultSetHandler实现类,如下:
①ArrayHandler: 将查询结果的第一行数据,保存到Object数组中
②ArrayListHandler 将查询的结果,每一行先封装到Object数组中,然后将数据存入List集合
③BeanHandler 将查询结果的第一行数据,封装到user对象
④BeanListHandler 将查询结果的每一行封装到user对象,然后再存入List集合
⑤ColumnListHandler 将查询结果的指定列的数据封装到List集合中
⑥MapHandler 将查询结果的第一行数据封装到map结合(key==列名,value==列值)
⑦MapListHandler 将查询结果的每一行封装到map集合(key==列名,value==列值),再将map集合存入List集合
⑧BeanMapHandler 将查询结果的每一行数据,封装到User对象,再存入mao集合中(key==列名,value==列值)
⑨KeyedHandler 将查询的结果的每一行数据,封装到map1(key==列名,value==列值 ),然后将map1集合(有多个)存入map2集合(只有一个)
⑩ScalarHandler 封装类似count、avg、max、min、sum......函数的执行结果
002-基本业务搭建【日志,工具类dbutils,dbcp等使用】的更多相关文章
- 开源JDBC工具类DbUtils
本篇将会详细地介绍Apache公司的JDBC帮助工具类DbUtils以及如何使用.在上一篇中我们已经通过将以前对dao层使用JDBC操作数据库的冗余代码进行了简易封装形成自己的简单工具类JdbcUti ...
- Android开发调试日志工具类[支持保存到SD卡]
直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...
- Log 日志工具类 保存到文件 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- DBUtils工具类和DBCP连接池
今日内容介绍 1.DBUtils2.处理结果集的八种方式3.连接池4.连接池的用法1 PrepareStatement接口预编译SQL语句 1.1 预处理对象 * 使用PreparedStatemen ...
- Android utils 之 日志工具类
工具类 在开发的过程中,我们时常会对代码执行特定的处理,而这部分处理在代码中可能多次用到,为了代码的统一性.规范性等,通过建工具类的方式统一处理.接下来我会罗列各种工具类. 日志工具类 在utils文 ...
- Java-jdbc工具类DBUtils
创建项目: 导入相应jar包: 看上图. JDBCUtil.java获取数据库连接文件: package com.gordon.jdbcutil; import java.io.InputStream ...
- JDBC工具类-DButils(QueryRunner-ResultSetHandler)
简述: DBUtils是Java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码. DBUtils三个核心功能: QUeryRunne ...
- logger日志工具类
日志工厂类 package cn.itcast.utils; import java.util.logging.FileHandler; import java.util.logging.Handle ...
- Java 基于log4j的日志工具类
对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...
随机推荐
- 通过windows自带的系统监视器来查看IIS并发连接数(perfmon.msc)
如果要查看IIS连接数,最简单方便的方法是通过“网站统计”来查看,“网站统计”的当前在线人数可以认为是当前IIS连接数.然而,“网站统计”的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统 ...
- Vue 组件5 高级异步组件
自2.3.0起,异步组件的工厂函数也可以返回一个如下的对象. const AsyncComp = () => ({ // 需要加载的组件. 应当是一个 Promise component: im ...
- jstat -gcutil pid millsec
1. jstat -gc pid 可以显示gc的信息,查看gc的次数,及时间. 其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc ...
- dos2unix dos文本转换为linux文本 /bin/bas^M:bad interpreter
第一种方法:dos2unix -f 文本名 第二种方法: 首先:vi 文本名 然后::set ff? 如果出现fileforma=dos那么就确定是linux和windows之间的不完全兼容 :set ...
- ex:0602-169 遇到不完整或无效的多字节字符,转换失败
错误原因:在AIX系统中,用vi命令编辑文件,出现rt错误,是因为AIX系统不识别文件编码格式. 解决方法:建议重新新建一个编码格式为ASC的文件,再重新上传到AIX系统中,或者改变访问linux的客 ...
- DataUml Design 教程6-DataUML Design 1.1版本正式发布(支持PD数据模型)
从DataUML Design正式发布到现在有两个月了,由于最近比较忙,到现在才发布1.1版本.以后本人会一直坚持不断完善DataUML Design软件,希望广大程序猿们多多支持. 一.1.1版本新 ...
- Call to a member function cellExists() on a non-object /phpexcel/Classes/PHPExcel/Calculation.php on line 3241
PHP Fatal error: Call to a member function cellExists() on a non-object in /home/edata/eframework/we ...
- web开发中经常使用的js
将自己在web开发中经经常使用到的一些JS总结一下. 1.改动标签和表单的值 改动标签的值: var customer = document.getElementById("custm&qu ...
- 阿里云服务器 端口开放问题 浏览器钟输入ip 访问服务器
在这里先用一堆粗口强烈吐槽阿里云服务器控制台,屎一样的界面,简直非人类的操作.想找一个功能简直无从下手. 场景: 今天刚在阿里云买了个服务器,打算愉快的用五分钟将数据库,apache,安装完毕,然后去 ...
- 面向对象JSON的继承(复制)与函数的继承(复制)
今天这里和大家分享下如何复制对象 的属性 创建 对象的方式有三种,这里和大家分享下最常用的几种 1.JSON格式的方式创建对象 2.用函数的方式创建,然后用new关键字实例化对象,关于this的指向问 ...