深入浅出Mybatis(三)查询

前言

要对数据库进行操纵,得有一个需求,所以拟定了一个下面的需求,实现下面的功能:

  • 根据用户id查询一个用户信息
  • 根据用户名称模糊查询用户信息列表
  • 添加用户
  • 更新用户
  • 删除用户

程序编写

建立User.java实体类

pojo类作为mybatis进行sql映射使用,pojo类通常与数据库表对应,

在src中建立一个名为cn.itcast.mybatis.pojo的包,在包内建立一个名为User.java的类:

package com.dtt.com.dtt.mybatis.pojo;

import java.util.Date;

public class User {
    /**
     * 用户表实体类

     */
    private int id;
    private String username;//用户名
    private String sex;//性别
    private Date birthday;//生日
    private String address;// 地址

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

建立User.xml映射文件

右击com.dtt.mybatis.pojo包,New->File,建立一个名字为User.xml的文件。

在User.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="test">
</mapper>

mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml,在SqlMapConfig.xml添加映射代码,如下:

<!-- 加载映射文件 -->
    <mappers>
        <!-- 通过resource方法加载单个映射文件,resource是相对路径 -->
        <mapper resource="cn/itcast/mybatis/po/User.xml" />
    </mappers>

建立好后,进行查询的操作。

查询操作

查询的需求是:

  • 根据用户id查询一个用户信息
  • 根据用户名称模糊查询用户信息列表

在User.xml中添加sql语句:

<?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="test"><!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
    <!-- id:statement的id 或者叫做sql的id-->
    <!-- parameterType:声明输入参数的类型 -->
    <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
    <!-- #{}:输入参数的占位符,相当于jdbc的? -->
    <!-- 根据id获取用户信息 -->
    <select id="findUserById" parameterType="int"
            resultType="com.dtt.mybatis.pojo.user" >
 select * from user where id = #{id}
  </select>
    <!-- 根据用户名,查询用户列表,支持模糊查询 -->
    <select id="findUserByUsername" parameterType="java.lang.String"
            resultType="com.dtt.mybatis.pojo.user">
 select * from user where username like ‘%${value}%‘
  </select>

</mapper>

建立测试类UserTest.java,在这个类中进行单元测试,前提是引入了junit-4.9.jar,这个jar包。

测试代码如下:

package com.dtt.mybatis.test;

import com.dtt.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserTest {
    //会话工厂
    private SqlSessionFactory sqlSessionFactory;

    // Before在开始测试之前加载的方法,主要是创建会话工厂
    @Before
    public void createSqlSessionFactory() throws IOException {
        //配置文件
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void testFindUserById() {
        //数据会话实例
        SqlSession sqlSession = null;
        try {
            /* 创建数据库会话实例 */
            sqlSession = sqlSessionFactory.openSession();
            // 查询单个记录,根据用户id查询用户信息
            User user = sqlSession.selectOne("test.findUserById", 10);
            // 输出用户信息
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

    }
    // 根据用户名称模糊查询用户信息
    @Test
    public void testFindUserByUsername() {
        // 数据库会话实例
        SqlSession sqlSession = null;
        try {
            // 创建数据库会话实例
            sqlSession = sqlSessionFactory.openSession();
            // 查询单个记录,根据用户id查询用户信息
            List<User> list = sqlSession.selectList("test.findUserByUsername", "小");
            System.out.println(list.size());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

}

设计到的知识点

#{}和${}
            在User.xml中在定义sql语句的时候,遇到了这两个属性,都是嵌套在sql语句中的,他们都是用来赋值的。

# {} 表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java 类型和jdbc类型转换,可以有效的防止sql注入。可以接收简单类型值或者pojo属性值。如果parameterType传输单个简单类型值,#{}括号中可以是value或者其他任意名称。

${}表示拼接sql串,通过 它可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,也可以接收简单类型值如int,或者pojo属性值。如果parameterType传输单个简单类型值,括号中只能是value。
 parameterType和resultType

在User.xml中在定义sql语句的时候,遇到了这两个属性,一个是输入数据类型,一个是输出数据类型。

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

selectOne和selectList

在测试类UserTest.java中,我们执行的方法中的sqlSession有这两个属性,看字面很容易看出来,一个是查询一个,一个是查询多个。他们可以互换吗?显然,可以使用selectList来代替selectOne,而不可以用selectOne代替selectList。否则会抛出如下的错误:

selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:

通过把sql语句写到User.xml文件中了,然后把这个文件在SqlMapConfig.xml中添加了映射,通过xml或者注解方式完成了数据库的查询工作。使得方法变的很灵活。

原文地址:https://www.cnblogs.com/mtime2004/p/9858680.html

时间: 2024-10-09 19:11:41

深入浅出Mybatis(三)查询的相关文章

深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)[转]

上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根节点下面,可配置properties.typeAliases.plugins.objectFactory.objectWrapperFactory.settings.environments.databaseIdProvider.typeHandlers.mappers这些节点.那么本次,就会先介绍prope

深入浅出mybatis之启动详解

深入浅出mybatis之启动详解 MyBatis功能丰富,但使用起来非常简单明了,今天我们来追踪一下它的启动过程. 目录 如何启动MyBatis 如何使用MyBatis MyBatis启动过程 如何启动MyBatis 我们知道,SqlSessionFactory是MyBatis中最为核心的组件,每个基于MyBatis的应用都是以一个SqlSessionFactory实例为中心的.SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而SqlSess

深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置[转]

上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习, 本次涉及到剩下没提及到的几个节点的配置:objectFactory.databaseIdProvider.plugins.mappers. 那么,接下来,就简单介绍一下这几个配置的作用吧: 1.objectFactory是干什么的? 需要配置吗? MyBatis 每次创建结果对象的新实例时,它都会使用一个

函数原型属性-JavaScript深入浅出(三)

前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出的用法,我们知道了this的用法取决于函数四种调用的方式. 这一次我们来对JavaScript中原型以及原型链做一个深入浅出的理解. JavaScript深入浅出系列 1)复杂值vs原始值&&内存空间 - JavaScript深入浅出(一) 2)this的用法 – JavaScript深入浅出

Mybatis like查询的写法--转载

原文地址:http://lavasoft.blog.51cto.com/62575/1386870 Mybatis like查询官方文档没有明确的例子可循,网上搜索了很多,都不正确. Mybatis 3.2.6 经过尝试,给出三种可靠可用的写法: select * from person where name  like "%"#{name}"%" select * from person where name  like '%'||#{name}||'%' sel

深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)[转]

上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, 本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名. 例如: 我们在使用 com.demo.entity. UserEntity 的时候,我们可以直接配置一个别名user, 这样

深入浅出Mybatis系列(九)---强大的动态SQL(转载)

原文出处:http://www.cnblogs.com/dongying/p/4092662.html 上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis强大的动态SQL. 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Myba

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

先说下问题产生的背景: 最近在做一个用到MyBatis的项目,其中有个业务涉及到关联查询,我是将两个查询分开来写的,即嵌套查询,个人感觉这样更方便重用: 关联的查询使用到了动态sql,在执行查询时就出现了如下错误:Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class java.lang.Integer' 因为出现了这个问题,

深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置

上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习, 本次涉及到剩下没提及到的几个节点的配置:objectFactory.databaseIdProvider.plugins.mappers. 那么,接下来,就简单介绍一下这几个配置的作用吧: 1.objectFactory是干什么的? 需要配置吗? MyBatis 每次创建结果对象的新实例时,它都会使用一个