MyBatis使用动态SQL用法以及例题

 

在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。
链接:https://pan.baidu.com/s/1zkidEEFcbcdMCxdAAqjaFQ?pwd=ltyk
提取码:ltyk

基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 请务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍!!!

 

 前提准备

1.创建一个java项目,并导入依赖的jar包。

2.将配置文件中的数据库信息修改为外部引用的形式,在src目录下创建一个db.properties文件,并编辑代码。

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/db_mybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

3.创建一个MyBatis配置文件mybatis-config.xml.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties" />
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
       <mapper resource="mybatis/UserMapper.xml" />
    </mappers>
</configuration>

4.创建一个包命名为pojo,在pojo包下创建一个类命名为User。

package pojo;
public class User {
	private Integer id;
	private String username;
	private String jobs;
	private String phone;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getJobs() {
		return jobs;
	}
	public void setJobs(String jobs) {
		this.jobs = jobs;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
	}
}

5.创建一个包命名为util,在util包下创建一个类命名为MyBatisUtil。

package util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {
private static SqlSessionFactory sessionFactory=null;
static {
	try {
		String resourse="mybatis-config.xml";
		InputStream inputStream=Resources.getResourceAsStream(resourse);
		sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
		
	} catch (IOException e) {
		// TODO: handle exception
	}
}
public static SqlSession getSession() {
	return sessionFactory.openSession();
}
}

6.创建一个映射文件命名为UserMapper.xml。

<?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="mybatis.UserMapper">
</mapper>

7.创建一个包命名为test,用来存放测试类。

具体用法

 <if>元素

My Batis中,<if>元素是最常用的判断语句,主要用于实现某些简单的条件选择。在实际应用中,我们可能会通过多个条件来精确地查询某个数据。

1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:

