文章目录
获取新增记录主键
把新增主键封装到实体类中
1.xml
<insert id="funtion" parameterType="entity">
<!--order:获取主键值时间。BEFORE:在 insert 执行前;AFTER:在 insert 语句执行后-->
<selectKey keyColumn="表中主键列" keyProperty="实体类主键" order="AFTER" resultType="返回类型">
select last_insert_id() / SELECT @@IDENTITY
</selectKey>
InsertSql语句
</insert>
<insert id="funtion" parameterType="entity" useGeneratedKeys="true" keyProperty="实体类主键"
keyColumn="表中主键列">
InsertSql语句
</insert>
2.注解
@Insert("InsertSql语句")
@SelectKey(
statement = "select last_insert_id()",
keyProperty = "实体类主键",
keyColumn = "表中主键列",
resultType = Long.class,
before = false //插入后获取
)
void add(User user);
resultMap
1 实体类成员变量和数据库字段不一样时用
1.1 xml
<resultMap id="resultMap" type="返回实体类">
<id column="主键" property="实体类变量"/><!--主键用id标签-->
<result column="普通字段" property="实体类变量"/><!--普通字段用result标签-->
</resultMap>
<select id="方法名" resultMap="resultMap的id">
</select>
1.2 注解
@Select("SELECT * FROM table WHERE label1=#{arg}")
@Results({
@Result(id = true,column = "字段",property = "实体类属性") //id:是否主键
})
XXX select方法(@Param("arg") String arg);
2 多表查询时用
2.1 单条sql查询
<!--autoMapping不需要配置的field-->
<resultMap id="返回实体类resultMap的id" type="返回实体类" autoMapping="true">
<!--
association:配置一对一关联关系
property:要映射的属性名称
-->
<association property="关联实体类属性" resultType="关联实体类"/>
<!--
collection:配置一对多关联关系
property:要映射的属性名称
ofType:指定集合中存放的类型
-->
<collection property="关联实体类属性" ofType="关联实体类" resultType="关联实体类"/>
</resultMap>
<select id="方法名" resultMap="返回实体类resultMap的id">
多表查询sql
</select>
2.2 多条sql查询
可以懒加载,访问主表数据时执行主表查询
在sqlMapperConfig.xml添加配置
<settings>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--不使用积极加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2.2.1 xml
<resultMap id="返回实体类resultMap的id" type="返回实体类">
<!--
association:配置一对一关联关系
property:要映射的属性名称
select:要调用的 sql 语句 id
column:要传递的参数字段
-->
<association property="关联实体类属性" column="传递的从表的列"
select="关联实体类查询sql的id"/>
<!--
collection:配置一对多关联关系
property:要映射的属性名称
ofType:指定集合中存放的类型
select:要调用的 sql 语句 id
column:要传递的参数字段
-->
<collection property="关联实体类属性" ofType="关联实体类" column="传递的从表的列" select="关联实体类查询sql的id"/>
</resultMap>
<select id="关联实体类查询sql的id" resultType="关联实体类">
关联实体类查询sql,#{传递的从表的列}接收从表参数
</select>
<select id="方法名" resultMap="返回实体类resultMap的id">
返回实体类查询sql
</select>
2.2.2 注解
@Select("SELECT * FROM table WHERE label1=#{arg}")
@Results({
@Result(
column = "column", //传递的参数
property = "关联实体类属性",
one = @One(
select = "查询关联实体类方法(加上包名可以是其他类的)",
fetchType = FetchType.LAZY) //懒加载
),
@Result(
column = "column", //传递的参数
property = "关联实体类属性",
many = @Many(
select = "查询关联实体类方法",
fetchType = FetchType.LAZY) //懒加载
)
})
XXX select方法(@Param("arg") String arg);
XXX 查询关联实体类方法(@Param("column") String column);
3 使用通用resultMap
<resultMap id="通用resultMap的id" type="返回实体类">
<resultMap id="返回实体类resultMap的id" type="返回实体类" extends="通用resultMap的id">
<!--会引用通用resultMap内的映射-->
</resultMap>
动态SQL
注解中使用要在sql语句加上<script>标签
@Select("<script>" +
"SELECT * FROM table " +
"<where>" +
"<if test='arg1!= null'>" +
"arg1 =#{arg1}" +
"</if>" +
"<if test='arg2!=null'>" +
"and arg2= #{arg2}" +
"</if>" +
"</where>" +
"</script>")
XXX select方法(@Param("arg1") String arg1,@Param("arg2") String arg2);
1 条件
<where><!--where作为标签防止全部条件为空-->
<if test="条件1 and 条件2">
添加SQL
</if>
</where>
2 遍历
传入参数为list或array时候用
<!--
collection:参数类型,list或array
open:拼装的 sql 语句片段的开始部分
close:拼装的 sql 语句片段的结束部分
item:当前遍历元素的变量名
separator:指定分割符
-->
<foreach collection="list" item="entity" separator=",">
(#{entity.filed1},#{entity.filed2})
</foreach>
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
3 选择
<choose>
<when test=""></when>
<otherwise></otherwise>
</choose>
通用sql
1 定义
<sql id="id">
sql语句
</sql>
2 使用
<include refid="id"/>
二级缓存
不同sqlSession对象执行相同查询只发出一次sql
执行不是查询的方法都会清空缓存
sqlMapperConfig.xml
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
1 xml
mapper.xml中开启
<mapper>
<cache></cache>
</mapper>
2 注解
用在接口上
@CacheNamespace(blocking = true)
public interface XXXMapper{
}