JDBC - (06) BaseDao工具类封装

在这里插入图片描述

JDBC -(06)BaseDao工具类封装

基本上每一个数据表都应该有一个对应的DAO接口及其实现方法,发现对所有表的操作(增删改查)代码重复度很高,所以可以提取公共代码,给这些DAO的实现类可以抽取一个公共的实现类,我们称为BaseDao

插入操作:
在这里插入图片描述

修改操作:

image-20230317063943340

删除操作:

image-20230317064203124

查询操作:

在这里插入图片描述

1. BaseDao工具类封装

BaseDao.java

package com.julissa.api.utils;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *	基于JDBC工具类JdbcUtilsV2基础上进行Dao层的封装
 * 
 *  两个方法:
 *      增删改的通用方法 调用方法 BaseDao.executeUpdate(sql,params,...)
 *      查询的通用方法  调用方法 BaseDao.executeQuery(sql,params,...) 或者BaseDao.executeQuery(sql)
 * 
 */
public class BaseDao {
    /**
     * 增删改通用方法
     * @param sql 带占位符的SQL语句
     * @param params 占位符的值,传入占位符的值顺序与占位符位置顺序一致
     * @return 返回结果影响行数的值
     */
    public static int executeUpdate(String sql,Object... params) throws SQLException {

        //获取数据库连接
        Connection connection = JdbcUtilsV2.getConnection();

        //创建prepareStatemet对象并传入sql语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //给动态值设置值
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i+1,params[i]);
        }

        //执行sql语句,并获取返回结果
        int row = preparedStatement.executeUpdate();

        //关闭资源
        preparedStatement.close();
        //是否回收连接,考虑是不是事务
        if(connection.getAutoCommit()){
            //没有开始事务.正常回收连接
            JdbcUtilsV2.recycleConnection();
        }
        //返回影响行数
        return row;
    }

    /**
     *  查询的通用方法
     * @param sql 查询的SQL语句,可以是带占位符,也可以不带
     * @param params 传入带占位符SQL语句时占位符的值,传入占位符的值顺序与占位符位置顺序一致
     * @return 返回值类型是一个List<Map>类型的数据
     * @throws SQLException
     */
    public static List<Map> executeQuery(String sql, Object... params) throws SQLException {

        //获取数据库连接
        Connection connection = JdbcUtilsV2.getConnection();

        //创建prepareStatemet对象并传入sql语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //给动态值设置值
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i+1,params[i]);
        }

        //执行sql语句,并获取返回结果
        ResultSet resultSet = preparedStatement.executeQuery();

        //解析结果集,将结果集中的数据封装到一个List<Map>集合中
        List<Map> list = new ArrayList<>();

        //获取列的信息对象
        //TODO:metaData装的当前结果集列的对象,(可以根据列的下表获取列的名称,获取列的数量)
        ResultSetMetaData metaData = resultSet.getMetaData();

        //获取列的数量
        int columnCount = metaData.getColumnCount();

        while (resultSet.next()) {
            Map<String,Object> map = new HashMap<>();

            //自动遍历列,从1开始
            for (int i = 1; i <= columnCount; i++) {
                //根据指定下标获取值
                Object value = resultSet.getObject(i);
                //获取指定列的名称
                //getColumnLabel:会获取别名,如果没有再获取列名
                String key = metaData.getColumnLabel(i);
                map.put(key,value);
            }
            list.add(map);
        }

        //关闭资源
        resultSet.close();
        preparedStatement.close();
        //是否回收连接,考虑是不是事务
        if(connection.getAutoCommit()){
            //没有开始事务.正常回收连接
            JdbcUtilsV2.recycleConnection();
        }
        //返回
        return list;
    }
}

2. 测试

2.1 测试插入操作

@Test
public void testInsert() throws Exception {
        /**
         * 向t_user表插入一条数据
         * account test4
         * password test4
         * nickname 测试人员4
         */
    String account = "test4";
    String password = "test4";
    String nickname = "测试人员4";
    //编写sql
    String sql = "insert into t_user(account,password,nickname) values(?,?,?)";
    //调用BaseDao中的方法,返回影响行数
    int row = BaseDao.executeUpdate(sql, account, password, nickname);
    //判读是否插入成功 1成功
    if(row != 1) {
        System.out.println("插入数据失败");
    }else {
        System.out.println("插入数据成功");
    }
}

执行结果:

image-20230317073443684

2.2 测试修改操作

@Test
public void testUpdate() throws Exception {
        /**
         * 修改t_user表中test4用户的密码
         * account test4
         * password test123
         **/
    String account = "test4";
    String password = "test123";

    //编写sql
    String sql = "update t_user set password=? where account=?";

    int i = BaseDao.executeUpdate(sql, password, account);
    //判读是否修改成功 1成功
    if(i != 1) {
        System.out.println("修改数据失败");
    }else {
        System.out.println("修改数据成功");
    }
}

执行结果:

在这里插入图片描述

2.3 测试删除操作

@Test
public void testDelete() throws Exception {
        /**
         * 删除t_user表中id为3658的用户信息
         * id 3658
         */
    String id = "3658";

    //编写sql
    String sql = "delete from t_user where id=?";
    int i = BaseDao.executeUpdate(sql, id);
    //判读是否插入成功 1
    if(i != 1) {
        System.out.println("删除数据失败");
    }else {
        System.out.println("删除数据成功");
    }
}

执行结果:

image-20230317074158385

2.4 测试查询操作

查询所有用户信息

@Test
public void testSelect() throws Exception {
        /**
         *
         * 查询t_user表中所有的信息
         */
    //编写sql
    String sql = "select id,account,password,nickname from t_user";
    //调用BaseDao中的executeQuery,返回一个结果集
    List<Map> list = BaseDao.executeQuery(sql);
    //遍历集合
    for (Map map:
         list) {
        System.out.println(map);
    }
}

执行结果:

image-20230317074325171

查询用户id为2的用户信息

@Test
public void testSelect2() throws Exception {

        /**
         *
         * 查询t_user表中id为2的用户信息
         */
    //编写sql
    String sql = "select id,account,password,nickname from t_user where id = ?";
    //调用BaseDao中的executeQuery,返回一个结果集
    List<Map> list = BaseDao.executeQuery(sql,2);
    //遍历集合
    for (Map map:
         list) {
        System.out.println(map);
    }
}

执行结果:

image-20230317074434510

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值