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>
<!-- &lt;!&ndash;根据用户名模糊查询&ndash;&gt;-->
<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

MyBatis的查询的更多相关文章

  1. Mybatis关联查询和数据库不一致问题分析与解决

    Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...

  2. myBatis批量查询操作,xml中使用foreach案例

    使用场景:有一个订单表,实体类为OrderBase.java,订单有个状态为status值可能为"1,2,3,4,5,6",现在需要查询状态为"2,3,4"的订 ...

  3. MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射

    先说下问题产生的背景: 最近在做一个用到MyBatis的项目,其中有个业务涉及到关联查询,我是将两个查询分开来写的,即嵌套查询,个人感觉这样更方便重用: 关联的查询使用到了动态sql,在执行查询时就出 ...

  4. MyBatis基础:MyBatis关联查询(4)

    1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...

  5. MyBatis关联查询,一对多关联查询

    实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collect ...

  6. Ibatis/Mybatis模糊查询

    Ibatis/Mybatis模糊查询 根据网络内容整理 Ibatis中 使用$代替#.此种方法就是去掉了类型检查,使用字符串连接,不过可能会有sql注入风险. Sql代码 select * from ...

  7. MyBatis一对一查询

    ---------------------siwuxie095                                 MyBatis 一对一查询         以订单和用户为例,即 相对订 ...

  8. MyBatis高级查询

    -------------------------siwuxie095 MyBatis 高级查询 1.MyBatis 作为一个 ORM 框架,也对 SQL 的高级查询做了支持, MyBatis 高级查 ...

  9. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  10. 在数据库中添加数据以后,使用Mybatis进行查询结果为空

    在数据库中添加数据以后,使用Mybatis进行查询结果为空,这是因为数据库中添加数据忘记commit的缘故.

随机推荐

  1. 每天进步一点点-Tesseract 文字识别

    Tesseract 文字识别 是github上的开源文字识别软件 下载与安装 https://github.com/tesseract-ocr/tesseract/wiki 下载 https://gi ...

  2. jQuery 事件 click() 方法,dblclick() 方法

    click() 方法 当点击元素时,会发生 click 事件. 当鼠标指针停留在元素上方,然后按下并松开鼠标左键时,就会发生一次 click. click() 方法触发 click 事件,或规定当发生 ...

  3. dfs版容斥原理+剪枝——bzoj1853

    学了一种爆搜版+剪枝的容斥方法,即类似数位dp时按位进行容斥,同时需要在搜索过程中进行剪枝 /* 容斥原理,先在打出的表里筛掉所有倍数,然后用容斥原理+1个的倍数-2个lcm的倍数+3个lcm的倍数. ...

  4. tomcat部署安全证书文件(阿里云SSL证书)

    1.下载安全证书文件: 这里使用的是阿里云SSL证书(免费一年) 2.把下载的压缩包进行解压 3.将pfx文件拷贝至服务器 4.利用jdk将pfx转jks 5.cmd进入命令行 6.切换至jdk的bi ...

  5. NX二次开发-UFUN获取图纸视图最大边界和视图中心点UF_DRAW_ask_view_borders

    NX9+VS2012 //获得视图的最大边界 ]; UF_DRAW_ask_view_borders(view_tag[j], view_borders); //获得视图原点 ]; ViewOrigi ...

  6. ssh 私钥和公钥 参考的linux就该这么学

  7. Nutz框架的优点

    轻量级 -- jar文件共约1Mb -- 针对JDBC的薄封装,无缓存. 全面 -- 提供了Dao(ORM, SQL管理),Ioc, Aop, Mvc, Json解析等必要功能. 灵活 -- 各个部分 ...

  8. [转]ThinkPHP分页实例

    很多人初学thinkphp时,不太熟悉thinkphp的分页使用方法,现在将自己整理的分页方法分享下,有需要的朋友可以看看.   控制器中的代码:   $db = M("cost" ...

  9. Ehcache3.x学习(二)分层的选项

    Ehcache支持分层缓存的概念. 当想缓存堆内存以外的空间时,会发生下面的事情: 1.将数据添加到缓存意味着必须序列化key和value. 2.从缓存中读取数据意味着可能必须反序列化key和valu ...

  10. CSS Sprites(CSS图像拼合技术)教程、工具集合

    本集合是有一位国外设计师收集整合,并由 oncoding翻译成中文的,感谢他们的辛苦贡献.CSS Sprites技术在国外并不是什么新技术,只不过近两年(尤其08年开始)中国开始流行这个词,大家也开始 ...