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>