MyBatis实现修改数据

1 问题
通过MyBatis实现修改数据,配置的映射是:


UPDATE
t_user
SET
password = #{password},
phone = #{phone},
email = #{email}
WHERE
id=#{id}

所以,如果调用该功能时,假设参数中并没有封装phone的数据,则默认为null,最终数据表中该记录的phone字段将被赋null值。

2 解决目标
如果调用该功能时,没有提供新的phone的数据,则不修改原有的phone数据,对于password、email的数据也是同样处理!

/**

  • 修改用户数据,不支持修改用户名
  • @param user 必须封装被修改的用户的ID,
  • 不需要封装用户名,
  • 对于phone、email、password的字段,
  • 如果需要修改,则封装新的值,
  • 如果不需要修改,则无须封装值
  • @return 如果修改完成,则返回1,
  • 如果需要修改的数据不存在,则返回0。
    */
    Integer updateUserInfo(User user);
    3 实现思路
    先通过ID查询被修改的用户数据,在执行修改之前,对新数据进行判断,如果某些字段为null值,则使用从数据表中查询到的数据封装进去即可。

即:假设修改id=1的数据,先查询这条数据,以手机号为例,假设从数据表中查询到的手机号是13900139001,如果修改时,使用的User对象中没有封装手机号码,则使用则查询到的手机号码封装到User对象中,最终在执行修改时,User对象中会包含与数据表中一致的手机号码,则可以实现设计目标。

4 实现步骤
4.1 在持久层实现根据ID查询数据的功能
在UserMapper.java接口中添加新的抽象方法:

User findUserById(Integer id);
在UserMapper.xml中配置映射。

4.2 创建业务层接口
创建cn.tedu.ssm.service.IUserService接口,添加所有持久层已经实现的方法:

4.3 创建业务层实现类
创建cn.tedu.ssm.service.UserServiceImpl类,实现以上业务层接口,在类中声明private UserMapper userMapper;并使用@Resource进行注解,还需使用@Serivce(“userService”)对类进行注解,实现过程中,直接调用持久层来完成,暂时不编写业务逻辑。

4.4 测试
使用单元测试

MyBatis 动态SQL
1基本概念
在使用MyBatis时,配置映射文件(.xml)时,使用的SQL语句可以添加一些语句,从而使得最终的SQL语句是可变的!

2 基本使用
在编写映射中的SQL语句时,例如可以添加进行判断,使得SQL语句中的其中一部分会根据判断条件来决定是否需要。例如:


UPDATE
t_user
SET
password = #{password},

phone = #{phone},

email = #{email}
WHERE
id=#{id}

3 练习if的使用
3.1 设定目标
在项目中,需要实现:“修改密码”、“修改手机号码”、“修改电子邮箱”这3个功能

3.2 分析
在映射文件中,使用即可判断到底执行哪个字段的更新操作。

3.3 实现功能

  1. 在UserMapper.java接口中声明名称较为泛化的方法:

Integer update(User user);
2) 配置UserMapper.xml映射:

UPDATE t_user SET password = #{password} phone = #{phone} email = #{email} WHERE id=#{id} 3) 单元测试,测试时需要注意:在User对象,只封装password、phone、email中的某1项,而不要同时封装多项!
  1. 在业务逻辑层IUserService接口中声明抽象方法:

Integer updatePassword(Integer id, String password);

Integer updatePhone(Integer id, String phone);

Integer updateEmail(Integer id, String email);
5) 在业务逻辑层UserServiceImpl实现类中实现以上方法

  1. 单元测试

4 什么时候需要使用动态SQL
如果使用了动态SQL,可以根据参数的值的不同,使得最终执行的SQL语句不同。

使用动态SQL可以使得同一个方法可以实现多种不同的目标,例如以上update()方法最终可以演变为updatePassword()、updatePhone()等方法。

所以,动态SQL是对SQL语句无法编程的一种补充。

但是,动态SQL只是为了便于利用SQL语句,并不是为了解决业务中存在的问题的!

AJAX
1 基本概念
AJAX用于向服务器发出异步请求,并获取结果的技术。

使用AJAX的本质还是在使用JavaScript编程。

可以想像为:AJAX就是一个看不到的浏览器,用于向服务器发出请求,并获取响应结果!

当AJAX请求获取响应结果后,可以结合JavaScript实现对网页的某个部分的显示效果进行更新,俗称“局部刷新”。

使用AJAX相对于传统的请求方式而言,无论是用户体验还是访问效率都会高许多!

使用AJAX必须在原有的页面的基础之上才可以!

2 练习
2.1 设计目标
设计login.html页面,用于模拟登录,在这个页面中添加1个,其中包含2个分别用于输入用户名和密码,还包含1个按钮。

