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>