MyBatis 动态 SQL
public class User{
private Integer id;
private String username;
private String password;
private Integer age; }
通过 id 和 username 查询 User。
通过 username 和 password 查询 User。
通过 password 和 age 查询 User。
在 UserRepository 中定义上述 3 个方法
public User findByUser1(User user);
public User findByUser2(User user);
public User findByUser3(User user);
UserRepository.xml
<select id="findByUser1" parameterType="User" resultType="User">
select * from t_user where id = #{id} and username = #{username}
</select> <select id="findByUser2" parameterType="User" resultType="User">
select * from t_user where username = #{username} and password = #{password}
</select> <select id="findByUser3" parameterType="User" resultType="User">
select * from t_user where password = #{password} and age = #{age}
</select>
MyBatis 动态 SQL,SQL 不是固定的,可以根据不同的参数信息来动态拼接不同的 SQL,以适应不同的需求。
1、创建实体类
public class User{
private Integer id;
private String username;
private String password;
private Integer age; }
2、Mapper.java
package com.southwind.repository;
import com.southwind.entity.User;
public interface UserRepository {
public User findByUser(User user);
}
3、Mapper.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="com.southwind.repository.UserRepository">
<select id="findByUser" parameterType="com.southwind.entity.User"
resultType="com.southwind.entity.User">
select * from t_user where
id = #{id} and username = #{username}
and password = #{password} and age = #{age}
</select>
</mapper>
4、config.xml 注册 Mapper.xml
<mappers>
<mapper resource="com/southwind/repository/UserRepository.xml"/>
</mappers>
5、测试
package com.southwind.test;
import com.southwind.entity.User;
import com.southwind.repository.UserRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Test7 {
public static void main(String[] args) {
InputStream inputStream =
Test2.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory =
sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserRepository userRepository =
sqlSession.getMapper(UserRepository.class);
User user = new User();
// user.setId(2);
user.setUsername("lisi");
user.setPassword("000");
user.setAge(5);
User user2 = userRepository.findByUser(user);
System.out.println(user2);
}
}
动态 SQL
if
where
<?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="com.southwind.repository.UserRepository">
<select id="findByUser" parameterType="com.southwind.entity.User"
resultType="com.southwind.entity.User">
select * from t_user
<where>
<if test="id!=null">
id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
<if test="age!=null">
and age = #{age}
</if>
</where>
</select>
</mapper>
choose、when
<select id="findByUser" parameterType="com.southwind.entity.User"
resultType="com.southwind.entity.User">
select * from t_user
<where>
<choose>
<when test="id!=null">
id = #{id}
</when>
<when test="username!=null">
and username = #{username}
</when>
<when test="password!=null">
and password = #{password}
</when>
<when test="age!=null">
and age = #{age}
</when>
</choose>
</where>
</select>
trim
通过设置 prefix 和 suffix 参数来完成使用的
<select id="findByUser" parameterType="com.southwind.entity.User"
resultType="com.southwind.entity.User">
select * from t_user
<trim prefix="where" prefixOverrides="and">
<if test="id!=null">
id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
<if test="age!=null">
and age = #{age}
</if>
</trim>
</select>
set
set 标签用于 Update 操作,会自动根据参数选择生成 SQL 语句。
Mapper.java
package com.southwind.repository;
import com.southwind.entity.User;
public interface UserRepository {
public int update(User users);
}
Mapper.xml
<update id="update" parameterType="com.southwind.entity.User">
update t_user
<set>
<if test="username!=null">
username = #{username},
</if>
<if test="password!=null">
password = #{password},
</if>
<if test="age!=null">
age = #{age}
</if>
</set>
where id = #{id}
</update>
package com.southwind.test;
import com.southwind.entity.User;
import com.southwind.repository.UserRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Test7 {
public static void main(String[] args) {
InputStream inputStream =
Test2.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory =
sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserRepository userRepository =
sqlSession.getMapper(UserRepository.class);
User user = new User();
user.setId(2);
user.setUsername("tom");
user.setAge(3);
userRepository.update(user);
sqlSession.commit();
}
}