深入浅出Mybatis查询

Posted mtimeyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出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或者注解方式完成了数据库的查询工作。使得方法变的很灵活。

 

以上是关于深入浅出Mybatis查询的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出Mybatis之快速入门!

深入浅出Mybatis之快速入门!

深入浅出Mybatis查询

mybatis模糊查询

深入浅出MyBatis:「映射器」全了解

mybatis深入之动态查询和连接池介绍