近期在写项目,出现了一个小问题,以此记录。
一开始使用的dbutils1.3.jar 当我的dao层有这样的方法
public T query(String sql, Object... args) throws SQLException {
Connection conn = DataSourceUtils.getConnection();
return queryRunner.query(conn, sql, new BeanHandler<>(clazz), args);
}
数据库表结构
java实体类设计
public class User {
private int id;
private String account;
private String passWord;
private String name;
private String sex;
private String idCard;
private String address;
private String phoneNumber;
//构造器
//get set方法
}
当我在测试登陆功能时,肯定要通过一条查询语句返回一个实体类对象,如下:
@Override
public User login(String username, String password) throws SQLException {
String sql = "select * from t_userinfo where user_account = ?"
+ "and user_password = ?";
User user = query(sql,username,password);
return user;
}
测试的时候,发现返回的User对象不为null,但是成员变量却都是没有被赋值。也就是说:对象被创建了,但成员变量没正确赋值。
思前想后想到了MyBatis中有数据库字段与实体类属性之间的自动映射机制,果不其然,原因就是:实体类的属性名与数据库字段不对应,无法正确映射匹配。
解决方式为:在dbutils的1.6版本之后,官方给出了当字段名与成员属性名不一致时的解决方案,具体解决方案有2个.
情况一:只涉及到下划线,表字段名用下划线间隔,现在要封装到Javabean中Users类(代码见上),其中属性使用驼峰命名。可以用dbutils1.6提供的BeanProcessor类的子类GenerousBeanProcessor。
1 2 3 4 5 6 7 8 9 10 |
return rs; |
情况二:完全改变表字段到Javabean属性的映射(如表users_m字段:[yhmid],[charUsername],[charLoginName],[charPassword],[intLevel],[boolLock])映射到Users类(代码同上):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
所以 更改query方法的代码,加一个processor对象成功解决。