<!--1. <if>元素使用 -->
<select id="findUserByNameAndJobs" parameterType="pojo.User" resultType="pojo.User">
select * from t_user where 1=1
<if test="username != null and username != ''">
and username like concat('%',#{username},'%') 
</if>
<if test="jobs != null">
and jobs=#{jobs}
</if>
</select>

 <select>标签内的id属性是方法调用的唯一标识,在我们java代码中需要此id定位。parameterType是传入参数的的类型,resultType是返回结果集的类型。

<if>标签里的test内容就是判断条件

<if test="jobs != null">and jobs=#{jobs}</if> 用java写相当于 if(jobs!=null) and job=#{jobs}

2.在test包下创建一个类命名为test_if进行测试

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import pojo.User;
import util.MyBatisUtil;

public class test_if {
public static void main(String[] args) throws Exception{
	SqlSession session=MyBatisUtil.getSession();
	User user=new User();
	//注释掉下面两行代码,则查找全部的User
	user.setUsername("zyy");
	user.setJobs("teacher");
	//查找username=zyy并且jobs=teacher的User
	List<User> list=session.selectList("mybatis.UserMapper.findUserByNameAndJobs",user);
	for(User u:list) {
		System.out.println(u);
	}
}
}

 查找username=zyy并且jobs=teacher的User

List<User> list=session.selectList("mybatis.UserMapper.findUserByNameAndJobs",user);

findUserByNameAndJobs就是前面说明的id

 <choose>.<when>和<otherwise>元素

 在使用<if>元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但是在实际应用中,有时只需要从多个选项中选择一个去执行。< choose><when>< otherwise>元素类似于Java语言中使用 switch...case…default语句。

1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:

<!--2. <choose>,(<when>,<otherwise>元素使用 -->
<select id="findUserByNameOrJobs" parameterType="pojo.User" resultType="pojo.User">
select * from t_user where 1=1
<choose>
<when test="username != null and username!='' ">
and username like concat('%',#{username},'%')
</when>
<when test="jobs != null and jobs !='' ">
and jobs =#{jobs}
</when>
<otherwise>
and phone is not null
</otherwise>
</choose>
</select>

concat()函数就是把里面的参数连接起来,例如concat('%',#{username},'%')结果为:

%#{username}%

 2.在test包下创建一个类命名为test_choose进行测试

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import pojo.User;
import util.MyBatisUtil;

public class test_choose {
public static void main(String[] args) throws Exception{
	SqlSession session=MyBatisUtil.getSession();
	User user=new User();
	user.setUsername("zyy");
	user.setJobs("student");
	List<User> list=session.selectList("mybatis.UserMapper.findUserByNameOrJobs",user);
    for(User u:list) {
    	System.out.println(u);
    }
}
}

查找username=zyy或者jobs=teacher的user

<where>.<trim>元素

在前两个小节的案例中,映射文件中编写的SQL后面都加入了“where1=1”的条件,是为了保证当条件不成立时,拼接起来的SQL语句在执行时不会报错,即使得SQL不出现语法错误。那么在 MyBatis中,有没有什么办法不用加入“1=1”这样的条件,也能使拼接后的SQL成立呢?针对这种情况, MyBatis提供了< where>元素来处理这样的

1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:

<!--3. <if>.<where>元素使用 -->
<select id="findUserByNameAndJobs2" resultType="pojo.User" parameterType="pojo.User">
select * from t_user 
<where>
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="jobs != null and jobs !=''">
and jobs =#{jobs}
</if>
</where>
</select>
<!-- <if><trim>元素使用 -->
<select id="findUserByNameAndJobs3" resultType="pojo.User" parameterType="pojo.User">
select * from t_user 
<trim prefix="where" prefixOverrides="and">
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="jobs != null and jobs !=''">
and jobs =#{jobs}
</if>
</trim>
</select>

 使用<where>元素对"where 1=1"条件进行了替换,<where>元素会自动判断组合条件下拼装的SQL语句,只有<where>元素内的条件成立时,才会拼装SQL中加入where关键字,否则将不会添加。同样使用<trim>元素也对"where 1=1"条件进行了替换,<trim>元素去除一些特殊字符,它的prefix属性代表的是语句的前缀,而prefixOverride属性代表的是需要去除的那些特殊字符串,写法是和<where>等效的。

 2.在test包下创建一个类命名为test_where_trim进行测试

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import pojo.User;
import util.MyBatisUtil;

public class test_where_trim {
public static void main(String[] args) throws Exception{
	SqlSession sqlSession=MyBatisUtil.getSession();
	User user =new User();
	user.setUsername("zyy");
	user.setJobs("teacher");
	List<User> list1=sqlSession.selectList("mybatis.UserMapper.findUserByNameAndJobs2",user);
	for(User u:list1) {
		System.out.println(u);
	}
	List<User> list2=sqlSession.selectList("mybatis.UserMapper.findUserByNameAndJobs3",user);
	for(User u:list2) {
		System.out.println(u);
	}
}
}

<set>元素

 Hibenate中,如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而实际应用中存在只要更新某一个或几个字段。为了解决让程序只更新需要更新的字段,MyBatis中提供了<set>元素来完成这一工作。<set>元素主要用于更新操作,其主要作用是在动态包含的SQL语句前输出一个SET关键字,并将SQL语句中最后一个多余的逗号去除。

注意:在映射文件中使用<set><if>元素组合进行update语句动态SQL组装时,如果<set>元素内包含的内容都为空,则会出现SQL语法错误。所以在使用<set>元素进行字段信息更新时,要确保传入的更新字段不能都为空。

 1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:

<!-- 4.<set>元素使用 -->
<update id="updateUser" parameterType="pojo.User">
		update t_user
		<set>
			<if test="username !=null and username !=''">
				username=#{username},
			</if>
			<if test="jobs !=null and jobs !=''">
				jobs=#{jobs},
			</if>
			<if test="phone !=null and phone !=''">
				phone=#{phone},
			</if>
		</set>
		where id=#{id}
	</update>

 2.在test包下创建一个类命名为test_set进行测试

package test;

import org.apache.ibatis.session.SqlSession;

import pojo.User;
import util.MyBatisUtil;

public class test_set {
public static void main(String[] args) throws Exception{
	SqlSession sqlSession =MyBatisUtil.getSession();
	User user=new User();
	user.setId(6);
	user.setJobs("teacher");
	user.setPhone("1233213214");
	user.setUsername("daming");
	int row=sqlSession.update("mybatis.UserMapper.updateUser",user);
	if (row>0) {
		System.out.println("更新成功");
	}else {
		System.out.println("更新失败");
	}
}
}

<foreach>元素

 MyBatis中已经提供了一种用于数组和集合循环遍历的方式,那就是使用< foreach>元素。假设在一个用户表中有1000条数据,现在需要将id值小于100的用户信息全部查询出来就可以通过< foreach>元素来解决。

 1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:

<!--5.<foreach>元素使用 -->
<select id="findUserById" parameterType="List" resultType="pojo.User">
select * from t_user where id in
<foreach collection="list" item="id" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</select>

collection属性:配置的list是传递过来的参数类型。

item属性:配置的是循环中的当前的元素。

index属性:配置的是当前元素在集合中的位置下标。

open和close属性:配置的是以什么符号将这些集合元素包装起来。

separator属性:配置的是各个元素的间隔符。

  2.在test包下创建一个类命名为test_foreach进行测试

package test;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import pojo.User;
import util.MyBatisUtil;

public class test_foreach {
public static void main(String[] args) throws Exception{
	SqlSession sqlSession =MyBatisUtil.getSession();
	List<Integer> list=new ArrayList<Integer>();
	list.add(1);
	list.add(2);
	List<User> users=sqlSession.selectList("mybatis.UserMapper.findUserById",list);
	for(User user:users) {
		System.out.println(user);
	}
}
}

 <bind>元素

MyBatis提供了<bind>元素来解决映射文件中的SQL就要根据不同的情况提供不同形式的实现这一问题,只要使用 My Batis的语言即可与所需参数连接。

  1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:

<!-- 6.<bind>元素的使用:根据用户姓名模糊查询用户信息 -->
<select id="findUserByName2" parameterType="pojo.User" resultType="pojo.User">
<bind name="p_username" value="'%'+_parameter.getUsername()+'%'"/>
select * from t_user where username like #{p_username}
</select>

说白了就是用<bind>元素来替代concat()函数

   2.在test包下创建一个类命名为test_bind进行测试

package test;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import pojo.User;
import util.MyBatisUtil;

public class test_bind {
public static void main(String[] args) throws Exception{
	SqlSession sqlSession=MyBatisUtil.getSession();
	User user=new User();
	user.setUsername("t");
	List<User> list=sqlSession.selectList("mybatis.UserMapper.findUserByName2",user);
	for(User u :list) {
		System.out.println(u);
	}
}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无忧#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值