第一次写博客,mark下学到的东西。
最近在做个东西,需要验证用户的登陆信息。以前我是直接用where去数据库里面查,因为考虑到要识别出用户名和密码具体的错误情况我在数据库里面写了个存储过程:
高兴各位童鞋批评指正
DROP PROCEDURE IF EXISTS db_shop.check_user;
CREATE PROCEDURE db_shop.check_user ( IN uname VARCHAR(15) , IN passwd VARCHAR(15), OUT re_state INTEGER )
BEGIN
DECLARE t_passwd VARCHAR(15);
DECLARE t_uname VARCHAR(15);
DECLARE done INT DEFAULT FALSE;
DECLARE cur1 CURSOR FOR SELECT u_name , u_passwd FROM db_shop.tb_user; -- 定义游标从表tb_user 中取出用户名和密码
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET re_state = 0;
OPEN cur1;
check_loop: LOOP
FETCH cur1 INTO t_uname , t_passwd; -- 把游标中的用户名、密码取出放入变量
IF done THEN
SET re_state = 1;
LEAVE check_loop;
END IF;
IF !STRCMP(t_uname,uname) THEN
IF !STRCMP(t_passwd,passwd) THEN
SET re_state = 2;
ELSE
SET re_state = 3;
END IF;
LEAVE check_loop;
ELSE
SET re_state = 100;
END IF;
END LOOP;
CLOSE cur1;
END;
这个写好自己用mybatis 调用的时候各种问题各种出,现在调对的方式如下:
UserMapper.xml
<select id="check_user" statementType="CALLABLE" resultType="java.util.Map" parameterType="java.util.Map">
{call db_shop.check_user(
#{uName,mode=IN,jdbcType=VARCHAR},
#{uPasswd,mode=IN,jdbcType=VARCHAR},
#{re_State,mode=OUT,jdbcType=INTEGER}
)}
</select>
测试方法:
@Test
public void check_user() {
Map<String, Object> map = new HashMap<String, Object>();
User user = new User("yhj", "111");
map = userService.check_user(user);
System.out.println(map.get("re_State"));
System.out.println("end");
}
这里调了Service的接口,刚学的MVC想着有机会就用一下,练练手。
service层:
@Override
public Map<String, Object> check_user(User user) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("uName", user.getuName());
map.put("uPasswd", user.getuPasswd());
userDao.check_user(map);
return map;
}
参数用map的形式传递,这里就转换了下参数的格式。
结果:
补充:
上面的参数使用map传递和接收的,一开始我是封装到一个User对象中,在日志中查询显示的结果是 没有 “re_State” 的setter方法。
然后我重新建了一个model,用来测试参数和结果用对象传递,测试是可以的。