DBUtils使用query查询时出现无法将实体类属性赋值的问题

近期在写项目,出现了一个小问题,以此记录。

一开始使用的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

String sql = "select id,user_name,login_name,user_password,user_level,user_lock from users_t";

// 创建一个BeanProcessor对象

// GenerousBeanProcessor 仅仅重写了父类BeanProcessor的mapColumnsToProperties方法

BeanProcessor bean = new GenerousBeanProcessor();

// 将GenerousBeanProcessor对象传递给BasicRowProcessor

RowProcessor processor = new BasicRowProcessor(bean);

// 最后使用GenerousBeanProcessor的mapColumnsToProperties处理表字段到javabean的属性映射

Users rs = runner.query(sql, new BeanHandler<Users>(Users.class, processor));

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

// BeanProcessor 有两个构造方法,可以传入一个HashMap集合

// HashMap 规定了表字段映射到Javabean的哪个属性,即key为字段名称,value为对应的javabean属性

// map.put(表字段名称, Javabean属性名称)

Map<String, String> map = new HashMap<String, String>();

map.put("yhmid", "id");

map.put("charUsername", "userName");

map.put("charLoginName", "loginName");

map.put("charPassword", "userPassword");

map.put("intLevel", "userLevel");

map.put("boolLock", "userLock");

// 用构建好的HashMap建立一个BeanProcessor对象

BeanProcessor bean = new BeanProcessor(map);

RowProcessor processor = new BasicRowProcessor(bean);

Users rs = runner.query(sql, new BeanHandler<Users>(Users.class, processor));

return rs;

所以 更改query方法的代码,加一个processor对象成功解决。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值