zoukankan      html  css  js  c++  java
  • 封装MyBatis输出结果

    一、resultType

    resultType: 执行 sql 得到 ResultSet 转换的类型,也就是要返回的结果类型,使用类型的完全限定名或别名。

    注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。

    resultType 和 resultMap,不能同时使用

    1. 简单类型(掌握)

    接口方法:

    int countStudent();
    

    mapper文件

    <!--sql执行后返回一行一列-->
    <select id="countStudent" resultType="int">
    
    select count(*) from student
    
    </select>
    
    

    测试方法

    @Test
    public void testRetunInt(){
    	int count = studentDao.countStudent();
    	System.out.println(" 学生总人数:"+ count);
    }
    

    2. 对象类型(掌握)

    接口方法

    Student selectById(int id);
    

    mapper文件

    <select id="selectById" resultType="com.md.domain.Student">
    select id,name,email,age from student where id=#{studentId}
    </select>
    

    返回的是集合

    接口方法

    List<Student> selectStudents();
    

    mapper文件,返回的结果类型是这个集合所包含的集合类型

    <select id="selectStudents" resultType="com.md.domain.Student">
    	select id,name,email,age from student
    </select>
    

    Student类中要写set和get方法

    3. Map(了解)

    sql 的查询结果作为 Map 的 key 和 value。推荐使用 Map<Object,Object>。
    注意:Map 作为接口返回值,sql 语句的查询结果最多只能有一条记录。大于一条记录是错误。

    列名是map的key, 列值是map的value

    接口方法

    //定义方法返回Map
        Map<Object,Object> selectMapById(Integer id);
    

    mapper文件

    <!--使用的少-->
        <select id="selectMapById" resultType="java.util.HashMap">
            select id,name,email from student where id=#{stuid}
        </select>
    

    测试方法

    @Test
    public void testReturnMap(){
    	Map<Object,Object> retMap = studentDao.selectMapById(1002);
    	System.out.println(" 查询结果是 Map:"+retMap);
    }
    

    二、resultMap(了解)

    resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。
    常用在列名和 java 对象属性名不一样的情况,具体看下面

    使用方式:

    • 先定义 resultMap,指定列名和属性的对应关系
    • 在<select>中把 resultType 替换为 resultMap

    接口方法

     List<Student> selectAllStudents();
    

    mapper文件

     <!--定义resultMap
            id:自定义名称,表示你定义的这个resultMap
            type:java类型的全限定名称
        -->
        <resultMap id="studentMap" type="com.md.domain.Student">
            <!--列名和java属性的关系-->
            <!--主键列,使用id标签
                column :列名
                property:java类型的属性名
            -->
            <id column="id" property="id" />
            <!--非主键列,使用result-->
            <result column="name" property="name" />
            <result column="email" property="email" />
            <result column="age" property="age" />
    
      	</resultMap>
    
      <select id="selectAllStudents" resultMap="studentMap">
            select id,name, email , age from student
        </select>
    

    三、实体类属性名和列名不同

    1. 使用resultMap

    接口方法

    List<MyStudent> selectMyStudent();
    

    此时的情况就是实体类的属性名和表中的列名不同,

    实体类:

    public class MyStudent {
        private Integer stuid;
        private String stuname;
        private String stuemail;
        private Integer stuage;
        // get、set、等方法
    }    
    

    mapper文件

    <resultMap id="myStudentMap" type="com.md.domain.MyStudent">
            <!--列名和java属性的关系-->
    
            <id column="id" property="stuid" />
            <!--非主键列,使用result-->
            <result column="name" property="stuname" />
            <result column="email" property="stuemail" />
            <result column="age" property="stuage" />
    
    
        </resultMap>
        <!--列名和属性名不一样:第一种方式-->
        <select id="selectMyStudent" resultMap="myStudentMap">
    
             select id,name, email , age from student
        </select>
    

    测试方法

     @Test
        public void testSelectMyStudent(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            StudentDao dao = sqlSession.getMapper(StudentDao.class);
    
            List<MyStudent> myStudentList = dao.selectMyStudent();
            myStudentList.forEach(stu-> System.out.println(stu));
    
            sqlSession.close();
    
        }
    
    // 打印的结果
    MyStudent{stuid=1001, stuname='唐三', stuemail='ts@qq.com', stuage=18}
    MyStudent{stuid=1002, stuname='无邪', stuemail='wx@qq.com', stuage=20}
    MyStudent{stuid=1003, stuname='白昊天', stuemail='ht@qq.com', stuage=18}
    MyStudent{stuid=1004, stuname='刘桑', stuemail='ls@qq.com', stuage=18}
    MyStudent{stuid=1005, stuname='李白', stuemail='li@qq.com', stuage=30}
    MyStudent{stuid=1006, stuname='王昭君', stuemail='wzj@qq.com', stuage=30}
    

    2. 使用列别名和resultType

    此时的实体类还是

    public class MyStudent {
        private Integer stuid;
        private String stuname;
        private String stuemail;
        private Integer stuage;
        // get、set、等方法
    } 
    

    接口方法

    List<MyStudent> selectDiffColProperty();
    

    mapper文件

     <!--列名和属性名不一样:第二种方式
           resultType的默认原则是 同名的列值赋值给同名的属性, 使用列别名(java对象的属性名)
        -->
        <select id="selectDiffColProperty" resultType="com.md.domain.MyStudent">
            select id as stuid ,name as stuname, email as stuemail , age stuage from student
        </select>
    

    测试方法

        @Test
        public void testSelectDiffColProperty(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            StudentDao dao = sqlSession.getMapper(StudentDao.class);
    
            List<MyStudent> myStudentList = dao.selectDiffColProperty();
            myStudentList.forEach(stu-> System.out.println(stu));
    
            sqlSession.close();
        }
    

    结果和使用resultMap是一样的,所以这两种方法使用哪一种都行

    四、模糊查询like

    模糊查询的实现有两种方式

    1. java 代码中给查询数据加上“%”
    2. 在 mapper 文件 sql 语句的条件位置加上“%”

    1. 第一种

    接口方法

        /*第一种模糊查询, 在java代码指定 like的内容*/
    //   例如:唐%
        List<Student> selectLikeOne(String name);
    

    mapper文件

    <!--第一种 like , java代码指定 like的内容-->
        <select id="selectLikeOne" resultType="com.md.domain.Student">
            select id,name,email,age from student where name like #{name}
        </select>
    

    测试文件

       @Test
        public void testSelectLikeOne(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            StudentDao dao = sqlSession.getMapper(StudentDao.class);
    
            List<Student> studentList = dao.selectLikeOne("唐%");
            studentList.forEach(stu-> System.out.println(stu));
    
            sqlSession.close();
        }
    

    可以看出这种方法非常的方便

    2. 第二种

    接口方法

    /* name就是唐这个值, 在mapper中拼接 like  "%" 李 "%" */
        List<Student> selectLikeTwo(String name);
    

    mapper文件

     <!--第二种方式:在mapper文件中拼接 like的内容-->
        <select id="selectLikeTwo" resultType="com.md.domain.Student">
            select id,name,email,age from student where name  like "%" #{name} "%"
        </select>
    

    测试

     @Test
        public void testSelectLikeTwo(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            StudentDao dao = sqlSession.getMapper(StudentDao.class);
    
            List<Student> studentList = dao.selectLikeTwo("白");
            studentList.forEach(stu-> System.out.println(stu));
    
            sqlSession.close();
        }
    

    这种的是直接在mapper中写死了sql模糊查询,不利于扩展

    推荐第一种方式

    五、总结

    1. resultType

    表示sql语句的执行结果,转换为java对象的类型

    • 类型的全限定名称

    2. resultMap

    自定义列名和java对象的属性名对应关系

    3. 列名和属性名不同

    • 使用resultMap
    • 使用列别名

    4. like

    • 在java代码中指定like的内容
    • 在mapper文件中拼接like
  • 相关阅读:
    【名称解释】#001 IIS名词解释
    【C#】#102 发送邮件
    【C#】#101 导入导出Excel
    【C#】#100 调用摄像头
    【转】【Flex】#010 操作XML文件(E4X)
    【Flex教程】#009 As/typeof /instanceof /is的作用
    4 权限组件、频率、3组件总结
    1 request模块
    4 saltstack ssh
    03 深入远程执行:target目标、模块modules、返回returns
  • 原文地址:https://www.cnblogs.com/mengd/p/13455455.html
Copyright © 2011-2022 走看看