映射文件
配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全
在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理sql语句
Statement的实际位置就等于namespace+StatementId
占位符
在Mybatis中,有两种占位符
- #{}解析传递进来的参数数据
- ${}对传递进来的参数原样拼接在SQL中
主键生成策略
如果我们在Hibernate中,当我们插入数据的时候,我们是可以选择是UUID策略的…
那么在Mybatis是怎么做的呢??
UUID
<!-- mysql的uuid生成主键 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="string"> select uuid() </selectKey> INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address}) </insert>
主键返回
如果我们一般插入数据的话,如果我们想要知道刚刚插入的数据的主键是多少,我们可以通过以下的方式来获取
需求:
- user对象插入到数据库后,新记录的主键要通过user对象返回,通过user获取主键值。
解决思路:
- 通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。
mysql:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID() </selectKey> INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert>
oracle:
实现思路:
- 先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库。
<!-- oracle 在执行insert之前执行select 序列.nextval() from dual取出序列最大值,将值设置到user对象 的id属性 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="int"> select 序列.nextval() from dual </selectKey> INSERT INTO USER(id,username,birthday,sex,address) VALUES( 序列.nextval(),#{username},#{birthday},#{sex},#{address}) </insert>
resultMap
有的时候,我们看别的映射文件,可能看不到以下这么一段代码:
<resultMap id="userListResultMap" type="user" > <!-- 列名 id_,username_,birthday_ id:要映射结果集的唯 一标识 ,称为主键 column:结果集的列名 property:type指定的哪个属性中 --> <id column="id_" property="id"/> <!-- result就是普通列的映射配置 --> <result column="username_" property="username"/> <result column="birthday_" property="birthday"/> </resultMap>
因为,如果我们的数据表的字段和JavaBean的属性名称是相同时,我们就不用上面那段代码了。Mybatis会自动帮我们把返回的结果进行封装成JavaBean
那当我们数据表的字段和JavaBean的属性名称不是相同时,我们就需要使用resultMap,也就是上面那段代码
- 当然了,在正常情况下列名和JavaBean的属性名一般都是不同的,因此还是需要resultMap的。
resultMap和resultType区别
resultType :指定输出结果的类型(pojo、简单类型、hashmap..),将sql查询结果映射为java对象 。
- 使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。
resultMap:将sql查询结果映射为java对象。
- 如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)
使用resultMap
<resultMap id="userListResultMap" type="user" > <!-- 列名 id_,username_,birthday_ id:要映射结果集的唯 一标识 ,称为主键 column:结果集的列名 property:type指定的哪个属性中 --> <id column="id_" property="id"/> <!-- result就是普通列的映射配置 --> <result column="username_" property="username"/> <result column="birthday_" property="birthday"/> </resultMap>