MyBatis学习笔记:CRUD标签里的属性的意义

这片文章是对自己学习的总结,学习材料是Java EE互联网轻量级框架整合开发 SSM框架(Spring MVC + Spring + Mybatis)和Redis实现。作者是杨开振,周吉文,梁华辉和谭茂华。电子工业出版社出版。


关于映射器的配置可以看MyBatis学习笔记:映射器简述和配置。这里只讨论select中的语法。

一个简单的select元素语句就如下所示

<mapper namespace="com.itheima.dao.UserDao">
    <select id="findAll" parameterType= "java.lang.Integer" resultType="com.itheima.domain.User">
        select * from users where id = #{id}
    </select>
</mapper>

我先讲select标签中id,parameterType和resultType这三个属性的意义


Select标签各属性的意义

  • <id>标签

这个标签用来标识我们要对接口中的哪个方法进行定义。比如在上面的例子中

<mapper namespace="com.itheima.dao.UserDao">
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from users
    </select>
</mapper>

id = findAll,这表示这个mapper是用来实现com.itheima.dao.UserDao接口中的findAll()方法的

  • <parameterType>标签

<parameterType>是用来指明方法的参数类型。比如有接口的方法是这样的

package com.itheima.Dao;
public interface UserDao {
    public User findUser(User user);
}

findUser传进去了一个参数,是User类,那我们就需要在映射器中指明参数的类型,让parameterType="User",否则Mybaits会不知道怎么处理传进来的参数。如下所示

<mapper namespace="com.itheima.Dao.UserDao">
    <select id="findUser" parameterType="com.itheima.domain.User" resultType="com.itheima.domain.User">
        select * from users where user_id = #{userId} and user_name = #{userName}
    </select>
</mapper>

从上面可以看出来,这只是传递一个参数的情况,万一传递两个参数怎么办,只有一个parameterType属性啊。传递多参数有四种方法,具体可以看MyBatis学习笔记:Mybatis传参给持久层接口的方法,以及sql语句如何得到参数的值

  • <resultType>标签

这个是用来标记返回类型的。这个属性很灵活,他会根据查询得到的数据自动打包。比如下面这段代码

<mapper namespace="com.itheima.Dao.UserDao">
    <select id="getIdByName" parameterType="list" resultType="int">
        select user_id from users where user_name in
        <foreach open="(" close=")" separator="," collection="list" item="item">
            #{item}
        </foreach>
    </select>
</mapper>

这个通过用户名列表返回用户名id的逻辑。下面是调用这个函数的代码。

List<int> userId = userDao.getIdByName(name);

从上面可以看出,getIdByName(String name)这个方法的返回类型是int。但如果查询结果有多行,是多个int值,那么Mybatis会自动打包成List<int>类型,所以可以用上面的代码不会出错。当然,上面的代码哪怕查询结果只有一个值,那也是可以用List<int>来接收的。

select标签的属性了解完之后,看看下面的语句

<mapper namespace="com.itheima.dao.UserDao">
    <select id="findAll" parameterType= "java.lang.Integer" resultType="com.itheima.domain.User">
        select * from users where id = #{id}
    </select>
</mapper>

其中的sql语句是动态获取到id的。那么动态获取id也需要详细说一说。


Insert标签各属性的意义

一条简单Insert语句如下所示

<mapper namespace="com.itheima.dao.UserDao">
    <insert id="findAll" parameterType= "role">
        insert into t_role(role_name, note) values(#{roleName, note})
    </insert>
</mapper>

insert语句的返回值是被影响的行数,也就是说,返回值是0,插入成功;返回值是1,插入失败。

和select一样,也是有id和parameterType这两个属性,并且这两个属性的作用和select一样。但是Insert还有另外两个属性,用于主键回填。

  • useGeneratedKeys和keyProperty属性

我们插入一行元素之后,有些属性值没填,这些属性值是有默认值或者是自增字段。之后我们又需要返回这些属性值。比如Role的id是自增字段,我们插入一行Role

insert into t_role(name, note) values(#{name}, #{note})

其中id是自动生成的。插入之后我们想要马上获得新增的这行数据的id,这时候就需要用到useGeneratedKeys和keyProperty这两个属性,这叫主键回填。

只需要设置useGeneratedKeys="true",keyProperty="id"即可

在Service层我们的代码如下

Role role = new Role("名字", "无备注");
userDao.insertRole(role);

而Mybatis的配置语句如下所示

<mapper namespace="com.itheima.Dao.UserDao">
    <insert id="findUser" parameterType="com.itheima.domain.User" useGeneratedKeys="true" keyProperty="id">
        insert into t_role(name, note) values(#{name}, #{note})
    </insert>
</mapper>

在Service里的那两行代码执行完成之前,role.id应该为空;那两行代码执行完之后,role.id就被回填有值了。


Update和delete标签的各个属性

这两个标签比较简单,没什么可讲的。



SQL语句动态获取参数

这部分的内容可以看这篇文章MyBatis学习笔记:Mybatis如何传参给持久层接口,以及sql语句如何得到参数的值

猜你喜欢

转载自blog.csdn.net/sinat_38393872/article/details/102706994