zoukankan      html  css  js  c++  java
  • 深入浅出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或者注解方式完成了数据库的查询工作。使得方法变的很灵活。

  • 相关阅读:
    RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例
    Spring入门(四):使用Maven管理Spring项目
    Java基础知识常见面试题汇总 第三篇
    Java基础知识常见面试题汇总 第二篇
    Java基础知识常见面试题汇总 第一篇
    程序员如何巧用Excel提高工作效率 第二篇
    程序员如何巧用Excel提高工作效率
    数据库管理工具DataGrip使用总结(一)
    MySql给表添加列和注释
    Spring入门(三):通过JavaConfig装配bean
  • 原文地址:https://www.cnblogs.com/mtime2004/p/9858680.html
Copyright © 2011-2022 走看看