下载地址:
https://wws.lanzoui.com/i7G2Gp79bli
几个通用的base工具类
DAO的工具类——BaseDao
package com.xzh.dao.impl;
import com.xzh.utils.JdbcUtils;
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.ScalarHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* DAO的父类主要用于继承 里面写的查询功能
* 工具类
* @Author Lin
* @CreateTime 2021/5/7 21:09
*/
public abstract class BaseDao {
//DBUtils操作数据库
private QueryRunner queryRunner = new QueryRunner();
public int update(String s, Object... objects) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.update(connection, s, objects);
} catch (SQLException throwables) {
throwables.printStackTrace();
//这里必须往上抛 如果不往上抛的话 外面不能捕获异常
// 就不能判断到底是提交还是回滚
throw new RuntimeException(throwables);
}
}
/**
* @param type
* @param sql
* @param args
* @param <T>
* @return
*/
public < T > T queryForOne(Class< T > type, String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection, sql, new BeanHandler< T >(type), args);
} catch (SQLException throwables) {
throwables.printStackTrace();
//这里必须往上抛 如果不往上抛的话 外面不能捕获异常
// 就不能判断到底是提交还是回滚
throw new RuntimeException(throwables);
}
}
/**
* @param type
* @param sql
* @param args
* @param <T>
* @return
*/
public < T > List< T > queryForList(Class< T > type, String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection, sql, new BeanListHandler< T >(type), args);
} catch (SQLException throwables) {
throwables.printStackTrace();
//这里必须往上抛 如果不往上抛的话 外面不能捕获异常
// 就不能判断到底是提交还是回滚
throw new RuntimeException(throwables);
}
}
/**
* 查询一行一列的东西
*
* @param sql
* @param args
* @return
*/
public Object queryForSingleValue(String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection, sql, new ScalarHandler(), args);
} catch (SQLException throwables) {
throwables.printStackTrace();
//这里必须往上抛 如果不往上抛的话 外面不能捕获异常
// 就不能判断到底是提交还是回滚
throw new RuntimeException(throwables);
}
}
public int queryId(String sql,Object username){
Connection connection = JdbcUtils.getConnection();
try {
return (int)queryRunner.query(connection, sql, new ScalarHandler(), username);
} catch (SQLException throwables) {
throwables.printStackTrace();
//这里必须往上抛 如果不往上抛的话 外面不能捕获异常
// 就不能判断到底是提交还是回滚
throw new RuntimeException(throwables);
}
}
}
Jdbc工具类——JdbcUtils
package com.xzh.utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* 数据库连接工具类
* 后面调用需要手动提交
* 提交调用 commitAndClose()
* 关闭连接 rollbackAndClose()
* @Author Lin
* @CreateTime 2021/5/7 19:14
*/
public class JdbcUtils {
//创建一个ThreadLocal类 里面值得类为Connection类
private static ThreadLocal< Connection > conns = new ThreadLocal<>();
private static DruidDataSource dataSource;
static {
try {
Properties properties = new Properties();
//读取配置文件
InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//加载数据
properties.load(resourceAsStream);
//获取链接
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取链接
*
* @return //返回null说明获取连接失败
*/
public static Connection getConnection() {
//从ThreadLocal中得到链接
Connection conn = conns.get();
//若果没有就创建一个链接
if (conn == null) {
try {
//从datasource中获取一个链接
conn = dataSource.getConnection();
//设置为手动提交
conn.setAutoCommit(false);
//保存链接到ThreadLocal中
conns.set(conn);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return conn;
}
/**
* 事务回滚
*/
public static void commitAndClose() {
//从线程中得到一个数值
Connection connection = conns.get();
if (connection != null) {//如果不等于空就说名使用过这个链接
try {
connection.commit();//事务提交
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
connection.close();//关闭连接
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
conns.remove();//必须加上这个因为tomcat底层使用了线程池技术
}
/**
* 事务回滚
*/
public static void rollbackAndClose() {
//从线程中得到一个数值
Connection connection = conns.get();
if (connection != null) {//如果不等于空就说名使用过这个链接
try {
connection.rollback();//事务回滚
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
connection.close();//关闭连接
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
conns.remove();//必须加上这个因为tomcat底层使用了线程池技术
}
}
Web数据保存到javabean工具类——WebUtils
package com.xzh.utils;
import org.apache.commons.beanutils.BeanUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
/**
* 工具类
* parseInt 把数字字符串 转换成整数
* copyParamToBean 把map的数据根据key保存到javabean中
* @Author Lin
* @CreateTime 2021/5/10 10:03
*/
public class WebUtils {
/**
* @param map 请求
* @param bean 传入的数据库对象
*/
public static < T > T copyParamToBean(Map map, T bean) {
try {
BeanUtils.populate(bean, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return bean;
}
public static int parseInt(String strInt, int defaultValue) {
try {
if (strInt == null || strInt==""){
return defaultValue;
}else {
return Integer.parseInt(strInt);
}
}catch (NumberFormatException e){
e.printStackTrace();
}
return defaultValue;
}
}
Servlet工具类根据反射调用方法——BaseServlet
package com.xzh.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
/**
* 这个类继承了HttpServlet并且重写了doPost 和 get方法
* 主要通过反射来调用servlet的方法
*
* @Author Lin
* @CreateTime 2021/5/10 9:45
*/
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决请求和转发乱码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//得到网页的信息 判断该页面是什么页面
//<%--action后面的值表示要调用的servlet的方法--%>
String action = request.getParameter("action");
try {
//通过反射调用方法 getDeclaredMethod(方法名,参数类型 ...args){}
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
//调用方法 并传入参数
method.invoke(this, request, response);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}