MyBatis如何实现修改数据?

    互联网/前端 95次点击 · 1266天前 · 燕子
好用的实现Vue表单验证插件?css如何强制换行和超出隐藏实现? 燕子

1条回答我要回复

    清风醉1266天前

      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 实现功能

      在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项,而不要同时封装多项!
      在业务逻辑层IUserService接口中声明抽象方法:
      Integer updatePassword(Integer id, String password);

      Integer updatePhone(Integer id, String phone);

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

      单元测试
      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类型的请求,提交到中,假设正确的用户名是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 显示登录页面
      设计登录页面的访问路径:

      开发实际显示的页面: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 测试提交后的登录处理
      在浏览器输入网址例如:

      测试完成后,可将处理请求的请求类型调整为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();
      }
      在“登录”中配置Onclick=“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

    请先登录后,再回复