Mybatis(三)【查】

"本文介绍了MyBatis中resultType和parameterType的使用,包括查询返回类型如list、single和map,以及参数传递的三种方式:单参数、多参数对象和Map参数。解析了#{}
摘要由CSDN通过智能技术生成

一、查询方式

resulttype 和 parameterType都是传入泛型类,但是parameterType可以省略不写,mybatis可以自动识别

mapper.xml

<mapper namespace="com.sw.mapper.FlowerMapper">
    <!--返回list集合-->
    <select id="selectALL" resultType="flower"><!--该sql语句返回一个数据集合包含多行记录-->
        select * from flower
    </select>
    <!--返回单个数据-->
    <select id="selectOne" resultType="flower"><!--该sql语句仅返回一条数据-->
        select * from flower where id = 1
    </select>
    <!--返回类型为map,返回Map集合--> 
    <!--对于普通的 Java 类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载的名字,要注意原生类型的特殊处理。 ,详细情况见chm文档的typeAliases部分
-->
    <select id="selectMap" resultType="map"><!--该sql语句仅返回一条数据-->
        select * from flower
    </select>
</mapper>

相应的在Test测试代码中使用sqlsession方法也不一样

public static void main(String[] args) throws IOException {

        //解析XML文件
        InputStream stream = Resources.getResourceAsStream("mybatis.xml");
        //获得session工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream);

        //获得session对象
        SqlSession session = factory.openSession();

        //调用方法
        //mybatis中查询方式常用的有两种
        //一种是selectList, 一种是selectOne.二者的区别是仅仅是 selectOne 必须返回一个对象。
        // 如果多余一个, 或者 没有返回 (或返回了 null) 那么就会抛出异常。 
        //如果你不知道需要多少对象, 使用 selectList。
        List<Flower> list = session.selectList("com.sw.mapper.FlowerMapper.selectALL");
        System.out.println(list);
        Flower flower = session.selectOne("com.sw.mapper.FlowerMapper.selectOne");

        //还有一种不常用的查询方式是selectMap,除了返回list类型的结果,还可以返回map类型的结果.
        //函数形参,①方法的全路径,②选择数据库表中的哪一列作为key
        // 适用的场景 :查询的时候可以快速的通过某一列确定对应的数据    
//对于返回list的数据集合来说,如果我想查结果中id为3的数据,那么只能循环遍历,查找记录集合中id为3的记录,但是map可以实现快速找到id为3的数据
        Map<Object, Object> map = session.selectOne("com.sw.mapper.FlowerMapper.selectMap","id")
        //关闭资源
        session.close();
    }

selectmap查询结果显示:,id为key,记录为value

传入参数的查询方式:  parameterType

<!--三种参数传递-->
<!-- 单参数传递-->
<!--方式一   public Flower  selectOne2(Integer  id) ,只能传递一个值,   且传入的是基本数据类型,不能传入对象-->   
<select id="selectOne2" resultType="flower" parameterType="int">  
    select  *  from  flower  where  id=#{param1}          
</select>          

Test测试代码中使用该方式的代码:
sqlsession.selectOne("com.bjsxt.mapper.Flowermapper2.selectOne2",1)
使用selectList也可以,不过返回的列表,selectOne要保证sql仅返回一条数据

 如下图所示,使用第一种传递方式在使用时是❓而不是param1,表示底层使用的是preparedStatement,使用❓占位符进行查询

<!--方式二   public   Flower  selectOne3(Flower fl);  -->  
<!--多参数传递-->
<select id="selectOne3" resultType="flower" parameterType="flower">  
<!--id=#{对象中的属性名}  -->       
<!--底层调用对象中get方法获取属性值,所以{}里面和类的属性名称保持一致,-->
select  *  from  flower  where  id=#{id}  and  name=#{name}  
</select>

Test测试代码中的使用:
Flower f = new Flower();
f.setId(1)
f.setName("玫瑰花")
Flower flower = sqlsession.selectOne("com.bjsxt.mapper.Flowermapper2.selectOne3",f)
使用selectList也可以,不过返回的列表,selectOne要保证sql仅返回一条数据

{}里面和类的属性名称保持一致

 底层仍然使用占位符

 但是在mysql中很可能是多表查询,也就是说查询所需要的参数可能无法包含在一个对象中,此时第二种传递方式就行不通了.

<!--方式三   public   Flower  selectOne3(Flower fl);  -->    
<select id="selectOne4" parametertype="map" resultType="flower">            
select  *  from   flower  where  id=${a}  and name=${b}   
<!--{}里面的内容要和map的key保持一致-->
</select>


 注意在这种方法中,会发现和上述两种方式不一样,参数后面从#{}变成了${},其实之前两种方式都可以将#{}变成${},但是这两种方法有区别:

底层同样使用占位符PreparedStatement(使用#{})

在这种使用占位符的查询方式中,在Test测试代码中的使用方法也和拼接不同:


Test测试代码中使用:
Map<String, Object> map = new HashMap<>();
map.put('a', 1);
map.put('b', "玫瑰花")

Flower flower = sqlsession.selectOne("com.bjsxt.mapper.FlowerMapper2.selectOne4", map)

底层同样使用字符串拼接Statement(使用${})

 使用字符串拼接,如果仍然像占位符那样在Test中使用,则会报错:因为他不再把这两个输入当作参数传入,而是当作字符串,所以在使用时要对字符串部分再加一对引号


Test测试代码中使用:
Map<String, Object> map = new HashMap<>();
map.put('a', 1);
map.put('b', "'玫瑰花'")

Flower flower = sqlsession.selectOne("com.bjsxt.mapper.FlowerMapper2.selectOne4", map)

常用的仍然是井号#,写法与使用上相对简单

resulttype 和 parameterType都是传入泛型类或者别名,但是parameterType可以省略不写,mybatis可以自动识别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meikesibondwell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值