提示:以下是本篇文章正文内容,下面案例可供参考
一、使用DbUtils封装好数据库
package javaweb;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.alibaba.druid.pool.DruidDataSource;//使用alibaba的DbUtils来封装数据库操作
public class DbUtils {
private static DruidDataSource dataSource;
static {
//创建数据库连接池
dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");//如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
dataSource.setUrl("jdbc:mysql://localhost:3306/javaweb?useUnicode=true&characterEncoding=UTF-8");//数据库所在路径
dataSource.setUsername("root");//用户名
dataSource.setPassword("");//密码
dataSource.setInitialSize(3);//初始化时建立物理连接的个数
dataSource.setMaxActive(12);//初始化时建立物理连接的个数
dataSource.setValidationQuery("select 'x'");//用来检测连接是否有效
}
public static Connection getConn(){//获取数据库连接池中的连接
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("创建数据库连接", e);
}
}
public static void closeConn(Connection conn){//关闭连接,放回数据库连接池
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closePstmt(PreparedStatement pstmt){
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
二、在dao包里从数据库取出数据
package javaweb.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import cn.hutool.json.JSONUtil;
import javaweb.bean.News;
import javaweba.DbUtils;
public class Newsdao {
public List<News> find(Integer type,String search,Integer page,Integer rows){
List<News> list=new ArrayList<News>();//创建news类型的链表用来存储后面的数据
StringBuilder sql=new StringBuilder();//使用哪个StringBuilder来拼接字符串
List<Object> params=new ArrayList<Object>();//创建参数表(这个参数主要是sql语句里面的问号,先将参数存进去,便于统一设置问号的值)
// 编号 标题 作者 时间 上传时间 阅读次数 类型
sql.append("select id,title,author,time,top,readed,type");//接下来开始拼接字符串(拼接字符串的目的主要是为了后面好修改字符变量)
sql.append(" from t_news");//从t_news表里查询
sql.append(" where 1=1");//这里的1=1恒为真(目的是为了后面用and的添加查询语句(也就是限制条件))
if(type!=null) {//不为空,就添加查询语句,并把参数放在params链表里(如果type为空的话就不要再添加语句去查询了)
sql.append(" and type=?");
params.add(type);
}
if(search!=null&&search.trim().length()>0) {//如果search不为空的话,先去掉左右两边空格,再判断长度是否大于0,大于0的话就说明有值,为0的话search就由空格组成,不应该继续添加语句
sql.append(" and title like concat('%',?,'%')");//模糊查询(LIKE) CONCAT(字符串连接函数) 左右两边可以为任意字符 中间必须是search的元素//
params.add(search);//将查询的条件放入params中 这里简单的写了查询条件,都为search 三个语句都是储存相同的值
sql.append(" and content like concat('%',?,'%')");
params.add(search);//将查询的条件放入params中
sql.append(" and author like concat('%',?,'%')");
params.add(search);//将查询的条件放入params中
}
sql.append(" order by top desc,time desc");//拼接按top,time降序排列
sql.append(" limit ?,?");//这个是访问页数
params.add((page-1)*rows);//前一页的条数
params.add(rows); //后一页的条数
//前一页末尾到后一页的末尾
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
conn=DbUtils.getConnection();//使用DbUtils从连接池申请一个连接
pstmt=conn.prepareStatement(sql.toString());//执行sql语句
for(int i=0;i<params.size();i++) {//就params值一个一个取出来,用来设置sql语句中?的值
pstmt.setObject(i+1, params.get(i));
}
rs=pstmt.executeQuery();//获取结果解
while(rs.next()) {
News news=new News();//创建一个News的对象news 用来封装数据
news.setId(rs.getInt(1));//将数据都封装的news里面 例如id,title,author,time,top,readed,type
news.setTitle(rs.getString(2));
news.setAuthor(rs.getString(3));
Timestamp t=rs.getTimestamp(4);//由于时间可能为空,这里必须用Timestamp特殊处理一下
if(t!=null) {//如果时间为空,就不要将时间封装到里面了
news.setDate(new Date(t.getTime()));
}
t=rs.getTimestamp(5);//这里的时间也要特殊处理一下
if(t!=null) {
news.setTop(new Date(t.getTime()));
}
news.setReaded(rs.getInt(6));//将readed封装进去
news.setType(rs.getInt(7));//将readed封装进去
list.add(news);//将news封装的数据放在链表里
}
} catch (Exception e) {
// TODO: handle exception
}finally {
DbUtils.CloseConn(conn);//关闭数据库连接,将连接放回连接池
DbUtils.ClosePstmt(pstmt);
}
return list;
}
public static void main(String[] args) {
Newsdao dao=new Newsdao();
List<News> list=dao.find(1, null, 1, 20);
System.out.println(JSONUtil.toJsonPrettyStr(list));//测试从数据库取出的数据
}
}
总结
使用DbUtils来封装数据,可以减少连接数据库时的重复操作,减少代码量