Mybatis

SqlSession

SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);//第二个参数为是否自动提交,为true则执行一次sql就提交,若为false则表示开启事务
TbTestMapper tbTestMapper = sqlSession.getMapper(TbTestMapper.class);
try {
    for (int i = 1; i <= 10; i++) {
        TbTest tbTest = new TbTest();
        tbTest.setId(i);
        tbTest.setUpdateTime(new Date());
        tbTestMapper.updateByPrimaryKeySelective(tableField);
    }
    sqlSession.commit();
    sqlSession.clearCache();
} catch (Exception e) {
    sqlSession.rollback();
} finally {
    sqlSession.close();
}

注意SqlSession批量新增时,无法返回新增后记录的主键。

foreach

foreach语句中 单参数可以用collection="list" 双参数用@param就一定要用alias了
item:迭代元素别名
open:foreach内以什么开始
close:foreach内以什么结束
separator:每次迭代后给sql语句append上separator属性指定的字符
index:在list中表示当前的迭代位置 值为该迭代位置的变量名

@Param

在 Mapper 接口文件中
1、参数为单一属性,且只有一个,可以不用@Param,但 sql 中参数只能用 #{};用 @Param, #{} 或 ${} 都可以;
2、参数为JavaBean,且只有一个,可以不用@Param,sql 中参数为JavaBean的属性。
3、参数为有多个,必须用@Param,其中JavaBean的参数,sql 中参数为JavaBean.属性名的形式。同时JavaBean的属性和外面的单一属性名称不要相同,不然会产生覆盖现象。
当在xml标签中用到参数时,必须加@Param

namespace

<mapper namespace="com.example.project.UserMapper">
</mapper>

xml绑定Mapper接口

参数

1、id:映射文件中方法的唯一标识,与对应dao层中执行此功能的方法名相同。

2、parameterType:参数类型,可以不写

基本类型和 String 可以直接写类型名称 ,也可以使用包名 . 类名的方式 ,例如 :java.lang.String。
实体类类型 使用全限定类名。

mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。

3、resultType :结果集类型

支持基本类型和实体类类型,若在properties中开启驼峰映射,可自动实现驼峰转换。

mybatis.configuration.map-underscore-to-camel-case=true

4、resultMap:自定义映射

<resultMap id="userMap" type="com.example.project.User" >
    <!-- type 映射实体类全限定类名 -->
	<id column="id" jdbcType="INTEGER" property="userId"/>
    <!-- id 主键  jdbcType JAVA映射类型-->
	<result column="user_name" jdbcType="VARCHAR" property="userName"/>
    <!-- column 表字段名  property 实体类属性名 -->
    # association 1
    <association column="id=id,userName=user_name" property="count" select="getCount"/>
    <!-- column 在子查询可用父查询中返回的字段值  property 父查询实体类的属性名 -->
    <!-- select 子查询语句,根据同一xml中的id查询select标签的语句 -->
    <!-- 若在不同一xml中,使用全限定名至Mapper中的方法名 -->
    # association 2
    <association property="room" javaType="com.example.project.Room" columnPrefix="room_"> 
        <result column="code" property="roomCode"/>
        <result column="type" property="roomType"/>
    </association>
    <!-- javaType 映射父实体类嵌套实体类全限定类名 --> 
    <!-- columnPrefix 表示javaType中属性对应的数据库列都有一个前缀 -->
    <!-- 此类型一般在sql语句发生left join并且右表查询结果需要封装时使用 -->
    # collection 1
    <collection column="id" property="privs" select="getPrivsById"/>
    <!-- column 在子查询可用父查询中返回的字段值  property 父查询实体类的属性名 -->
    <!-- select 子查询语句,根据同一xml中的id查询select标签的语句 -->
    <!-- 若在不同一xml中,使用全限定名至Mapper中的方法名 -->
    # collection 2
    <collection property="roles" ofType="com.example.project.Role">
        <result column="role_code" property="roleCode"/>
        <result column="role_name" property="roleName"/>
    </collection>
    <!-- 此类型一般在sql语句发生left join并且对于左表单条记录而言,右表有多个结果封装成List时使用 -->
</resultMap>

ORM映射

public interface UserMapper {
    // 单条记录封装进一个Map
    Map<String, Object> getUserById(int id);
    // 单条记录封装进一个实体类
    User getUserById(int id);
    // 多条记录封装进List<Map>
    List<Map<String, Object>> getUsers();
    // 多条记录封装进List<User>
    List<User> getUsers();
    // 多条记录封装进Map
    @MapKey("id") //表示可索引某条记录的key
    Map<Integer, Map<String, Object>> getUsers();
    @MapKey("userName") //表示可索引某条记录的key
    Map<String, User> getUsers();
}

sql标签

<select id="getUserById" resultType="com.example.project.User">
    <include refid="commonSelect"/>
    where id = #{id}
</select>

<sql id="commonSelect">
    select * from tb_user
</sql>
posted @ 2022-07-18 13:54  云轻YK  阅读(192)  评论(0)    收藏  举报