这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
Mybatis输出结果封装
resultType
在Select标签里使用,作为Select里的一个属性,表示语句执行返回的结果类型,值有两种,一种是java类型的权限定名称,再一个就是别名。如果对应的列对不上就不会赋值
对象类型
<select id="selectUser" resultType="com.study.pojo.User">
select * from user
</select>
这个例子是用的是java的类型的全限定名称,表示回字形sql语句候返回的数据类型返回为一个User 调用User的无参构造,使用反射创建对象,同名的列附给同名的属性值,得到java对象, 如果返回值是一个List集合,Myabtis就会把User放到一个List集合里, 所以select * from user得到的死把数据库中对应java对象里的列的值赋值给java的属性,然后放到了集合里。
简单数据类型
查询数据条数
Long findUserCount();
<select id="findUserCount" resultType="Long">
select count(*) from user
</select>
@Test
public void Test1(){
//获取sqlsession
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
Long count = mapper.findUserCount();
System.out.println(count);
}
map
sql 的查询结果作为 Map 的 key 和 value。推荐使用 Map<Object,Object>。
注意:Map 作为接口返回值,sql 语句的查询结果最多只能有一条记录。大于一条记录是错误。
HashMap<Object, Object> findUserByIdMap(@Param("Id") Integer id);
<select id="findUserByIdMap" resultType="map">
select * from user where id =#{Id}
</select>
@Test
public void Test2(){
//获取sqlsession
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
HashMap<Object,Object> map =mapper.findUserByIdMap(4);
System.out.println(map);
System.out.println("id=" +map.get("id"));
System.out.println("name=" +map.get("name"));
System.out.println("pwd=" +map.get("pwd"));
}
自定义别名
Mybatis体用我们可以对java类型定义别名 自定义别名步骤,在配置文件中使用typeAilase标签中中声明别名,在mapper中使用别名
<typeAliases>
<!--第一种格式 type:java全限定名称 alias:别名-->
<typeAlias type="com.study.pojo.User" alias="user"/>
<!--第二种 默认name里的宝下边的类名做别名-->
<package name="com.study.pojo"/>
</typeAliases>
resultMap
resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。
常用在列名和 java 对象属性名不一样的情况。 使用方法:
- 先定义resultMap标签,把不对应的列跟属性相互对应上,主键和别的列标签不一样
- 在select返回结果集中把把 resultType 替换为 resultMap
为了保持不一致,我们写一个UserVo来验证一下
@Data
public class UserVo {
private int cid; //id
private String cname; //姓名
private String cpwd; //密码
}
List<UserVo> findUserListVo();
<-- id:自定义名称,唯一值,type :全限定类名-->
<resultMap id="UserVo" type="com.study.vo.UserVo">
<-- 定义列之间的关系 主键用id 属性colum表的,property对应类的属性-->
<id column="id" property="cid"></id>
<result column="name" property="cname"></result>
<result column="pwd" property="cpwd"></result>
</resultMap>
<--使用resultMap-->
<select id="findUserListVo" resultMap="UserVo">
select * from user
</select>
Test
public void test3(){
//获取sqlsession
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<UserVo> user = mapper.findUserListVo();
System.out.println(user);
}
还有一种处理属性名和列明不一致的情况使用resultType。使用别名来保持一致
List<UserVo> findUserListVo2();
<select id="findUserListVo2" resultType="com.study.vo.UserVo">
select id as cid,name as cname,pwd as cpwd from user
</select>
模糊查询
模糊查询的实现有两种方式, 一是 java 代码中给查询数据加上“%” ; 二是在 mapper 文件 sql 的条件位置加上“%”
java 代码中提供要查询的 “%李%”
//模糊查询
List<User> findUserLike(String namelike);
<select id="findUserLike" resultType="com.study.pojo.User" parameterType="String">
select * from user where name like #{namelike}
</select>
@Test
public void selectUserLlike() {
//获取sqlsession
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findUserLike("%李%");
for (User user: users){
System.out.println(user);
}
session.close();
}
mapper 文件中使用 like name "%" #{xxx} "%"
<select id="findUserLike" resultType="com.study.pojo.User" parameterType="String">
select * from user where name like "%"#{value}"%"
</select>
@Test
public void selectUserLlike() {
//获取sqlsession
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findUserLike("李");
for (User user: users){
System.out.println(user);
}
session.close();
}