MyBatis的查询
在上一个MyBatis的核心API中介绍了SqlSessionFactoryBuilder、SqlSessionFactory以及SqlSession是什么,它们都有什么作用,本章节将继续衔接上面的用MyBatis集合查询等
在Customer.xml中添加查询客户的sql语句
<!--查询所有用户,不需要返回参数-->
<select id="queryAllCustomer" resultType="com.lqg.domain.Customer" >
select * from `customer`
</select>
在MyBatis中测试查询所有用户
//查询所有用户
List<Customer> list = sqlSession.selectList("queryAllCustomer", customer);
for (Customer customer1:list) {
System.out.println(customer1);
}
效果如下:
根据用户名模糊查询客户方法一,使用特殊字符,下面会作详细的介绍
<!--根据用户名模糊查询-->
<select id="queryAllByName" parameterType="String" resultType="com.lqg.domain.Customer">
select * from customer where cust_name like '%${value}%'
</select>
在测试类中根据姓名查询所有姓张的用户
//根据名字进行模糊查询
List<Customer> list2 = sqlSession.selectList("queryAllByName", "张");
for(Customer customer2:list){
System.out.println(customer2);
}
根据用户名模糊查询客户方法一的效果如下
在Customer.xml中根据用户名模糊查询客户方法二
<select id="queryAllName" parameterType="String" resultType="com.lqg.domain.Customer">
select * from customer where cust_name like #{customer}
</select>
在测试类中根据姓名查询所有姓张的用户
//根据名字进行模糊查询方法二
List<Customer> queryAllByName = sqlSession.selectList("queryAllName", "%张%");
for(Customer customer3:queryAllByName){
System.out.println(customer3);
}
下面是Customer.xml和MyBatisTest的全部代码,包括根据id查询单个用户的信息,查询所有的信息,根据姓名进行模糊查询
Customer.xml的全部代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mytest">
<!--根据id查询用户-->
<select id="queryCustomerById" parameterType="Int" resultType="com.lqg.domain.Customer">
select * from `customer` where cust_id = #{cust_id}
</select>
<!--查询所有用户,不需要返回参数-->
<select id="queryAllCustomer" resultType="com.lqg.domain.Customer" >
select * from `customer`
</select>
<!-- <!–根据用户名模糊查询–>-->
<select id="queryAllByName" parameterType="String" resultType="com.lqg.domain.Customer">
select * from customer where cust_name like '%${value}%'
</select> <select id="queryAllName" parameterType="String" resultType="com.lqg.domain.Customer">
select * from customer where cust_name like #{customer}
</select>
</mapper>
MyBatisTest的全部代码:
package com.lqg.test; import com.lqg.domain.Customer;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import java.io.IOException;
import java.io.InputStream;
import java.util.List; public class MyBatisTest {
@Test
public void test() throws IOException {
//1.创建一个SqlSessionFactoryBulider的类
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2.加载SqlMapConfig.xml的配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//3.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//4.创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//5.用sqlSession对象执行查询
Customer customer = sqlSession.selectOne("queryCustomerById",1);
System.out.println(customer);
//查询所有用户
List<Customer> list = sqlSession.selectList("queryAllCustomer", customer);
for (Customer customer1:list) {
System.out.println(customer1);
}
//根据名字进行模糊查询方法一
List<Customer> list2 = sqlSession.selectList("queryAllByName", "张");
for(Customer customer2:list2){
System.out.println(customer2);
}
//根据名字进行模糊查询方法二
List<Customer> queryAllByName = sqlSession.selectList("queryAllName", "%张%");
for(Customer customer3:queryAllByName){
System.out.println(customer3);
} }
}
总结:
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中
selectOne:
- 查询一条记录
- 如果使用selectOne查询多条记录则抛出异常
selectList:可以查询一条或多条记录
#{}和${}
#{}:
- 表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值
- 自动进行java类型和jdbc类型转换
- #{}可以有效防止sql注入
- #{}可以接收简单类型值或pojo属性值
- 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称
${}:
- 通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换
- ${}可以接收简单类型值或pojo属性值
- 如果parameterType传输单个简单类型值,${}括号中只能是value