使用DbUtils封装好数据库



提示:以下是本篇文章正文内容,下面案例可供参考

一、使用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来封装数据,可以减少连接数据库时的重复操作,减少代码量

猜你喜欢

转载自blog.csdn.net/qq_45879198/article/details/121444777