Mybatis学习第二天

492 阅读3分钟

这是我参与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 对象属性名不一样的情况。 使用方法:

  1. 先定义resultMap标签,把不对应的列跟属性相互对应上,主键和别的列标签不一样
  2. 在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();
}