BeanHandler和BeanListHandler结果集处理器

此时我们已经已经拥有了创建数据库连接池的类 DataSourceUtil

  1. :创建dao层数据库操作类(如果项目比较大 可以使用三层结构 在dao层创建 接口 以及相应的的实现类)

代码:UserDao

public class UserDao {
	  /**
     * QueryRunner
     * 查询执行器,提供对sql语句操作的API
     * update(String sql,Object...params) 可执行 增-INSERT、删-DELETE、改-UPDATE
     * query(String sql,ResultSetHandler rsh,Object...params) 可执行 查询-SELECT
     */
    private QueryRunner queryRunner=new QueryRunner(DataSourceUtil.getDataSource());
    //驼峰映射
    private BeanProcessor bean=new GenerousBeanProcessor();
    private RowProcessor rowProcessor=new BasicRowProcessor(bean);

    public DUser findByID(int id){
        String sql="select * from user where id = ?";
        //Duser是自己创建的类存取数据用
        DUser dUser=null;
        try {
            //无驼峰映射写法
            //dUser=queryRunner.query(sql, new BeanHandler<>(DUser.class),id);

            dUser=queryRunner.query(sql, new BeanHandler<>(DUser.class, rowProcessor),id);

			/**
             * ResultSetHandler
             * 结果集处理类,执行处理一个结果集对象,将数据转变并处理为任何一种形式
             * BeanHandler 结果集中的第一行数据封装到一个对应的JavaBean实例
             * BeanListHandler 结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里
             * MapHandler 结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
             * MapListHandler 结果集中的每一行数据都封装到一个Map里,然后再存放到List
             * ScalarHandler 结果集中第一行数据指定列的值,常用来进行单值查询
             */
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  dUser;
    }
     public List<DUser> list(){
        String sql="select * from user";
        List<DUser> list=null;
        try {
            list=queryRunner.query(sql, new BeanListHandler<>(DUser.class,rowProcessor));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

Duser

import java.util.Date;

public class DUser {

    private int id;
    private String phone;
    private String pwd;
    private  int sex;
    private  String img;
    private Date createTime;
    private int role;
    private String username;
    private String wechat;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public int getRole() {
        return role;
    }

    public void setRole(int role) {
        this.role = role;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getWechat() {
        return wechat;
    }

    public void setWechat(String wechat) {
        this.wechat = wechat;
    }

    @Override
    public String toString() {
        return "DUser{" +
                "id=" + id +
                ", phone='" + phone + '\'' +
                ", pwd='" + pwd + '\'' +
                ", sex=" + sex +
                ", img='" + img + '\'' +
                ", createTime=" + createTime +
                ", role=" + role +
                ", username='" + username + '\'' +
                ", wechat='" + wechat + '\'' +
                '}';
    }
}
  1. service层创建相应的接口 以及实现方法
    代码: 接口 ————UserService
public interface UserService {
	//方法名
    DUser findByID(int id);
    List<DUser> list();
    }
实现方法————UserServiceimpl
public class UserServiceimpl implements UserService {
    private  UserDao userDao=new UserDao();
    //具体方法
    @Override
    public DUser findByID(int id) {
        return userDao.findByID(id);
    }
        
    @Override
    public List<DUser> list() {
        return userDao.list();
    }
    
}
  1. 视图层servlet调用
    代码:UserServlet
@WebServlet(name= "userServlet",urlPatterns = "/user")
public class UserServlet extends HttpServlet {
    private UserService userService=new UserServiceimpl();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");

        if (method.equals("findById")) {
            String idStr = req.getParameter("id");
            int userid = Integer.parseInt(idStr);

            DUser dUser = userService.findByID(userid);
            System.out.println(dUser.toString());
        }
		
		 if (method.equals("list")) {

            List<DUser> list=userService.list();
            System.out.println(list.toString());
        }
    }
}

截图:

BeanHandler

请求界面:

java中SharedData用法 java datahandler_结果集


打印台

java中SharedData用法 java datahandler_java中SharedData用法_02


数据库:

java中SharedData用法 java datahandler_数据库_03

BeanListHandler

请求界面:

java中SharedData用法 java datahandler_数据库_04


打印台:

java中SharedData用法 java datahandler_数据库_05

注意:

  1. 开始项目前请导入相应的依赖包:下载链接

java中SharedData用法 java datahandler_数据库_06

如果未导logging 和pool包会出现

:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

————————————————org/apache/commons/pool2/PooledObjectFactory

java中SharedData用法 java datahandler_database_07

  1. 未开启驼峰映射:

createTime为空

java中SharedData用法 java datahandler_数据库_08

  1. 数据库的时间类型和代码设置的不同 导致报错:(注意代码的数据类型是否与数据库Type 相对应)
    Cannot set createTime: incompatible types, cannot convert java.time.LocalDateTime to java.util.Date

总结

DbUtils 中的核心类/接口

QueryRunner

查询执行器,提供对sql语句操作的API

update(String sql,Object…params) 可执行 增-INSERT、删-DELETE、改-UPDATE

query(String sql,ResultSetHandler rsh,Object…params) 可执行 查询-SELECT

ResultSetHandler

结果集处理类,执行处理一个结果集对象,将数据转变并处理为任何一种形式

BeanHandler 结果集中的第一行数据封装到一个对应的JavaBean实例
BeanListHandler 结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里
MapHandler 结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
MapListHandler 结果集中的每一行数据都封装到一个Map里,然后再存放到List
ScalarHandler 结果集中第一行数据指定列的值,常用来进行单值查询

例子:

QueryRunner queryRunner = new QueryRunner(DataSourceUtil.getDataSource());

public User findById(int id)  {
        String sql = "select * from user where id = ? ";
        User user = null;
        try {
        //processor 为驼峰映射具体方法见顶部
            user = queryRunner.query(sql,new BeanHandler<>(User.class,processor),id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return user;
}