Mybatis相关知识
Mybatis之多参传递
注解方式传递参数
1.在mappper.xml中编写相关sql语句
<select id="findUserByNameAndSex" resultType="User">
select * from user where username = #{name} , sex = #{sex}
</select>
2.在接口中用注解传递参数
//注解方式传多个参数,xml里不用写parameterType
public Users findUserByNameAndSex(@Param("name")String name,@Param("sex")String sex);
3.也可以使用注解方式编写sql语句
@Select("select * from user where username = #{name} , sex = #{sex}")
public Users findUserByNameAndSex2(@Param("name")String name,@Param("sex")String sex);
包装类传递参数
将所需参数封装到一个包装类里
特别地:如果需要将一个类作为参数封装到一个包装类里,调这个类里的属性需要用 "."
<!-- 包装类中参数是一个封装类,采用. 调用封装类里的属性 名字要一样 -->
<select id="findUserByUserVo" parameterType="usersQueryVo" resultType="users">
select * from users where username like "%"#{users.username}"%"
</select>
Map方式
一般用于只传递两个参数进入查询语句,将这两个参数封装到Map中。
在mapper中,Map默认别名为map
<!-- Map默认别名 map -->
<select id="" parameterType="map"></select>
别名
别名:实体类中的名字与数据库中的不一致。使用resultMap高级映射
resultMap用于高级映射 实体类与表不一致,自定义结果映射集 type:指向映射的对象类
<id/>:匹配主键 column:表里的列名
property:实体类的属性名
在xml文件里设置别名
<resultMap type="Orders" id="orders">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
</result>
//column 是数据库中的名字 property 是类中的属性
<select id="selectOrderList" resultMap=" orders">
select id,user_id,number FROM orders
</select>
//resultType改为resultMap resultMap中的内容与id一致
sql语句拼接
利用动态sql实现根据用户传入参数不同,自动完成查询条件的变化
查询中常用的sql语句拼接
where: 相当于sql中的where 不同是where标签不会编辑到sql中 where会去前and
if:判断 test:判断条件
Integer默认值是"" , 但int默认值为0 建议使用integer
实例:
<!-- 根据性别和名字查询用户 where 可以在sex为null或空值时 去掉username前的 and 但不能去掉后 and -->
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
select * from user
<where>
<if text="sex != null and sex != ' '">
sex = #{sex}
</if>
<if test="username !=null and username != ' '">
and username = #{username}
</if>
</where>
</select>
增加中常用的sql语句
<insert id="insertUserByExample" parameterType="users">
insert into users
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null and '' != id">
id,
</if>
<if test="username != null and '' != username">
username,
</if>
</trim>
<trim prefix="values(" suffix=")" suffixOverrides=",">
<if test="id != null and '' != id">
#{id},
</if>
<if test="username != null and '' != username">
#{username},
</if>
</trim>
</insert>
sql语句封装
定义sql片段
可以将常用的sql语句单独定义出来,需要的时候调用
<sql id="findsql">
select * form users
</sql>
<!-- include:应用已定义的sql语句 -->
<select id="findUser" resultType="users">
<include refid="findsql" ></include>
</select>
封装到类
将sql语句封装到类里,在接口中调用封装类
@SelectProvider(type = UserSqlProvider.class,method="queryUserById")
public Users findUserById(Integer id);
封装类
public String queryUserById(int id) {
return "select * from user where id = #{id}";
}
//注意and 前面的空格
public String queryUserByExample(Users user) {
String sql = "select * from user where 0=0";
if(null != user.getId()) {
sql+=" and where id = #{id}";
}
if(user.getName() != null) {
sql+=" and name = #{name}";
}
return sql;
}
结构化sql语句
//结构化sql语句
public String queryUserByName() {
//String sql = "select * from user where name like '%'#{name}'%'";
SQL sql = new SQL();
String str=sql.SELECT("*").FROM("user").WHERE("name like concat('%',#{name},'%')").toString();
return str;
}
sql语句中的遍历
在sql语句中传入一个集合,然后遍历集合中的数据,用于执行相关操作
foreach:遍历 如果是集合,直接传递过来List Map 和Array 有默认别名 首字母小写
item:遍历时的元素
open:开始遍历时添加
close:遍历结束时添加
separator:不同元素之间的分隔符
如果是在传进来的封装类中有一个list属性,collection里直接写数组的属性名
<select id="findUserBatchById" resultType="user" parameterType="int">
select * from user where id IN
<foreach collection="list" item="i" index="" open="(" close=")" separator=",">
#{i}
</foreach>
</select>
注解式遍历
@Select({"<script>",
"select * from user",
"<where>" ,
"<if test='id!=null '>id=#{id}</if>",
"</where>",
"</script>"})
public List<Users> findUserByExample(Users user);