用IDEA进行Java后台开发(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40998254/article/details/84591592

在上一篇用IDEA进行Java后台开发(三)中通过C3P0和dbUtils已经实现了mySql的连接和简单的数据查询,本篇主要学习一下DBUtils的QueryRunner实现数据库增删改查。

首先感谢一下https://blog.csdn.net/a911711054/article/details/77719685这篇博客的作者,写的真的很详细,万分感谢!

下面以上一篇的user表为操作表,写了一个数据库操作类UserBeanDao,如下:

package com.xiaoxiao9575.servletdemo.dao.impl;

import com.xiaoxiao9575.servletdemo.dao.UserBeanDao;
import com.xiaoxiao9575.servletdemo.entities.UserBean;
import com.xiaoxiao9575.servletdemo.utils.JDBCUtils;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class UserBeanDaoImpl implements UserBeanDao {

    private static Connection con;
    private static UserBeanDaoImpl instance;

    public static UserBeanDaoImpl getInstance() throws SQLException {
        if(instance == null){
            instance = new UserBeanDaoImpl();
        }
        if (con == null){
            con = JDBCUtils.getConnection();
        }
        return instance;
    }

    /**
     *  删除
     *  删除user表中的指定对象
     */
    public boolean delete(String userName)throws SQLException {
        //创建QueryRunner类对象
        QueryRunner qr = new QueryRunner();
        //写删除的SQL语句
        String sql = "DELETE FROM user WHERE usrId=?";
        //调用QueryRunner方法update
        int row = qr.update(con, sql, userName);
        DbUtils.closeQuietly(con);
        //row>0代表成功
        return row>0;
    }

    /**
     *  修改
     *  定义方法,使用QueryRunner类的方法update将数据表的数据修改
     */
    public boolean update(UserBean userBean)throws SQLException{
        //创建QueryRunner类对象
        QueryRunner qr = new QueryRunner();
        //写修改数据的SQL语句
        String sql = "UPDATE user SET userName=?,userPhone=?,userPwd=? WHERE userId=?";
        //定义Object数组,存储?中的参数
        Object[] params = {userBean.getUserName(),userBean.getUserPhone(),userBean.getUserPwd(),userBean.getUserId()};
        //调用QueryRunner方法update
        int row = qr.update(con, sql, params);
        System.out.println(row);
        DbUtils.closeQuietly(con);
        //row>0代表成功
        return row>0;
    }


    /**
     * 添加
     * 定义方法,使用QueryRunner类的方法update向数据表中,添加数据
     */
    public boolean insert(UserBean userBean)throws SQLException{
        //创建QueryRunner类对象
        QueryRunner qr = new QueryRunner();
        String sql = "INSERT INTO user (userName,userPhone,userPwd)VALUES(?,?,?)";
        //将三个?占位符的实际参数,写在数组中
        Object[] params = {userBean.getUserName(),userBean.getUserPhone(),userBean.getUserPwd()};
        //调用QueryRunner类的方法update执行SQL语句
        int row = qr.update(con, sql, params);
        System.out.println(row);
        DbUtils.closeQuietly(con);
        //row>0代表成功
        return row>0;
    }

    /**
     * 查询,BeanHandler
     * 将结果集的第一行数据,封装为JavaBean对象
     * 注意:被封装成数据到JavaBean对象,Sort类必须有空参构造
     * @throws SQLException
     * */
    public UserBean getSingleBean() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM user";
        //调用方法,传递结果集实现BeanHandler
        //BeanHandler(Class<T> type)
        UserBean userBean = qr.query(con, sql,new BeanHandler<>(UserBean.class));
        return userBean;
    }

    @Override
    public UserBean getUserBeanFromUserName(String userName) throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM user where userName=?";
        //调用方法,传递结果集实现BeanHandler
        //BeanHandler(Class<T> type)
        UserBean userBean = qr.query(con, sql,new BeanHandler<>(UserBean.class), userName);
        return userBean;
    }

    /**
     * 查询,BeanListHandler
     * 将数据结果集的每一行数据,封装为JavaBean对象
     * 多个JavaBean对象封装到List集合中
     * @throws SQLException
     * */
    public List<UserBean> getBeanList() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM user";
        //调用方法传递结果集的实现类BeanListHandler
        //BeanListHandler(Class<T> type)
        List<UserBean> list = qr.query(con, sql, new BeanListHandler<>(UserBean.class));
        return list;
    }

    /**
     * 查询,ScalarHandler
     * 对于查询后,只有一个结果
     * @throws SQLException
     * */
    public long getBeansCount() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT COUNT(*) FROM user";
        //调用方法query,传递结果集处理类ScalarHandler
        long count = qr.query(con,sql,new ScalarHandler<Long>());
        return count;
    }

    /**
     * 查询,ArrayHandler
     * 将结果第一行存储到对象数组中Object[]
     * @throws SQLException
     * */
    public Object[] getObjectArray() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM user";
        //调用query执行查询,传递连接对象,SQL语句,结果集处理方式的实现类
        //返回对象数组
        Object[] result = qr.query(con, sql,new ArrayHandler());
        return result;
    }

    /**
     * 查询,ArrayListHandler
     * 将结果集的每一行,封装到对象数组中,出现很多对象数组
     * 对象数组存储到List集合
     * @throws SQLException
     * */
    public List<Object[]> arrayListHandler() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql  = "SELECT * FROM user";
        //调用query方法,结果集处理的参数上,传递实现类ArrayListHandler
        //方法返回值 每行是一个数组
        List<Object[]> result = qr.query(con, sql, new ArrayListHandler());
        return result;
    }

    /**
     * 查询,ColumnListHandler
     * 结果集,指定列的数据,存储到List集合中
     * List<Object> 每个列数据类型不同
     * @throws SQLException
     * */
    public List<Object> columnListHandler(String columnName) throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM user";
        //调用方法query,传递结果集实现类ColumnListHandler
        //实现类构造方法,使用字符串的列名
        List<Object> list = qr.query(con, sql, new ColumnListHandler<>(columnName));
        return list;
    }

    /**
     * 查询,MapHandler
     * 将结果集第一行数据,封装到Map集合中
     * Map<键,值> 键:列名 值:这列数据
     * @throws SQLException
     * */
    public Map<String, Object> mapHandler() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM user";
        //调用方法query,传递结果集实现类MapHandler
        //返回值:Map集合,Map接口实现类 泛型
        Map<String,Object> map = qr.query(con, sql,new MapHandler());
        return map;
    }


    /**
     * 查询,MapListHandler
     * 将结果集每一行存储到Map集合,键:列名 值:数据
     * Map集合过多,存储到List集合
     * @throws SQLException
     * */
    public List<Map<String, Object>> mapListHandler() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM user";
        //调用方法query,传递结果集实现类MapListHander
        //返回值List集合,存储的是Map集合
        List<Map<String, Object>> list = qr.query(con, sql,new MapListHandler());
        return list;
    }

}

