mybatis 基础理解resultType和resultMap
resultType和resultMap:
1.resultType:
一、返回一般数据类型
比如要根据 id 属性获得数据库中的某个字段值。
mapper (dao)接口:
// 根据 id 获得数据库中的 username 字段的值
String getStuNameById(Integer id);
Mapper.xml 映射文件:
<!-- 指定 resultType 返回值类型时 String 类型的,string 在这里是一个别名,代表的是 java.lang.String
对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 'hashmap'
基本数据类型考虑到重复的问题,会在其前面加上 '_',比如 byte 对应的别名是 '_byte'-->
<select id="getStuNameById" resultType="string">
select username from t_student where id = #{id}
</select>
二、返回 JavaBean 类型
比如根据某个字段获得数据库中的信息,把查询的结果信息封装成某个 JavaBean 类型的数据。
mapper (dao)接口:
// 根据 id 查询信息,并把信息封装成 Student 对象
Student getStuById(Integer id);
Mapper.xml 映射文件:
<!-- 通过 resultType 指定查询的结果是 Student类型的数据 只需要指定 resultType 的类型,MyBatis 会自动将查询的结果映射成 JavaBean 中的属性-->
<select id="getStuById" resultType="student">
select * from t_student where id = #{id}
</select>
三、返回List类型
有时候我们要查询的数据不止一条,比如:模糊查询,全表查询等,这时候返回的数据可能不止是一条数据,对于多数据的处理可以存放在List集合中。
mapper(dao) 接口:
// 假如是全表查询数据,将查询的数据封装成Student类型的集合
List<Student> getAllStus();
Mapper.xml 映射文件:
<!--注意这里的 resultType 返回值类型是集合内存储数据的类型,不是 'list'-->
<select id="getAllStus" resultType="student">
select * from t_student
</select>
四、返回Map类型
MyBatis支持将查询的数据封装成Map。
1. 如果查询的结果是一条,我们可以把查询的数据以{表字段名, 对应的值}方式存入到Map中。
mapper (dao)接口:
// 根据 id 查询信息,并把结果信息封装成 Map
Map<String, Object> getStuAsMapById(Integer id);
Mapper.xml 映射文件:
<!-- 注意这里的 resultType 返回值类型是 'map'-->
<select id="getStuAsMapById" resultType="map">
select * from t_student where id = #{id}
</select>
2. 如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map。
mapper (dao)接口:
// 查询所有学生的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Student 对象
// @MapKey 中的值表示用数据库中的哪个字段名作 key
@MapKey("id")
Map<Integer, Student> getAllStusAsMap();
Mapper.xml 映射文件:
<!--注意 resultType 返回值类型,不再是 'map',而是 Map 的 value 对应的 JavaBean 类型-->
<select id="getAllStusAsMap" resultType="student">
select * from t_student
</select>
2.resultmap:(重点)
1 <!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性--> 2 <resultMap id="唯一的标识" type="映射的pojo对象"> 3 <id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" /> 4 <result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/> 5 6 7 <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象"> 8 <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/> 9 <result column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/> 10 </association> 11 12 13 <!-- 集合中的property须为oftype定义的pojo对象的属性--> 14 <collection property="pojo的集合属性" ofType="集合中的pojo对象"> 15 <id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" /> 16 <result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" /> 17 </collection> 18 </resultMap>
UserDao.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 <mapper namespace="com.etc.dao.UserDao"> 4 <resultMap id="myuser" type="user"> 5 <id property="id" column="id"></id> 6 <result property="name" column="name"></result> 7 <result property="sal" column="sal"></result> 8 <result property="birth" column="birthday"></result> 9 <collection property="addresses" ofType="address"> 10 <id property="id" column="aid"></id> 11 <result property="name" column="aname"></result> 12 </collection> 13 </resultMap> 14 15 <insert id="save" useGeneratedKeys="true" keyProperty="id"> 16 insert into t_user(name,sal,birthday) values(#{name},#{sal},#{birth}) 17 </insert> 18 19 <update id="update"> 20 update t_user set name=#{name},sal=#{sal},birth=#{birth} where id=#{id} 21 </update> 22 23 <delete id="delete"> 24 delete from t_user where id =#{id} 25 </delete> 26 27 <!--<select id="queryById" resultType="com.etc.entity.User">--> 28 <!--select u.id,u.name,u.sal,u.birthday,a.id aid,a.name aname from t_user u,t_address a where a.user_id=u.id and u.id=#{id}--> 29 <select id="queryById" resultMap="myuser"> 30 SELECT 31 u.id, 32 u. NAME, 33 u.sal, 34 u.birthday, 35 a.id aid, 36 a. NAME aname 37 FROM 38 t_user u, 39 t_address a, 40 t_user_address ua 41 WHERE 42 u.id = ua.user_id 43 AND ua.address_id = a.id 44 AND u.id = #{id} 45 </select> 46 47 <select id="queryAll" resultMap="myuser"> 48 SELECT 49 u.id, 50 u. NAME, 51 u.sal, 52 u.birthday, 53 a.id aid, 54 a. NAME aname 55 FROM 56 t_user u, 57 t_address a, 58 t_user_address ua 59 WHERE 60 u.id = ua.user_id 61 AND ua.address_id = a.id 62 </select> 63 </mapper>
UserDao接口:
1 package com.etc.dao; 2 3 import com.etc.entity.User; 4 5 import java.util.List; 6 7 public interface UserDao { 8 //@Param 是在 userDAO.xml中使用 9 // 参数是一个可以不写,多于一个的时候,一定要写 10 //void save(@Param("name") String ne, @Param("sal") double sal, @Param("birth") Date birth); 11 void save(User user); 12 13 void update(User user); 14 15 void delete(int id); 16 17 User queryById(int id); 18 19 List<User> queryAll(); 20 }
useGeneratedKeys="true" keyProperty="id":
官方的说法是该参数的作用是:“允许JDBC支持自动生成主键,需要驱动兼容”,如何理解这句话的意思?
在使用mybatis时,常常会出现这种需求:
当主键id是自增的情况下,添加一条记录的同时,其主键id是不能使用的,当我们取出主键id的值发现id为null,但是有时我们需要该主键,这时我们该如何处理呢?
这时我们只需要在其对应xxxmapper.xml中加入该属性即可。则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。
<insert id="save" useGeneratedKeys="true" keyProperty="id"> insert into t_user(name,sal,birthday) values(#{name},#{sal},#{birth}) </insert>
UserDaoTest:
1 package com.etc.dao; 2 3 import com.etc.entity.User; 4 import org.apache.ibatis.io.Resources; 5 import org.apache.ibatis.session.SqlSession; 6 import org.apache.ibatis.session.SqlSessionFactory; 7 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 8 import org.junit.Test; 9 10 import java.io.IOException; 11 import java.io.InputStream; 12 import java.util.List; 13 14 public class UserDaoTest { 15 16 @Test 17 public void testSave() throws IOException { 18 //加载配置文件, // 会话工厂 19 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 20 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 21 // 会话 == 相当于数据库连接 22 SqlSession session = sqlSessionFactory.openSession(); 23 //调用语句 24 //session.insert("com.etc.dao.UserDAO.save"); 25 //session.insert("com.etc.dao.UserDAO.select"); 26 UserDao userDAO = session.getMapper(UserDao.class); 27 // User user = new User(); 28 // user.setName("asdasdaa"); 29 // user.setSal(1000.01); 30 // user.setBirth(new Date()); 31 // user.setId(15); 32 // userDAO.save("asdasdaa",1000.01,new Date()); 33 // System.out.println(user.getId()); 34 // userDAO.update(user); 35 // userDAO.delete(15); 36 // User user2 = userDAO.queryById(5); 37 // System.out.println(user2); 38 List<User> list=userDAO.queryAll(); 39 for (User u:list){ 40 System.out.println(u); 41 } 42 //提交, mybatis自动开启了事务 43 session.commit(); 44 //关闭连接 45 session.close(); 46 } 47 }
附件:mybatis-config.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration PUBLIC 3 "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <typeAliases> 8 <typeAlias type="com.etc.entity.User" alias="user"></typeAlias> 9 <package name="com.etc.entity"></package> 10 </typeAliases> 11 12 <!-- 配置环境变量 --> 13 <!-- 开发 测试 预生产 生产 --> 14 <environments default="development"> 15 <environment id="development"> 16 <transactionManager type="JDBC"/> 17 <dataSource type="POOLED"> 18 <property name="driver" value="com.mysql.jdbc.Driver"/> 19 <property name="url" 20 value="jdbc:mysql://127.0.0.1:3310/mybatis"/> 21 <property name="username" value="root"/> 22 <property name="password" value="123456"/> 23 </dataSource> 24 </environment> 25 </environments> 26 27 28 <!-- 配置mappers --> 29 <mappers> 30 <mapper resource="UserDao.xml"></mapper> 31 <mapper resource="AddressDAO.xml"></mapper> 32 </mappers> 33 34 </configuration>
-------------------------------------------
新人只求记录学习生活!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!