BeanHandler和BeanListHandler结果集处理器
接续第五讲:Javaweb JDBC数据库连接 第五讲 :数据库连接池和Apache DBUtils
此时我们已经已经拥有了创建数据库连接池的类 DataSourceUtil
- :创建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 + '\'' +
'}';
}
}
- 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();
}
}
- 视图层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
请求界面:
打印台
数据库:
BeanListHandler
请求界面:
打印台:
注意:
- 开始项目前请导入相应的依赖包:下载链接
如果未导logging 和pool包会出现
:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
————————————————org/apache/commons/pool2/PooledObjectFactory
- 未开启驼峰映射:
createTime为空
- 数据库的时间类型和代码设置的不同 导致报错:(注意代码的数据类型是否与数据库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;
}