四、封装Mybatis的输出结果
输出结果指的是mybatis执行sql语句之后得到的Java对象
1.resultType
1.resultType:结果类型。指sql语句执行完毕后,数据转为的java对象(对象的类型是任意的)
处理方式:
(1)mybatis执行sql语句,并调用类的无参数构造方法,创建对象
(2)mybatis把ResultSet指定列值赋给同名的属性
比如:
<select id="selectMutiParam" resultType="customDAO.Test">
SELECT id,name FROM t_test;
</select>
对应的jdbc:
ResultSet rs = executeQuery("SELECT id,name FROM t_test");
while(rs.next())
{
Test t = new Test();
t.setId(rs.getInt("id"));
t.setName(rs.getString("name"));
}
2.resultType的值:
(1)类型的全限定名称
(2)类型的别名(比如java.lang.Integer的别名是int)
3.定义自定义类型的别名
(1)在mybatis主配置文件中定义,使用<typeAlias>定义别名
(2)在resultType中使用自定义别名
第一种方式
<typeAliases>
<!--
指定自定义类型的别名
type:全限定名称
alias:自定义的别名
-->
<typeAlias type="customDAO.Test" alias="Test"></typeAlias>
</typeAliases>
第二种方式
<!--
第二种方式:
使用<package>标签
name是包名,这个包中所有类的类名就是别名
-->
<package name="customDAO"></package>
4.返回值为Map
对应的dao接口
package customDAO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
//定义操作test表的接口
public interface TestDao
{
//定义方法返回Map
public Map<Object,Object> selectIdByMap(Integer id);
}
sql映射文件
<!--
返回map:
(1)列名是map的key,列值是map的value
(2)sql查询结果最多只能有一条,如果多于一条会产生异常
-->
<select id="selectIdByMap" resultType="java.util.HashMap">
SELECT * FROM t_test WHERE id = #{id};
</select>
2.resultMap
resultMap:结果映射,用于指定列名和java对象的属性的对应关系
(1)自定义列值赋值给某个属性
(2)当列名和属性名不一样时,一定要使用resultMap
对应的dao接口
package customDAO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
//定义操作test表的接口
public interface TestDao
{
//使用resultMap定义映射关系
public List<Test> selectAlltests();
}
sql映射文件
<!--
使用resultMap
(1)定义resultMap
(2)在select标签中引用(1)中定义好的resultMap
-->
<!--
定义resultMap
id:自定义名称,表示你定义的这个resultMap
type:Java类型的全限定名称
-->
<resultMap id="testMap" type="customDAO.Test">
<!--
指定列名和java对象属性间的关系
-->
<!--
主键列使用id标签
column:列名
property:java类型的属性名
-->
<id column="id" property="id"></id>
<!--
非主键类使用result标签
-->
<result column="name" property="name"></result>
</resultMap>
<select id="selectAlltests" resultMap="testMap">
SELECT * FROM t_test;
</select>
测试函数
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestMybatis
{
@Test
public void testselectAllTests()
{
SqlSession sqlSession = MybatisUtil.getSqlSession();
TestDao testDao = sqlSession.getMapper(TestDao.class);
List<customDAO.Test> list = testDao.selectAlltests();
list.forEach(t-> System.out.println(t));
}
}
解决列名和属性名不一样的第二种方式
使用列别名解决,定义的类别名就是你定义的类的属性名
<select id="selectAlltests" resultMap="testMap">
SELECT id as stuId FROM t_test;
</select>
3.like查询
在mybatis中使用like查询的两种方式
3.1 第一种方式
直接传入带有通配符的字符串
dao接口的方法
import java.util.List;
//定义操作test表的接口
public interface TestDao
{
//第一种模糊查询:在java代码中指定like的内容
public List<Test> selectLikeOne(String name);
}
sql映射文件中的语句
<!--
第一种like查询
-->
<select id="selectLikeOne" resultType="customDAO.Test">
SELECT * FROM t_test WHERE name LIKE #{name};
</select>
传入参数
@Test
public void testLikeOne()
{
SqlSession sqlSession = MybatisUtil.getSqlSession();
TestDao testDao = sqlSession.getMapper(TestDao.class);
//这里的字符串直接传入%name%,包含通配符
List<customDAO.Test> list = testDao.selectLikeOne("%张%");
list.forEach(t-> System.out.println(t));
}
3.2 第二种方式
采用字符串拼接的方式
sql映射文件
<!--
第二种like查询
拼接字符串
-->
<select id="selectLikeTwo" resultType="customDAO.Test">
SELECT * FROM t_test WHERE name LIKE "%" #{name} "%";
</select>
测试方法
@Test
public void testLikeTwo()
{
SqlSession sqlSession = MybatisUtil.getSqlSession();
TestDao testDao = sqlSession.getMapper(TestDao.class);
//这里的字符串直接传入name
List<customDAO.Test> list = testDao.selectLikeTwo("李");
list.forEach(t-> System.out.println(t));
}
dao接口中的方法
import java.util.List;
//定义操作test表的接口
public interface TestDao
{
//第二种模糊查询:在mapper文件中拼接like的内容
public List<Test> selectLikeTwo(String name);
}