执行UserServiceTest中的login方法:查询一个数据库中已存在的用户信息
class UserServiceTest {
UserService userService = new UserServiceImpl();
@Test
void login() {
System.out.println(userService.login(new User(null,"aaj123","666333",null)));//数据库中有此用户数据
}
控制台报错如下:
原因: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提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。