这片文章是对自己学习的总结,学习材料是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语句如何得到参数的值