简单封装JDBC

jdbc对数据库操作需要好几个步骤,数据库的操作经常用到,所以要将jdbc封装成一个工具类以便使用,下面是自己简单的封装一个jdbc(maven工程)

1.数据库连接配置文件

新建一个mysql。properties文件,woshop是数据库名

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/weshop 
username=root
password=123456

2.创建一个PageBean类,定义分页属性的

package com.by.db;

import lombok.Data;

import java.util.List;
import java.util.Map;
@Data
public class PageBean {
    int page;
    int pageSize;
    int total;
   List<Map> list;
}

3.封装JDBC,创建一个DbTools类

package com.by.db;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.*;
import java.util.*;

/**
 * 封装jdbc
 *
 */
public class DbTools {
    private String username;
    private String password;
    private String url;
    private String driver;

    private static  DbTools instance;
    private DbTools(){
        init();
    }
    public static DbTools getInstance(){
        if (null==instance){
            instance=new DbTools();
        }
        return instance;
    }
    /**
     * 初始号方法
     */
    private void init(){
        InputStream is=this.getClass().getClassLoader().getResourceAsStream("mysql.properties");
        Properties prop=new Properties();
        try {
            prop.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.url=prop.getProperty("url");
        this.password=prop.getProperty("password");
        this.username=prop.getProperty("username");
        this.driver=prop.getProperty("driver");
        //注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            System.out.println("数据库注册驱动失败");
        }
    }

    /**
     * 保存Statement
     * @param sql 要执行的sql语句
     * @return 代表影响的行数,1代表成功,0代表失败
     */
    public int save(String sql){
        return execute(sql);
    }

    /**
     * 保存 使用PreparedStatement
     * @param sql 编译sql
     * @param params  传递sql中的参数
     * @return
     */
    public int save(String sql, Object [] params){
        return excute(sql, params);
    }
    /**
     * 修改
     * @param sql
     * @return  代表影响的行数,1代表成功,0代表失败
     */
    public int updata(String sql){
        return execute(sql);
    }

    /**
     * 修改
     * @param sql 编译sql
     * @param params 传递sql中的参数
     * @return
     */
    public int updata(String sql,Object[] params){
        return excute(sql, params);
    }
    /**
     * 删除
     * @param sql
     * @return 代表影响的行数,1代表成功,0代表失败
     */
    public int delete(String sql) {
        return execute(sql);
    }

    /**
     * 删除
     * @param sql 编译sql
     * @param id 根据id删除
     * @return
     */
    public int delete(String sql, Serializable id){
        return excute(sql,new Object[]{id});
    }
    //Serializable 序列化
    public PageBean queryForPage(String sql, Object[] params, int page, int pageSize) {
        PageBean pageBean = new PageBean();
        //初始连接
        initConn();
        //查询分页结果  分两次查询  1是查询分页的结果  2是查询总记录数
        //计算分页查询的 起始位置
        int begin = (page - 1) * pageSize;
        String tmp = sql + " limit " + begin + "," + pageSize;
        initPst(tmp, params);
        //查询结果
        try {
            ResultSet rs = pstat.executeQuery();
            //获取结果集对象
            ResultSetMetaData metaData = rs.getMetaData();
            //获取总列数
            int count = metaData.getColumnCount();

            List<Map> list = new ArrayList<>();
            //遍历结果
            while (rs.next()) {
                //一行结果  转换成map
                Map map = new HashMap();
                //有多少列取多少个结果
                for (int i = 1; i <= count; i++) {
                    //获取列名
                    String name = metaData.getColumnLabel(i);
                    map.put(name, rs.getObject(name));
                }
                //存储当前行数据
                list.add(map);
            }
            //循环完 所有记录转换为list
            pageBean.setPage(page);
            pageBean.setPageSize(pageSize);
            pageBean.setList(list);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


        //第二次查询 查询总记录数
        tmp = "select count(1) " + sql.substring(sql.indexOf("from"));
        initPst(tmp, params);
        try {
            ResultSet rs = pstat.executeQuery();
            if (rs.next()) {
                //取出总记录数
                int total = rs.getInt(1);
                //计算总页数
                int pageTotal = (total % pageSize == 0) ? (total / pageSize) : (total / pageSize + 1);
                pageBean.setTotal(pageTotal);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            close();
        }


        return pageBean;
    }


    private void initPst(String sql, Object[] params) {
        try {
            pstat = conn.prepareStatement(sql);
            //设置参数
            if (null != params && params.length != 0) {
                for (int i = 1, len = params.length; i <= len; i++) {
                    pstat.setObject(i, params[i - 1]);
                }
            }

        } catch (SQLException e) {
            System.out.println("初始pst语句失败");
        }
    }

    /**
     *
     * @param sql 要执行的insert update delete 语句
     * @return 影响的行数
     */
    private int execute(String sql){
        int rs=0; //默认影响行数为0
        //初始连接
        initConn();
        //创建语句对象

        try {
            stat=conn.createStatement();
            rs=stat.executeUpdate(sql);
        } catch (SQLException e) {
            System.out.println("创建语句失败");
        }finally {
            close();
        }
        return rs;
    }
    private int excute(String sql,Object [] params){
        int rs=0;
        //初始连接
        initConn();
        //创建语句对象
        initPst(sql, params);
        try {
            rs=pstat.executeUpdate();
        } catch (SQLException e) {
            System.out.println("创建语句对象失败");
        } finally {
            close();
        }


        return  rs;
    }
    /**
     * 释放资源
     */
    private void close(){

            try {
                if (null!=rs)
                    rs.close();
                if (null!=stat)
                    stat.close();
                if (null!=pstat)
                    pstat.close();
                if (null!=conn)
                    conn.close();
            } catch (SQLException e) {
                System.out.println("资源释放异常"+e.getMessage());
            }

    }
    private void initConn(){
        try {
            conn=DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            System.out.println("获取数据库链接失败");
        }
    }
    /**
     * 数据库连接对象
     */
    private Connection conn;

    /**
     * 操作简单sql语句对象
     */
    private Statement stat;
    /**
     * 预编译对象
     */
    private PreparedStatement pstat;
    /**
     * 结果集对象
     */
    private ResultSet rs;

}

4.测试JDBC,下面只测试了查询,在Test包下面创建一个测试类DbTest

package com.by;

import com.by.db.DbTools;
import com.by.db.PageBean;
import junit.framework.TestCase;

public class DbTest extends TestCase {

    /**
     * 测试查询
     */
    public void testQuery(){
        int page=1;
        int pageSize=2;

        PageBean bean= DbTools.getInstance().queryForPage("select * from user where status=?",new Object[]{2},page,pageSize);

        System.out.println("------");
    }



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值