mybatis之映射文件标签


insert update delete标签返回影响的行数允许返回Integer Long Boolean

useGeneratedKeys mysql和oracle获取自增主键的值

mysql:

//开启获取自增主键
useGeneratedKeys="true"
//指定封装到pojo的哪个属性
keyProperty="id"

oracle:

由于oracle没有自增字段的策略,我们可以用序列来自增

//创建一个名字叫seq_users的序列
create sequence seq_users
//每次增长多少
increment by 1
//从几开始自增
start with 1
//自增最小值
minvalue 1
//自增最大值
maxvalue 9999999
order
cache 20
cycle;
//获取下一个序列的值
select seq_users.nextval from dual;
//获取当前序列的值
select seq_users.currval from dual;
//
<!-- 
		keyProperty:查出的主键值封装给javaBean的哪个属性
		order="BEFORE":当前sql在插入sql之前运行
			   AFTER:当前sql在插入sql之后运行
		resultType:查出的数据的返回值类型
		
		BEFORE运行顺序:
			先运行selectKey查询id的sql;查出id值封装给javaBean的id属性
			在运行插入的sql;就可以取出id属性对应的值
		AFTER运行顺序:
			先运行插入的sql(从序列中取出新值作为id);
			再运行selectKey查询id的sql-->
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
			<!-- 编写查询主键的sql语句 -->
			<!-- BEFORE-->
			select EMPLOYEES_SEQ.nextval from dual 
			<!-- AFTER:
			 select EMPLOYEES_SEQ.currval from dual -->
		</selectKey>

@Param mybatis 对参数的处理

public User getUser(Integer id,String name);

mybatis对单个参数不会做特殊的处理
多个参数会被封装成一个map 第一个参数会作为第一个key为名为param1 10个参数key名为param10,而值就为传来的参数。
我们可以在映射文件中用#{param1}#{param2}来对应参数
当然我们一般在开发中使用命名参数的方式

 public void getUser(@Param("id")Integer id,@Param("name")String name);

如果参数比较多而且参数模型不是一个pojo对象 我们也可以传一个map

public User getUser(Map<String, Object> map);
Map<String, Object> map = new HashMap<>();
			map.put("id", 2);
			map.put("name", "Tom");
select * from user where id = #{id} and name=#{name}

#{} ${}取值的区别,以及使用场景

#{}:是以预编译的方式将参数设置到sql语句中 相当于jdbc中的PreparedStatement,防止sql注入。
我们sql参数通常都应该用#{}
${}:是直接拼接在sql语句中的,会有sql注入的风险
我们的表名或者排序时(asc,desc)没有办法参数预编译的可以用${}
# mysql和oracle对mybatis为null值的处理
在参数为null值时 mybatis默认处理时jdbcType为Other

OTHER(Types.OTHER)

oracle不能正确处理,mysql的话是可以的,
如果我们要处理这种情况可以在sql的标签中标明jdbcType=NULL,也可以在mybatis的配置文件中的setting标签中

<setting name="jdbcTypeForNull" value="NULL"/>

一条(多条)记录返回值封装map

一条数据返回map

<select id="getUser" resultType="java.util.Map">
        SELECT * FROM user where id=#{id}
    </select>
Map<String,Object>  getUser(Integer id);

多条记录封装map

<select id="getUser" resultType="com.xxx.User">
        SELECT * FROM user where name=#{name}
    </select>
 //告诉mybatis 哪个属性作为map的key
    @MapKey("id")
    Map<Integer,User>  getUser(String name);

resultMap封装association自定义对象

public class User {
    private String id;
    private String name;
    private Dept dept;
}
  <resultMap id="userMap" type="com.xxx.user">
      <result column="id" property="id"/>
      <result column="name" property="name"/>
      <association property="dept" javaType="com.xxx.Dept">
          <result column="d_id" property="id"></result>
      </association>

  </resultMap>

resultMap association分步查询

<select id="getDeptById" resultType="com.xxx.Dept">
        select * from dept where id=#{id}
    </select>
  <resultMap id="userMap" type="com.xxx.user">
      <result column="id" property="id"/>
      <result column="name" property="name"/>
      //select表明dept属性是select查询出来的结果,column表明将哪一列的值传到这个方法
      <association property="dept" select="namespace+getDeptById" column="d_id">
      </association>

  </resultMap>
  <select id="getUser" resultMap="userMap">
        select * from user where id=#{id}
    </select>

resultMap collection集合封装规则及分步查询

public class Dept{
    private String id;
    private String name;
    private List<User> users;
}
  <resultMap id="deptMap" type="com.xxx.Dept">
      <result column="id" property="id"/>
      <result column="name" property="name"/>
      //ofType指定集合里的元素类型
     <collection property="users" ofType="com.xxx.User">
		<result column="id" property="id"/>
      	<result column="user_name" property="userName"/>
	</collection>
  </resultMap>

分步查询

  <select id="getUser" resultType="com.xxx.User">
       select * from user where d_id=#{dId}
    </select>
//select查询user的sql语句标签id column将部门的id传给users
<collection property="users" select="namespace+getUser" column="id">

resultMap discriminator鉴别器

  <resultMap id="userMap" type="com.xxx.user">
      <result column="id" property="id"/>
      <result column="name" property="name"/>
      <discriminator javaType="String" column="gender">
          //如果性别为男
          <case value="0">
            //要执行的逻辑
          </case>
          //如果性别为女执行的逻辑
          <case value="1">
            //要执行的逻辑
          </case>
      </discriminator>
  </resultMap>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值