话说:
各位读者朋友,中午好,今天小结下在Web项目开发过程中常用的工具类,很多东西我们感到麻烦的时候,就封装成工具类。
目录:
1.分页工具类
2.JDBC工具类
3.时间类工具类
4.字符串转Int工具类
5.UUID工具类
1.分页工具类
应用场景:很多地方都要分页,每次都写一遍分页5要素,很不方便。为了调高复用率,就封装起来。这种方式比较简化,但还不是最简化的,我见过一种最简化的,直接在.xml中配置一下即可。这个我不会。这个在上一篇博客中总结过。
package com.hmc.util;
import java.util.List;
/**
*
*2018年1月20日
*User:Meice
*下午4:08:25
*/
public class Pager {
/**
* 分页5要素 1条件
* 1.pageIndex 当前页-页面传过来
* 2.pageSize 每页显示数量 - 固定
* 3.offset 偏移量 -根据pageSize 和pageIndex计算 offset = (pageIndex-1)*pageSize 也就是limit ?,? 第一个问号
* 4.count 总数量-后台写方法查
* 5.totalPage 总页数 根据count pageSize得出 totalPage = (int)Math.ceil((double)count/pageSize)
* 6.list 存放集合数据
*/
//结论:调用此实体类给3个参数即可 pageIndex pageSize count
private int pageIndex;
private int pageSize;
private int offset;
private int count;
private int totalPage;
private List<?> list;//存放数据
private int begin;//处理每一页
private int end;
private int skipTo;//如果好玩点,可以加个跳转
public Pager() {}
public Pager(int pageIndex, int pageSize, int offset, int count, int totalPage, List<?> list, int begin, int end,
int skipTo) {
super();
this.pageIndex = pageIndex;
this.pageSize = pageSize;
this.offset = offset;
this.count = count;
this.totalPage = totalPage;
this.list = list;
this.begin = begin;
this.end = end;
this.skipTo = skipTo;
}
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
//控制住首页
if(pageIndex<=0) {
pageIndex =1;
}
if(totalPage>=5) {
if(pageIndex<=5 && totalPage>=pageSize) {
begin = 1;
end = pageSize;
}else if(pageIndex<=(totalPage-pageSize) && totalPage>=pageSize) {
begin = pageIndex - (int)Math.round(pageSize/2);
end = pageIndex + (pageSize-((int)Math.round(pageSize/2.0)));
}else {
begin = totalPage-(pageSize-1);
end = totalPage;
}
}else {
begin = pageIndex;
end = totalPage;
}
this.pageIndex = pageIndex;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getOffset() {
//使用此实体类的用户,不用为这个赋值
offset = (pageIndex -1)*pageSize;
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
public int getCount() {
return count;
}
public void setCount(int count) {
totalPage = (int)Math.ceil((double)count/pageSize);
this.count = count;
}
public int getTotalPage() {
//这个写在get()方法里面,因为用户不用赋值,但是有不能直接写死,否则变为了常量,没发改变 不要写这里,因为还得认为调用
//totalPage = (int)Math.ceil((double)count/pageSize);
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
public int getBegin() {
//这里赋值没用,因为方法没发调用!我们当前页赋值是通过setPageIndex()赋值的,框架底层也是这样 所以应该写在setPageIndex()
/*if(pageIndex<=pageSize) {
begin = 1;
}else if(pageIndex <totalPage -pageSize) {
begin = pageIndex - (int)Math.round(pageSize/2.0);
}*/
return begin;
}
public void setBegin(int begin) {
this.begin = begin;
}
public int getEnd() {
/*if(pageIndex<=pageSize) {
end = pageSize;
}else if(pageIndex <totalPage -pageSize) {
end = pageIndex + (pageSize-((int)Math.round(pageSize/2.0)));
}*/
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getSkipTo() {
return skipTo;
}
public void setSkipTo(int skipTo) {
this.skipTo = skipTo;
}
@Override
public String toString() {
return "Pager [pageIndex=" + pageIndex + ", pageSize=" + pageSize + ", offset=" + offset + ", count=" + count
+ ", totalPage=" + totalPage + ", list=" + list + ", begin=" + begin + ", end=" + end + ", skipTo="
+ skipTo + "]";
}
}
一定要注意各个参数赋值的位置,否则没有效果!这绝对是考验对get() set()方法理解深刻与否的最好方式!
2.JDBC工具类
DBUtil——这个获取数据库连接、关闭资源
package com.hmc.util;
/**
*
*2017年12月30日
*User:Meice
*下午8:35:12
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
//封装连接数据库的方法
//处理异常:java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
static int retryCount = 5;
static boolean transactionCompleted = false;
//1.加载驱动
static {
try {
Class.forName(GetPropertyUtil.getVal("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获取连接
public static Connection getConn() {
do {
//分开放 尽量不要合并写在一块
String url = GetPropertyUtil.getVal("url");
String user = GetPropertyUtil.getVal("user");
String password = GetPropertyUtil.getVal("password");
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
String sqlState = e.getSQLState();
if("08S01".equals(sqlState) || "40001".equals(sqlState)) {
retryCount--;
}else {
retryCount = 0;
}
}
return null;
}while(!transactionCompleted && retryCount>0);
}
//3.关闭资源
public static void closeConn(Connection conn,PreparedStatement ps,ResultSet rs) {
//Alt + Shift + Z 抛出语句块异常
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
GetPropertyUtil——获取静态配置
package com.hmc.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
*
*2017年12月30日
*User:Meice
*下午8:49:31
*/
public class GetPropertyUtil {
//获取静态资源
public static String getVal(String key) {
Properties pro = new Properties();
InputStream is;
try {
is = new FileInputStream("D:\\WorkSpace\\eclipse\\xiaomeibbs\\db.properties");
pro.load(is);
return pro.getProperty(key);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
GetPreparedStatementUtil——获取PrepatedStatement对象 针对多个参数
package com.hmc.util;
/**
*
*2017年12月30日
*User:Meice
*下午9:04:45
*/
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class GetPreparedStatementUtil {
//定义获取PrepatedStatement对象
public static PreparedStatement getPs(Connection conn,PreparedStatement ps,String sql,Object... params) {
try {
ps = conn.prepareStatement(sql);
//这样有无参数都可以搞定
if(params!= null) {
for(int i=0;i<params.length;i++) {
ps.setObject((i+1),params[i]);
}
}
return ps;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
这里需要注意一下,因为ps对象最好也从外部获取,而不要在工具类里面写死,否则如果在同一个方法中重复调用,容易出现对象替换。
1.bug1:
java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
SQL语句有3个参数,但是遍历的时候,只有2个。
问题导致原因:同一个Servlet调用2次底层方法,同时在GetPrepatedStatementUtil只是同一个PrepatedStatement对象,很可能重复使用。
3.时间类工具类
应用场景:数据库存值,如果是时间,那么一般这么处理
1.数据库存为varchar() 类型;赋值的时候直接格式化日期后然后存入;
2.数据库存为datetime 或者timestamp 然后前端取值时候通过jstl的fmt标签处理
不需要赋值,写SQL的时候,直接now()即可。
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<td><fmt:formatDate value="${menu.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
我们处理时间一般有这样几种情形:
1.格式化时间
2.获取时间戳
GetFormatTimeUtil——这个工具类可以把时间转换为2018-01-26 09:43:25 12进制或者24进制
package com.hmc.util;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
*2017年12月30日
*User:Meice
*下午9:44:05
*/
public class GetFormatTimeUtil {
public static String getFormatTime(int TwelveOrTwentyFour) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
if(TwelveOrTwentyFour == 12) {
return sdf2.format(date);
}else if(TwelveOrTwentyFour == 24){
return sdf.format(date);
}else {
return null;
}
}
public static void main(String[] args) {
System.out.println(getFormatTime(24));
System.out.println(getFormatTime(12));
/**
* 运行结果:
* 2018-01-26 09:43:25
2018-01-26 09:43:25
*/
//3种方法获取时间戳(自1970年1月1日以来的时间的毫秒数) 48*365*24*60*60*1000
System.out.println(System.currentTimeMillis());//推荐这种,方便!
System.out.println(new Date().getTime());
System.out.println(Calendar.getInstance().getTimeInMillis());
/**
* 运行结果:
* 1516887232623
1516887232625
1516887657528
*/
//我们可以模仿QQ截图,生成这种方式命名的图片: QQ截图20180125214517.png
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
System.out.println("小美截图"+sdf.format(new Date()));
/**
* 小美截图20180125215052
* QQ截图20180125214926.png
*/
}
}
4.字符串转Int工具类
这个JDBC初学者经常会用到
package com.hmc.util;
/**
*
*2018年1月1日
*User:Meice
*上午11:46:00
*/
public class GetStrToInt {
public static int getInt(String str) {
if(str!= null && !str.equals("")) {
return Integer.parseInt(str);
}
return 0;
}
}
5.UUID工具类
为了避免图片、文件名重复,可以使用UUID或者上面使用的时间工具类-时间戳
UUIDUtil——用java.util.UUID生成唯一标识符
package com.hmc.util;
import java.util.UUID;
/**
*
*2018年1月25日
*User:Meice
*下午9:05:40
*/
public class UUIDUtil {
public static String getStrUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
public static void main(String[] args) {
System.out.println(UUID.randomUUID().toString());
System.out.println(getStrUUID());
/**
* 测试结果:
* 0cdcf40d-a7a4-4008-b666-1dc432b9f456
7d819ab715674b50a57ef11258f22ede
前后之所以不一样,是因为不同的随机产生滴
*/
}
}
好了!小结到此,日后如有其它工具类,直接在这个基础上完善即可。上海今年好大雪!瑞雪兆丰年!今天我还沐浴更衣啦。2018!