java.sql.SQLException: Cannot create pojo.User: pojo.User Query: select id,u

执行UserServiceTest中的login方法:查询一个数据库中已存在的用户信息

class UserServiceTest {
    UserService userService = new UserServiceImpl();

    @Test
    void login() {
        System.out.println(userService.login(new User(null,"aaj123","666333",null)));//数据库中有此用户数据
    }

控制台报错如下:
无法创建user对象
原因:User类中缺少空参构造器。

项目背景:自定义数据库连接工具类JdbcUtils、数据库操作接口及实现类(BaseDao、UserDao/UserDaoImpl、User Service/UserServiceImpl),测试UserService接口中的校验用户登录信息的方法。

具体分析:我这里的测试类中的login方法的底层实现过程如下

@Test
    void login() {
        System.out.println(userService.login(new User(null,"aaj123","666333",null)));//正确用户信息测试
    }

1、测试类中的login()方法,将我们传入的user对象作为参数,传入UserServiceImpl实现类的login方法

public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
    public User login(User user) {
        return userDao.queryUserByUsernameAndPassword(user.getUsername(),user.getPassword());
    }
}

2、此类中的login方法中会调用数据操作层UserDaoImpl的queryUserByUsernameAndPassword方法

public class UserDaoImpl extends BaseDao implements UserDao {
    @Override
    public User queryUserByUsernameAndPassword(String username, String password) {
        String sql = "select id,username,password,email from t_user where username = ? and password = ?";
        return queryForOne(User.class,sql,username,password);
    }
}

3、这个方法里又调用了数据操作层BaseDao抽象类的queryForOne方法(传入bean类型,sql语句,参数
),会返回一个对象(类型为前面传入的bean类型)

public abstract class BaseDao {
    //使用DBUtils操作数据库
    private QueryRunner queryRunner = new QueryRunner();
    //查询返回一个javaBean的sql语句
    public <T> T queryForOne(Class<T> type, String sql,Object ... args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.query(connection,sql,new BeanHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
        }
        return null;
    }

从这个流程里来看,程序从我们传入的User对象中获取username、password,在第3步的时候,作为参数,传入queryRunner的query方法中,进行数据库查询,并返回一个Bean对象。

bean对象的生成原理:servlet利用反射对获取的属性值进行封装,过程中会用到User类的空参构造方法及对应的getter、setter方法。所以当控制台报错“无法创建User对象”的时候,可以检查一下我们的bean类是否是一个合格的bean。

最后,我们来简单的复习一下JavaBean
1、JavaBean是一种Java语言写成的可重用组件。
2、javaBean,是指符合如下标准的Java类:
类是公共的
有一个无参的公共的构造器
有属性,且有对应的get、set方法
3、使用场景:用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值