JavaEE简单示例——动态SQL之更新操作<set>元素

简单介绍:

在之前我们做的学生管理系统的时候,曾经有一个环节是修改学生的数据。我们在修改的时候是必须将student对象的三个属性全部填入信息,然后全部修改才可以,这样会造成一个问题就是在我们明明只需要修改一个属性的时候却要把全部的属性都要修改,就会造成很多的资源浪费。而<set>标签就能帮助我们动态的判断某一个元素是不是为空值,是否需要修改。

使用方法:

<select id="唯一标识" resultType="结果集封装的实体类">

        update student

        <update>

                <if test="判断条件">

                        修改数据的SQL语句

                </if>

                <if test="判断条件">

                        修改数据的SQL语句

                </if>

        </set>

        where id = #{id}

</update>

代码实现:

SQL映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mappers.dynamicSql">
  <select id="selectByIdOrName" parameterType="student" resultType="student">
    select * from student where 1=1
#                             当id的值不等于null并且id的值不是空字符的时候,就会拼接这个SQL语句
        <if test="id != null and id != ''">
          and id = #{id}
        </if>
#                             当name的值不等于null的时候并且name的值不是空字符串的时候,就会拼接这个SQL语句
        <if test="name != null and name != ''">
#                             注意这个地方是使用了一个concat函数将模糊匹配的百分号和参数进行拼接,在使用的时候注意这个地方不要写错
          and name like concat ('%',#{name},'%')
        </if>
  </select>
    <select id="selectAll" resultType="student">
        select * from student;
    </select>
<!--    动态SQL中的choose元素-->
<!--    当查询的条件满足第一个when的时候,就拼接第一个when里面的SQL语句-->
<!--    当查询的条件满足第二个when的时候,就拼接第二个when里面的SQL语句-->
<!--    当所有的when都不满足的时候,就拼接otherwise里面的SQL语句-->
<!--    当有多个when里面的条件都满足的时候,就拼接最靠上的一条SQL语句,并且不会执行其他when里面的语句-->
    <select id="selectStudentByIdAndName" resultType="student" >
        select * from student where 1=1
        <choose>
            <when test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </when>
            <when test="id != null and id != ''">
                and id = #{id}
            </when>
            <otherwise>
                and password is not null
            </otherwise>
        </choose>
    </select>
<!--    使用<where>来动态的处理where关键字是否添加-->
    <select id="selectByIdAndWhere" resultType="student" parameterType="student">
        select * from student
        <where>
            <if test="name != null and name !=''">
                and name like concat('%',#{name},'%')
            </if>
            <if test="id != null and id !=''">
                and id = #{id}
            </if>
        </where>
    </select>
<!--    使用set标签简化update的代码和运行效率-->
    <update id="updateBySet" parameterType="student">
        update student
            <set>
                <if test="name != null and name != ''">
                    name = #{name},
                </if>
                <if test="password != null and password != ''">
                    password = #{password},
                </if>
            </set>
        where id = #{id}
    </update>
</mapper>

接口类:

package Mappers;

import com.mybatis.POJO.student;

import java.util.List;

public interface dynamicSql {
    List<student> selectByIdOrName(student s);
    List<student> selectStudentByIdAndName(student s);
    List<student> selectByIdAndWhere(student s);
    int updateBySet(student s);
}

测试类:

package Mappers;

import com.mybatis.POJO.Tools.createSqlSession;
import com.mybatis.POJO.student;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class dynamicSqlTest {
    @Test
    public void selectByIdOrName(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
        s.setId(1);
        s.setName("张三");
        List<student> stu = sqlSession.selectList("Mappers.dynamicSql.selectByIdOrName", s);
        for(student student : stu){
            System.out.println(student.toString());
        }
    }
    @Test
    public void selectStudentByIdAndName(){
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s =new student();
//        s.setId(1);
//        s.setName("张三");
        for (student student : dynamicSql.selectStudentByIdAndName(s)) {
            System.out.println(student);
        }
    }
    @Test
    public void selectAll(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        List<student> list = sqlSession.selectList("Mappers.dynamicSql.selectAll");
        for(student student : list){
            System.out.println(student.toString());
        }
    }
    @Test
    public void selectByIdAndWhere(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
//        s.setId(1);
//        s.setName("张三");
        for (student student : dynamicSql.selectByIdAndWhere(s)) {
            System.out.println(student.toString());
        }
    }
//    测试set标签插入数据的方法
    @Test
    public void updateBySet(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
        s.setId(4);
        s.setName("张三");
        int i = dynamicSql.updateBySet(s);
        if(i > 0){
            System.out.println("修改成功!");
        }
    }
}

运行结果:

在我们修改数据之前,我们先来记录一下修改前的数据库文件:

接下来,我们先将id等于4位置的name从“大海”修改成为“小海”并且password不做修改:

我们创建了一个student对象,并且只传递了两个参数,一个id用来定位操作的数据,一个name的值用来修改之前的值:

在执行完程序之后,数据库中的值就被顺利的修改了:

 

那么接下来我们来修改name和password两个的值:

 

只要配置正确,依然可以正确的修改 

注意点:

需要注意的就是我们传入的时候有一个id的值是必须有的,因为通过id才能定位到我们需要修改的行,然后就是SQL语句的拼接和条件的判断。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单JavaEE宿舍管理系统的代码示例,仅供参考: 1. 学生信息表的创建SQL语句: ``` CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生ID', `name` varchar(20) NOT NULL COMMENT '学生姓名', `gender` varchar(10) NOT NULL COMMENT '学生性别', `grade` varchar(10) NOT NULL COMMENT '学生年级', `major` varchar(20) NOT NULL COMMENT '学生专业', `dorm_id` int(11) DEFAULT NULL COMMENT '宿舍ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 2. 宿舍信息表的创建SQL语句: ``` CREATE TABLE `dormitory` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '宿舍ID', `name` varchar(20) NOT NULL COMMENT '宿舍名称', `capacity` int(11) NOT NULL COMMENT '宿舍容量', `occupancy` int(11) DEFAULT NULL COMMENT '宿舍占用数', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 3. 学生信息的添加、修改和删除SQL语句: ``` -- 添加学生信息 INSERT INTO `student` (`name`, `gender`, `grade`, `major`, `dorm_id`) VALUES ('张三', '男', '2018级', '计算机科学与技术', 1); -- 修改学生信息 UPDATE `student` SET `dorm_id`=2 WHERE `id`=1; -- 删除学生信息 DELETE FROM `student` WHERE `id`=1; ``` 4. 宿舍信息的添加、修改和删除SQL语句: ``` -- 添加宿舍信息 INSERT INTO `dormitory` (`name`, `capacity`, `occupancy`) VALUES ('A1', 4, 2); -- 修改宿舍信息 UPDATE `dormitory` SET `capacity`=6 WHERE `id`=1; -- 删除宿舍信息 DELETE FROM `dormitory` WHERE `id`=1; ``` 5. DAO层的代码示例: ```java public interface StudentDao { // 添加学生信息 int addStudent(Student student); // 修改学生信息 int updateStudent(Student student); // 删除学生信息 int deleteStudent(int id); // 查询学生信息 Student getStudentById(int id); // 查询所有学生信息 List<Student> getAllStudents(); } public interface DormitoryDao { // 添加宿舍信息 int addDormitory(Dormitory dormitory); // 修改宿舍信息 int updateDormitory(Dormitory dormitory); // 删除宿舍信息 int deleteDormitory(int id); // 查询宿舍信息 Dormitory getDormitoryById(int id); // 查询所有宿舍信息 List<Dormitory> getAllDormitories(); } ``` 6. Service层的代码示例: ```java @Service public class StudentService { @Autowired private StudentDao studentDao; // 添加学生信息 public boolean addStudent(Student student) { int result = studentDao.addStudent(student); return result > 0; } // 修改学生信息 public boolean updateStudent(Student student) { int result = studentDao.updateStudent(student); return result > 0; } // 删除学生信息 public boolean deleteStudent(int id) { int result = studentDao.deleteStudent(id); return result > 0; } // 查询学生信息 public Student getStudentById(int id) { return studentDao.getStudentById(id); } // 查询所有学生信息 public List<Student> getAllStudents() { return studentDao.getAllStudents(); } } @Service public class DormitoryService { @Autowired private DormitoryDao dormitoryDao; // 添加宿舍信息 public boolean addDormitory(Dormitory dormitory) { int result = dormitoryDao.addDormitory(dormitory); return result > 0; } // 修改宿舍信息 public boolean updateDormitory(Dormitory dormitory) { int result = dormitoryDao.updateDormitory(dormitory); return result > 0; } // 删除宿舍信息 public boolean deleteDormitory(int id) { int result = dormitoryDao.deleteDormitory(id); return result > 0; } // 查询宿舍信息 public Dormitory getDormitoryById(int id) { return dormitoryDao.getDormitoryById(id); } // 查询所有宿舍信息 public List<Dormitory> getAllDormitories() { return dormitoryDao.getAllDormitories(); } } ``` 7. Controller层的代码示例: ```java @Controller @RequestMapping("/student") public class StudentController { @Autowired private StudentService studentService; @RequestMapping("/list") public String list(Model model) { List<Student> students = studentService.getAllStudents(); model.addAttribute("students", students); return "student/list"; } @RequestMapping("/add") public String add() { return "student/add"; } @PostMapping("/add") public String add(Student student) { boolean result = studentService.addStudent(student); if (result) { return "redirect:/student/list"; } else { return "redirect:/student/add"; } } @RequestMapping("/edit") public String edit(int id, Model model) { Student student = studentService.getStudentById(id); model.addAttribute("student", student); return "student/edit"; } @PostMapping("/edit") public String edit(Student student) { boolean result = studentService.updateStudent(student); if (result) { return "redirect:/student/list"; } else { return "redirect:/student/edit?id=" + student.getId(); } } @RequestMapping("/delete") public String delete(int id) { boolean result = studentService.deleteStudent(id); if (result) { return "redirect:/student/list"; } else { return "redirect:/student/list"; } } } @Controller @RequestMapping("/dormitory") public class DormitoryController { @Autowired private DormitoryService dormitoryService; @RequestMapping("/list") public String list(Model model) { List<Dormitory> dormitories = dormitoryService.getAllDormitories(); model.addAttribute("dormitories", dormitories); return "dormitory/list"; } @RequestMapping("/add") public String add() { return "dormitory/add"; } @PostMapping("/add") public String add(Dormitory dormitory) { boolean result = dormitoryService.addDormitory(dormitory); if (result) { return "redirect:/dormitory/list"; } else { return "redirect:/dormitory/add"; } } @RequestMapping("/edit") public String edit(int id, Model model) { Dormitory dormitory = dormitoryService.getDormitoryById(id); model.addAttribute("dormitory", dormitory); return "dormitory/edit"; } @PostMapping("/edit") public String edit(Dormitory dormitory) { boolean result = dormitoryService.updateDormitory(dormitory); if (result) { return "redirect:/dormitory/list"; } else { return "redirect:/dormitory/edit?id=" + dormitory.getId(); } } @RequestMapping("/delete") public String delete(int id) { boolean result = dormitoryService.deleteDormitory(id); if (result) { return "redirect:/dormitory/list"; } else { return "redirect:/dormitory/list"; } } } ``` 以上就是一个简易的JavaEE宿舍管理系统的代码示例,其中包括了学生信息和宿舍信息的添加、修改和删除功能。需要注意的是,上述代码示例仅供参考,实际情况还需要根据具体需求进行相应的修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值