总结
- 数据库查询结果封装为类对象, 使用template.queryForObject。数据表与列名与类的实例域对应
- 表单提交信息封装为类对象, 使用BeanUtils.populate。表单中每条数据的name属性与类的实例域对应
在进行数据库查询时, 往往将查询到的数据封装在一个对象中, 因此根据数据库表的结构, 创建一个JavaBean, 将每条查询结构都封装为一个JavaBean对象
注意: javaBean的实例域必须与数据库表的列名完全一致, 才可以实现数据自动打包!!
如数据表为:
用户数据表
User类的定义中, 实例域就应该是:
private int id;
private String username;
private String password;
使用下面的语句进行查询并自动打包
User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), loginUser.getUsername(), loginUser.getPassword());
// 结果是:
User{id=1, username='superbaby', password='123'}
如果User类中一个变量名定义的不一样, 比如username写成了name, 那么结果就变成了了
User{id=1, username='null', password='123'}
因为从查询结果中得到的username值找不到对应的存储位置, 因此无法存入User类对象, 由于类对象name域没有被赋值, 结果就是默认初始化的值, 就是null
类似的, org.apache.commons.beanutils包下的BeanUtils工具类中有一个方法popular可以实现将map中的数据根据属性对应赋值到对象中, 常用于在login.jsp点击submit按钮提交请求后, 将跳转到对应的servlet进行处理, 在servlet中, 使用
Map<String, String[]> map = request.getParameterMap(); // 获取所有的数据: user:xxx; password:xxx; verifcode:xxx
可以将所有表单数据封装在map集合中, 其中map的键是jsp页面中表单的"name", 如果这里建的名称与User类中变量的名字不一致, 赋值后的user对象这个属性就会为空.
image.png比如, User类中用String name标识用户名, 但是在表单中这里写成了name="username", 那么最后user对象中name域就为null。很好理解, 因为没有对应的值呀。
网友评论