Mybatis <bind>标签用法

<bind>标签可以使用ONGL(Object-Graph Navigation Language, 对象图形化导航语言)表达式创建一个变量并将其绑定到上下文中。如以下代码:

<if test="userName != null and userName != ''">
	and user_name like concat('%', #{userName} ,'%') 
</if>

由于不同的数据库,concat函数的用法不一样,Mysql的有3个参数,而oracle的只有2个。这就造成了这条SQL在不同环境中运行可能会出错。为了避免这种错误,可以用<bind>标签,如下:

<if test="userName != null and userName != ''">
	<bind name="nameLike" value="'%' + userName + '%'"/>
	and user_name like #{nameLike} 
</if>

<bind>标签的两个属性都是必选的,name为绑定到上下文的变量名,value为OGNL表达式。创建了<bind>标签的变量后,就可以在下面直接使用了。如下例子,先写一个静态方法,然后在Mapper.xml中调用该方法设置默认值:

package ex.mybatis.rbac.mapper;
public class BindTest {
	public static String setName() {
		return "test";
	}
}

Mapper.xml

<!-- 动态根据输入的用户名和id查询用户信息<choose>标签用法 -->
<select id="selectByIdOrName" resultMap="BaseResultMap">
	<!-- 使用<bind>标签调用的方法拿出来的默认值 -->
  	<bind name="name" value="@ex.mybatis.rbac.mapper.BindTest@setName()"/>
  	
    select id, user_name, user_password, user_email, create_time, user_info, head_img
    from sys_user
    <!-- 加上1=1是为了防止2个查询条件都为空的时候,SQL不会报错。学了where标签后可以去掉 -->
    where 1=1 
    <choose>
    	<when test="id != null">
    		and id = #{id}
    	</when>
    	<when test="userName != null and userName != ''">
    		and user_name like concat('%', #{userName} ,'%') 
    	</when>
    	<otherwise>
    		<!-- 当所有条件都空时,使用<bind>标签调用的方法拿出来的默认值 -->
    		and user_name=#{name}
    	</otherwise>
    </choose>
</select>

使用<bind>标签打印入参信息,如下:

  • 先定义静态方法print
package ex.mybatis.rbac.mapper;
public class BindTest {
	public static void print(Object param) {
		System.out.println(param);
	}
}
  • 在Mapper.xml中使用<bind>标签,调用该方法
<!-- <foreach>标签实现更新,参数为map -->
<update id="updateByMap">
  	<bind name="print" value="@ex.mybatis.rbac.mapper.BindTest@print(_parameter)"/>
	update sys_user 
	set 
	<foreach collection="_parameter" item="val" index="key" separator=",">
		${key} = #{val}
	</foreach>
	where id = #{id}
</update>
  • updateByMap参数打印结果
{user_email=test2@mybatis.ex, user_password=1111333, id=1001}

通过这种方式就能实现一些特殊的功能,上面的例子只是为了启发大家,不要乱用。

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是你所需的代码。 Student.java: ```java public class Student { private int id; private String name; private int age; private int classId; private String sex; private int score; public Student(int id, String name, int age, int classId, String sex, int score) { this.id = id; this.name = name; this.age = age; this.classId = classId; this.sex = sex; this.score = score; } // Getters and setters public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getClassId() { return classId; } public void setClassId(int classId) { this.classId = classId; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } } ``` Main.java: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Student> students = Arrays.asList( new Student(1, "Alice", 20, 1, "F", 90), new Student(2, "Bob", 18, 1, "M", 85), new Student(3, "Charlie", 19, 2, "M", 95), new Student(4, "David", 22, 2, "M", 88), new Student(5, "Eve", 21, 3, "F", 92) ); // 1. 返回仅age为偶数的Student列表 List<Student> evenAgeStudents = students.stream() .filter(student -> student.getAge() % 2 == 0) .collect(Collectors.toList()); System.out.println("Even age students: " + evenAgeStudents); // 2. 按score降序排列,仅返回前三个Student List<Student> topThreeStudents = students.stream() .sorted((s1, s2) -> s2.getScore() - s1.getScore()) .limit(3) .collect(Collectors.toList()); System.out.println("Top three students: " + topThreeStudents); // 3. 按照classId分组,返回Map<Integer,List<Student>>班级分组数据 Map<Integer, List<Student>> classIdToStudentsMap = students.stream() .collect(Collectors.groupingBy(Student::getClassId)); System.out.println("ClassId to students map: " + classIdToStudentsMap); // 使用反射获取Student类所有构造方法、成员方法、成员变量 Class<Student> studentClass = Student.class; Constructor<?>[] constructors = studentClass.getConstructors(); System.out.println("Constructors: " + Arrays.toString(constructors)); Method[] methods = studentClass.getMethods(); System.out.println("Methods: " + Arrays.toString(methods)); Field[] fields = studentClass.getDeclaredFields(); System.out.println("Fields: " + Arrays.toString(fields)); } } ``` 对于Spring Boot和MyBatis的部分,这里提供代码框架,你可以根据你的具体需求进行完善。 StudentMapper.java: ```java import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface StudentMapper { List<Student> getAllStudents(); Student getStudentById(int id); void insertStudent(Student student); void updateStudent(Student student); void deleteStudent(int id); } ``` StudentController.java: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/students") public class StudentController { @Autowired private StudentMapper studentMapper; @GetMapping("/") public List<Student> getAllStudents() { return studentMapper.getAllStudents(); } @GetMapping("/{id}") public Student getStudentById(@PathVariable int id) { return studentMapper.getStudentById(id); } @PostMapping("/") public void insertStudent(@RequestBody Student student) { studentMapper.insertStudent(student); } @PutMapping("/") public void updateStudent(@RequestBody Student student) { studentMapper.updateStudent(student); } @DeleteMapping("/{id}") public void deleteStudent(@PathVariable int id) { studentMapper.deleteStudent(id); } } ``` StudentApplication.java: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class StudentApplication { public static void main(String[] args) { SpringApplication.run(StudentApplication.class, args); } } ``` 这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。关于拦截器打印每个接口用时的部分,你可以创建一个实现了HandlerInterceptor接口的拦截器类,并在其中实现相应的逻辑。 这里只提供了代码框架,具体的实现需要根据你的项目需求进行完善。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值