一、查询方式
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可以自动识别