当点击按钮后,将提交POST类型的请求,提交到http://SERVER:PORT/PROJECT/handle_login.do中,假设正确的用户名是ajax,匹配的密码是ajax888,如果提交的数据是正确的,则响应1,如果提交的数据无法登录,则响应0。

最终,如果得到的登录结果是1,使用alert()函数提示登录成功!否则,在输入用户名的输入框下显示登录失败的字样。

2.2 开发
2.2.1 创建项目
创建项目11-AJAX-DAY01-Login,生成web.xml,添加Tomcat Runtime,添加依赖:spring-webmvc,复制spring-mvc.xml文件并检查文件内容,配置web.xml!

2.2.2 显示登录页面
设计登录页面的访问路径:http://SERVER:PORT/PROJECT/login.do

开发实际显示的页面:WEB-INF/login.jsp,页面中至少包括以上设计的标签。

创建cn.tedu.ajax.controller.UserController类,使用@Controller注解,并添加方法以处理请求,处理的方式是直接转发:

@RequestMapping("/login.do")
public String showLogin() {
return “login”;
}
2.2.3 测试访问页面
在浏览器输入网址,需要能够正确的显示登录页面。

2.2.4 服务器端响应
在服务器端的UserController中添加处理“登录”请求的方法,在完成测试之前先使用GET方法的请求:

@RequestMapping(method=RequestMethod.GET,
value="/handle_login.do")
public String handleLogin() {
}
需要接收用户提交的用户名和密码,所以,需要在方法中添加2个参数:

public String handleLogin(String username, String password) {
}
然后,在方法中对用户名和密码进行判断:

if (“ajax”.equals(username) && “ajax888”.equals(password)) {
// 登录成功,响应"1"
} else {
// 登录失败,响应"0"
}
如果需要响应的是一个字符串,而不是响应某个View组件,在处理请求的方法之前添加@ResponseBody注解即可!

@RequestMapping(method=RequestMethod.GET,
value="/handle_login.do")
@ResponseBody
public String handleLogin(String username, String password) {
if (“ajax”.equals(username) && “ajax888”.equals(password)) {
// 登录成功,响应"1"
return “1”;
} else {
// 登录失败,响应"0"
return “0”;
}
}
并且,在spring-mvc.xml中,在根节点下添加:<mvc:annotation-driven />。

2.2.5 测试提交后的登录处理
在浏览器输入网址例如:http://http?/localhost:8080/11-AJAX-DAY01-Login/handle_login.do?username=ajax&password=ajax888

测试完成后,可将处理请求的请求类型调整为POST。

2.2.6 发出AJAX请求
为了便于使用,先创建一个函数,专门用于获取XMLHttpRequest对象:

然后,在登录界面中为2个输入框都设置id属性:

然后,再编写发出请求的函数,以备调用:

function handleLogin() {
var xhr = getXMLHttpRequest();
var u = document.getElementById(“username”).value;
var p = document.getElementById(“password”).value;
var url = “handle_login.do?username=” + u + “&password=” + p;
xhr.onreadystatechange = funtion() {
if (xhr.readyState == 4 && xhr.status == 200) {
alert(xhr.responseText);
}
//else {
// alert(“出错啦!!!”);
//}
};
xhr.open(“GET”, url, true);
xhr.send();
}
在“登录”中配置οnclick=“handleLogin()”。

AJAX的使用方式
核心对象
在AJAX中,使用XMLHttpRequest对象发出请求,并获取响应结果。获取对象的方式与Java中相同:

var xhr = new XMLHttpRequest();
以上语法适用于主流浏览器,包括:Chrome、FireFox、Safari、IE 8+,对于低版本的IE浏览器,需要:

var xhr = new ActiveXObject(“Microsoft.XMLHttp”);
为了保证兼容低版本的IE,应该:

var xhr;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject(“Microsoft.XMLHttp”);
}
核心对象的使用
如果需要发出请求,必须先调用XMLHttpRequest对象的open(method, url, isAsync)函数,然后调用send()函数。

如果需要处理结果,还需要配置XMLHttpRequest对象的onreadystatechange属性,它的值是另一个处理函数,即需要另编写一个函数决定如何处理响应结果。

所以,正确的使用方式:先配置onreadystatechange属性,然后调用open()函数,最后调用send()函数!

核心对象的属性
a) onreadystatechange:值是处理响应结果的函数

b) readyState:准备状态,其值是数值,共5个,分别是:0-尚未初始化、1-与服务器已经建立连接、2-已发出请求、3-请求已接收,并正在处理、4-已响应

c) status:响应码,例如200、404

d) responseText:服务器响应的正文

e) responseXML:服务器响应的XML

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值