MyBatis的查询
在上一个MyBatis的核心API中介绍了SqlSessionFactoryBuilder、SqlSessionFactory以及SqlSession是什么,它们都有什么作用,本章节将继续衔接上面的用MyBatis集合查询等
在Customer.xml中添加查询客户的sql语句
10 <!--查询所有用户,不需要返回参数--> 11 <select id="queryAllCustomer" resultType="com.lqg.domain.Customer" > 12 select * from `customer` 13 </select>
在MyBatis中测试查询所有用户
1 //查询所有用户 2 List<Customer> list = sqlSession.selectList("queryAllCustomer", customer); 3 for (Customer customer1:list) { 4 System.out.println(customer1); 5 }
效果如下:
根据用户名模糊查询客户方法一,使用特殊字符,下面会作详细的介绍
1 <!--根据用户名模糊查询--> 2 <select id="queryAllByName" parameterType="String" resultType="com.lqg.domain.Customer"> 3 select * from customer where cust_name like '%${value}%' 4 </select>
在测试类中根据姓名查询所有姓张的用户
1 //根据名字进行模糊查询 2 List<Customer> list2 = sqlSession.selectList("queryAllByName", "张"); 3 for(Customer customer2:list){ 4 System.out.println(customer2); 5 }
根据用户名模糊查询客户方法一的效果如下
在Customer.xml中根据用户名模糊查询客户方法二
1 <select id="queryAllName" parameterType="String" resultType="com.lqg.domain.Customer"> 2 select * from customer where cust_name like #{customer} 3 </select>
在测试类中根据姓名查询所有姓张的用户
1 //根据名字进行模糊查询方法二 2 List<Customer> queryAllByName = sqlSession.selectList("queryAllName", "%张%"); 3 for(Customer customer3:queryAllByName){ 4 System.out.println(customer3); 5 }
下面是Customer.xml和MyBatisTest的全部代码,包括根据id查询单个用户的信息,查询所有的信息,根据姓名进行模糊查询
Customer.xml的全部代码:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="Mytest"> 6 <!--根据id查询用户--> 7 <select id="queryCustomerById" parameterType="Int" resultType="com.lqg.domain.Customer"> 8 select * from `customer` where cust_id = #{cust_id} 9 </select> 10 <!--查询所有用户,不需要返回参数--> 11 <select id="queryAllCustomer" resultType="com.lqg.domain.Customer" > 12 select * from `customer` 13 </select> 14 <!-- <!–根据用户名模糊查询–>--> 15 <select id="queryAllByName" parameterType="String" resultType="com.lqg.domain.Customer"> 16 select * from customer where cust_name like '%${value}%' 17 </select> 18 19 <select id="queryAllName" parameterType="String" resultType="com.lqg.domain.Customer"> 20 select * from customer where cust_name like #{customer} 21 </select> 22 </mapper>
MyBatisTest的全部代码:
1 package com.lqg.test; 2 3 import com.lqg.domain.Customer; 4 import org.apache.ibatis.io.Resources; 5 import org.apache.ibatis.session.SqlSession; 6 import org.apache.ibatis.session.SqlSessionFactory; 7 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 8 import org.junit.Test; 9 10 import java.io.IOException; 11 import java.io.InputStream; 12 import java.util.List; 13 14 public class MyBatisTest { 15 @Test 16 public void test() throws IOException { 17 //1.创建一个SqlSessionFactoryBulider的类 18 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 19 //2.加载SqlMapConfig.xml的配置文件 20 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); 21 //3.创建SqlSessionFactory对象 22 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); 23 //4.创建SqlSession对象 24 SqlSession sqlSession = sqlSessionFactory.openSession(); 25 //5.用sqlSession对象执行查询 26 Customer customer = sqlSession.selectOne("queryCustomerById",1); 27 System.out.println(customer); 28 //查询所有用户 29 List<Customer> list = sqlSession.selectList("queryAllCustomer", customer); 30 for (Customer customer1:list) { 31 System.out.println(customer1); 32 } 33 //根据名字进行模糊查询方法一 34 List<Customer> list2 = sqlSession.selectList("queryAllByName", "张"); 35 for(Customer customer2:list2){ 36 System.out.println(customer2); 37 } 38 //根据名字进行模糊查询方法二 39 List<Customer> queryAllByName = sqlSession.selectList("queryAllName", "%张%"); 40 for(Customer customer3:queryAllByName){ 41 System.out.println(customer3); 42 } 43 44 } 45 }
总结:
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