resultType: 执行 sql 获得 ResultSet 转换的类型,也就是要返回的结果类型,使用类型的彻底限定名或别名。java
注意若是返回的是集合,那应该设置为集合包含的类型,而不是集合自己。sql
resultType 和 resultMap,不能同时使用app
接口方法:dom
int countStudent();
mapper文件测试
<!--sql执行后返回一行一列--> <select id="countStudent" resultType="int"> select count(*) from student </select>
测试方法ui
@Test public void testRetunInt(){ int count = studentDao.countStudent(); System.out.println(" 学生总人数:"+ count); }
接口方法3d
Student selectById(int id);
mapper文件code
<select id="selectById" resultType="com.md.domain.Student"> select id,name,email,age from student where id=#{studentId} </select>
返回的是集合xml
接口方法对象
List<Student> selectStudents();
mapper文件,返回的结果类型是这个集合所包含的集合类型
<select id="selectStudents" resultType="com.md.domain.Student"> select id,name,email,age from student </select>
Student类中要写set和get方法
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 能够自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。
经常使用在列名和 java 对象属性名不同的状况
,具体看下面
使用方式:
接口方法
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>
接口方法
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}
此时的实体类仍是
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是同样的,因此这两种方法使用哪种都行
模糊查询的实现有两种方式
接口方法
/*第一种模糊查询, 在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(); }
能够看出这种方法很是的方便
接口方法
/* 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模糊查询,不利于扩展
推荐第一种方式
表示sql语句的执行结果,转换为java对象的类型
自定义列名和java对象的属性名对应关系