Mapper的继承
在不改动原来的Mapper.xml情况下,进行扩展,很实用。
Mapper接口继承:
@MybatisMapperpublic interface ItemMapper {
Item getById(@Param("id") Long id);
}
@MybatisMapper
public interface ItemExMapper extends ItemMapper {
}
Mapper.xml中:
<mapper namespace="com.test.ItemMapper">
<select id="getById" resultMap="Item">
select
*
from item where id = #{id}
</select>
<resultMap id="Item" type="com.test.Item" autoMapping="true">
<id property="id" column="id" />
</resultMap>
</mapper>
<mapper namespace="com.test.ItemExMapper">
<!-- 如果这里不写一遍,就会用到ItemMapper.getById的定义,resultMap就不会是ItemEx-->
<select id="getById" resultMap="Item">
select
*
from item where id = #{id}
</select>
<resultMap id="Item" type="com.test.ItemEx" autoMapping="true">
<id property="id" column="id" />
</resultMap>
</mapper>
多个字段用IN时的语法
SELECT * FROM mydata_table
WHERE (id,`type`) IN ((1,'2'),(2,'2'));
添加单一记录时返回主键ID
获取新插入的数据返回的主键:
Integer rows = sqlSession.getMapper(TestMapper.class).insertOneTest(test);
System.out.println("rows = " + rows);
// 添加操作返回记录数
System.out.println("id = " + test.getId()); // 执行添加操作之后通过Java对象获取主键属性值
1、在XML映射器中配置(在定义xml映射器时设置属性useGeneratedKeys值为true,并分别指定属性keyProperty和keyColumn为对应的数据库记录主键字段与Java对象的主键属性。)
<!-- 插入数据:返回记录主键id值 -->
<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test"
useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
insert into test(name,descr,url,create_time,update_time)
values(#{name},#{descr},#{url},now(),now())
</insert>
2、接口映射器中:
// 返回主键字段id值 @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time)
values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
3、添加批量记录时返回主键ID:
<!-- 批量添加数据,并返回主键字段 -->
<insert id="insertBatchTest" useGeneratedKeys="true" keyProperty="id">
INSERT INTO test(name,descr,url,create_time,update_time)
VALUES
<foreach collection="list" separator="," item="t">
(#{t.name},#{t.descr},#{t.url},now(),now())
</foreach>
</insert>
SQL列明取别名(方便多表联接)
sql标签中可以这样写,用${alias}当变量:
<!-- 别名 -->
<sql id="Base_Column_List_Alias">
${alias}.dept_id, ${alias}.dept_name
</sql>
然后这样进行引入:
select
<include refid="Base_Column_List_Alias">
<property name="alias" value="e" />
</include>
from mytable1 e left join mytable2 f on e.type=f.type
update批量更新高效的一种写法
mapper.xml中这样写:
<update id="updateBatch" parameterType="java.util.List">
update mydata_table
<trim prefix="set" suffixOverrides=",">
<trim prefix="status =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id} then #{item.status}
</foreach>
</trim>
</trim>
where id in
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item.id,jdbcType=BIGINT}
</foreach>
</update>
<trim>
实际SQL如下:
UPDATE
mydata_table
SET
`status` =
CASE
WHEN id = 1
THEN 'N'
WHEN id = 2
THEN 'Y'
END
...
WHERE id IN ('1','2')