由于代码中注释写的很详细了,所以这里对代码不说过多的废话了。可以看出dbUtils对数据库操作都需要用一个Handler对象,上述代码只是举个例子,所以所用到的Handler都是dbUtils的jar包中有的,实际开发中可能还需要自定义,举个简单例子:

package com.xiaoxiao9575.servletdemo.handler;

import com.xiaoxiao9575.servletdemo.entities.UserBean;
import org.apache.commons.dbutils.ResultSetHandler;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserHandler implements ResultSetHandler<List<UserBean>> {

    @Override
    public List<UserBean> handle(ResultSet rs) throws SQLException {
        //封装数据,数据从Resultset中获取
        ArrayList<UserBean> list = new ArrayList<UserBean>();
        while(rs.next()){
            UserBean user = new UserBean();
            user.setUserId(rs.getInt("userId"));
            user.setUserName(rs.getString("userName"));
            user.setUserPhone(rs.getString("userPhone"));
            user.setUserPwd(rs.getString("userPwd"));
            list.add(user);
        }
        return list;
    }
    
}

通过上面的Handler就可以直接拿到所需对象的集合了。

最后补充一个以前没有用到的知识点:

interface可以继承interface,并且可以继承多个interface,以前一直以为extends只能继承一个父类,看来是我太无知了,别问我我的java是不是体育老师教得。举个例子:

public interface UserBeanDao extends BaseDao1<UserBean> , BaseDao2<UserBean>, BaseDao3<UserBean>{}

上述代码是正确的!不过如果不是接口而是类的话就不能多继承了,下面的代码就是错的

public class SonClass extends FatherClass1, FatherClass2 {}//常识,错的,不要这样写,一个孩子只能有一个亲爹

猜你喜欢

转载自blog.csdn.net/weixin_40998254/article/details/84591592