MyBatis框架如何实现数据查询?有几种方法?

news2024/11/14 21:31:56

在实际开发中,查询操作通常都会涉及到单条数据的精确查询,以及多条数据的模糊查询。那么使用MyBatis框架是如何进行这两种查询的呢?接下来,本小节将讲解下如何使用MyBatis框架根据客户编号查询客户信息,以及根据客户名模糊查询客户信息。

1.根据客户编号查询客户信息

根据客户编号查询客户信息主要是通过查询客户表中的主键(这里表示唯一的客户编号)来实现的,其具体实现步骤如下:

(1)在MySQL数据库中,创建一个名为mybatis的数据库,在此数据库中创建一个t_customer表,同时预先插入几条数据。此操作所执行的SQL语句如下所示。

# 创建一个名称为mybatis的数据库CREATEDATABASE mybatis;# 使用mybatis数据库USE mybatis;# 创建一个名称为t_customer的表CREATETABLE t_customer (
    id int(32)PRIMARYKEYAUTO_INCREMENT,
    username varchar(50),
    jobs varchar(50),
    phone varchar(16));# 插入3条数据INSERTINTO t_customer VALUES('1','joy','doctor','13745874578');INSERTINTO t_customer VALUES('2','jack','teacher','13521210112');INSERTINTO t_customer VALUES('3','tom','worker','15179405961');

完成上述操作后,数据库t_customer表中的数据如图1所示。

图1 t_customer表

(2)在Eclipse中,创建一个名为chapter06的Web项目,将MyBatis的核心JAR包、lib目录中的依赖JAR包,以及MySQL数据库的驱动JAR包一同添加到项目的lib目录下, 并发布到类路径中。添加后的lib目录如图2所示。

图2 MyBatis相关JAR包

(3)由于MyBatis默认使用log4j输出日志信息,所以如果要查看控制台的输出SQL语句,那么就需要在classpath路径下配置其日志文件。在项目的src目录下创建log4j.properties文件,编辑后的内容如文件1所示。

文件1 log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.itheima=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t]-%m%n

在文件1中,包含了全局的日志配置、MyBatis的日志配置和控制台输出,其中MyBatis的日志配置用于将com.itheima包下所有类的日志记录级别设置为DEBUG。

由于log4j文件中的具体内容已经超出了本书范围,所以这里不过多讲解,读者可自行查找资料学习。上述配置文件代码也不需要读者全部手写,在MyBatis使用手册中的Logging小节,可以找到如图3所示的配置信息,只需将其复制到项目的log4j配置文件中,并对MyBatis的日志配置信息进行简单修改即可使用。

图3 MyBatis使用手册中的Logging配置

(4)在src目录下,创建一个com.itheima.po包,在该包下创建持久化类Customer,并在类中声明id、username、jobs和phone属性,及其对应的getter/setter方法,如文件2所示。

文件2 Customer.java

     package com.itheima.po;/**
      * 客户持久化类
      */public class Customer {
         private Integer id;// 主键id
         private String username;// 客户名称
         private String jobs;// 职业
         private String phone;// 电话publicInteger getId() {
             return id;
         }
         public void setId(Integer id) {
             this.id = id;
         }
         public String getUsername() {
             return username;
         }
         public void setUsername(String username) {
             this.username = username;
         }
         public String getJobs() {
             return jobs;
         }
         public void setJobs(String jobs) {
             this.jobs = jobs;
         }
         public String getPhone() {
             return phone;
         }
         public void setPhone(String phone) {
             this.phone = phone;
         }
         @Overridepublic String toString() {
             return"Customer [id="+ id +", username="+ username +", jobs="+ jobs +", phone="+ phone +"]";
         }
     }

从上述代码可以看出,持久化类Customer与普通的JavaBean并没有什么区别,只是其属性字段与数据库中的表字段相对应。实际上,Customer就是一个POJO(普通Java对象),MyBatis就是采用POJO作为持久化类来完成对数据库操作的。

(5)在src目录下,创建一个com.itheima.mapper包,并在包中创建映射文件CustomerMapper.xml,编辑后如文件3所示。

文件3 CustomerMapper.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"><!-- namespace表示命名空间 --><mapper namespace="com.itheima.mapper.CustomerMapper"><!--根据客户编号获取客户信息 --><select id="findCustomerById" parameterType="Integer"
             resultType="com.itheima.po.Customer">select*from t_customer where id =#{id}</select></mapper>

在文件3中,第2~3行是MyBatis的约束配置,第5~11行是需要程序员编写的映射信息。其中,<mapper>元素是配置文件的根元素,它包含一个namespace属性,该属性为这个<mapper>指定了唯一的命名空间,通常会设置成“包名+SQL映射文件名”的形式。子元素<select>中的信息是用于执行查询操作的配置,其id属性是<select>元素在映射文件中的唯一标识;parameterType属性用于指定传入参数的类型,这里表示传递给执行SQL的是一个Integer类型的参数;resultType属性用于指定返回结果的类型,这里表示返回的数据是Customer类型。在定义的查询SQL语句中,“#{}”用来表示一个占位符,相当于“?”,而“#{id}”表示该占位符待接收参数的名称为id。

多学一招: 快速获取配置文件的约束信息

在MyBatis的映射文件中,包含了一些约束信息,初学者如果自己动手去编写,不但浪费时间,还容易出错。其实,在MyBatis使用手册中,就可以找到这些约束信息,具体的获取方法如下:

打开MyBatis的使用手册mybatis-3.4.2.pdf,在第2小节Getting started(入门指南)下的2.1.5小节Exploring Mapped SQL Statements中,即可找到映射文件的约束信息。如图4所示。

图4 映射文件的约束信息

在图4中,方框处标注的文件信息就是MyBatis映射文件的约束信息。初学者只需将信息复制到项目创建的XML文件中即可。

(6)在src目录下,创建MyBatis的核心配置文件mybatis-config.xml,编辑后如文件4所示。

文件4 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--1.配置环境 ,默认的环境id为mysql--><environments default="mysql"><!--1.2.配置id为mysql的数据库环境 --><environment id="mysql"><!-- 使用JDBC的事务管理 --><transactionManager type="JDBC"/><!--数据库连接池 --><dataSource type="POOLED"><property name="driver"value="com.mysql.jdbc.Driver"/><property name="url"value="jdbc:mysql://localhost:3306/mybatis"/><property name="username"value="root"/><property name="password"value="root"/></dataSource></environment></environments><!--2.配置Mapper的位置 --><mappers><mapper resource="com/itheima/mapper/CustomerMapper.xml"/></mappers></configuration>

在文件4中,第2~3行是MyBatis的配置文件的约束信息,下面<configuration>元素中的内容就是开发人员需要编写的配置信息。这里按照<configuration>子元素的功能不同,将配置分为了两个步骤:第1步配置了环境,第2步配置了Mapper的位置。关于上述代码中各个元素的详细配置信息将在下一章进行详细讲解,此案例中读者只需要按照上述代码配置即可。

小提示:

上述配置文件同样不需要读者完全手动编写。在MyBatis使用手册mybatis-3.4.2.pdf的2.1.2小节中,已经给出了配置模板(包含约束信息),读者只需要复制过来,依照自己的项目需求修改即可。

(7)在src目录下,创建一个com.itheima.test包,在该包下创建测试类MybatisTest,并在类中编写测试方法findCustomerByIdTest(),如文件5所示。

文件5 MybatisTest.java

packagecom.itheima.test;importjava.io.InputStream;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Test;importcom.itheima.po.Customer;/**
      * 入门程序测试类
      */publicclassMybatisTest{/**
          * 根据客户编号查询客户信息
          */@TestpublicvoidfindCustomerByIdTest()throwsException{// 1、读取配置文件String resource ="mybatis-config.xml";InputStream inputStream =Resources.getResourceAsStream(resource);// 2、根据配置文件构建SqlSessionFactorySqlSessionFactory sqlSessionFactory =newSqlSessionFactoryBuilder().build(inputStream);// 3、通过SqlSessionFactory创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果Customer customer = sqlSession.selectOne("com.itheima.mapper"+".CustomerMapper.findCustomerById",1);// 打印输出结果System.out.println(customer.toString());// 5、关闭SqlSession
             sqlSession.close();}}

在文件5的findCustomerByIdTest()方法中,首先通过输入流读取了配置文件,然后根据配置文件构建了SqlSessionFactory对象。接下来通过SqlSessionFactory对象又创建了SqlSession对象,并通过SqlSession对象的selectOne()方法执行查询操作。selectOne()方法的第1个参数表示映射SQL的标识字符串,它由CustomerMapper.xml中<mapper>元素的namespace属性值+<select>元素的id属性值组成;第2个参数表示查询所需的参数,这里查询的是客户表中id为1的客户。为了查看查询结果,这里使用了输出语句输出查询结果信息。最后,程序执行完毕时,关闭了SqlSession。

使用JUnit4测试执行findCustomerByIdTest()方法后,控制台的输出结果如图5所示。

图5 运行结果

从图5可以看出,使用MyBatis框架已经成功查询出了id为1的客户信息。

2.根据客户名模糊查询客户信息

了解了如何使用MyBatis根据客户编号查询客户信息后,接下来讲解下如何根据客户的名称来模糊查询相关的客户信息。

模糊查询的实现非常简单,只需在映射文件中通过<select>元素编写相应的SQL语句,并通过sqlSession的查询方法执行该SQL即可。其具体实现步骤如下:

(1)在映射文件CustomerMapper.xml中,添加根据客户名模糊查询客户信息列表的SQL语句,具体实现代码如下。

<!--根据客户名模糊查询客户信息列表--><select id="findCustomerByName" parameterType="String"
    resultType="com.itheima.po.Customer">select*from t_customer where username like'%${value}%'</select>

与根据客户编号查询相比,上述配置代码中的属性id、parameterType和SQL语句都发生相应变化。其中,SQL语句中的“${}”用来表示拼接SQL的字符串,即不加解释的原样输出。“${value}”表示要拼接的是简单类型参数。

脚下留心:防止SQL注入

在使用“${}”进行SQL字符串拼接时,无法防止SQL注入问题。所以想要既能实现模糊查询,又要防止SQL注入,可以对上述映射文件CustomerMapper.xml中模糊查询的select语句进行修改,使用MySQL中的concat()函数进行字符串拼接。具体修改示例如下所示。

select * from t_customer where username like concat('%',#{value},'%')

(2)在测试类MybatisTest中,添加一个测试方法findCustomerByNameTest(),其代码如下所示。

/**
 * 根据用户名称来模糊查询用户信息列表
 */@Testpublic void findCustomerByNameTest() throws Exception{    
    // 1、读取配置文件
    String resource ="mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);// 2、根据配置文件构建SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = 
new SqlSessionFactoryBuilder().build(inputStream);// 3、通过SqlSessionFactory创建SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果
    List<Customer> customers = sqlSession.selectList("com.itheima.mapper"+".CustomerMapper.findCustomerByName","j");for(Customer customer : customers) {
        //打印输出结果集
        System.out.println(customer);
    }
    // 5、关闭SqlSession
    sqlSession.close();
}

从上述代码可以看出,findCustomerByNameTest()方法只是在第4步时与根据客户编号查询的测试方法有所不同,其他步骤都一致。在第4步时,由于可能查询出的是多条数据,所以调用的是SqlSession的selectList()方法来查询返回结果的集合对象,并使用for循环输出结果集对象。

使用JUnit4执行findCustomerByNameTest()方法后,控制台的输出结果如图6所示。

图6 运行结果

从图6可以看出,使用MyBatis框架已成功查询出了客户表中客户名称中带有“j”的2条客户信息。

至此,MyBatis入门程序的查询功能就已经讲解完成。从上面两个查询方法中可以发现,MyBatis的操作大致可分为以下几个步骤:

1) 读取配置文件。

2) 根据配置文件构建SqlSessionFactory。

3) 通过SqlSessionFactory创建SqlSession。

4) 使用SqlSession对象操作数据库(包括查询、添加、修改、删除,以及提交事务等)。

5) 关闭SqlSession。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前沿技术】在安全且可靠的区块链基础设施中运行业务条线应用

发表时间&#xff1a;2022年4月27日 信息来源&#xff1a;coingeek.com 了解特定企业的业务需求将使你能够构建出一个可扩容的业务条线应用&#xff0c;它将按照你想要的方式进行运作&#xff0c;并在不可篡改的BSV区块链中保存相关记录。 大多数企业都有一个业务条线&#xf…

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识

1.简介 有的小伙伴或者童鞋们可能会好奇地问&#xff0c;不是讲解和分享抓包工具了怎么这里开始讲解HTTP和HTTPS协议了。这是因为你对HTTP协议越了解&#xff0c;你就能越掌握Fiddler的使用方法&#xff0c;反过来你越使用Fiddler&#xff0c;就越能帮助你了解HTTP协议。 Fid…

HashMap原理分析

HashMap原理分析JDK7 HashMap1、模型介绍2、底层实现原理3、描述一下put的过程4、HashMap扩容机制&#xff1a;5、HashMap中的循环链表是如何产生的6、HashMap和HashTable的区别7、HashMap为什么用红黑树而不用B树&#xff1f;JDK8 HashMapJDK7 HashMap 1、模型介绍 HashMap在…

18. time和calendar模块

当代码中需要使用到时间时&#xff0c;我们通常会使用time模块来获取当前时间或者时间戳。 时间戳&#xff1a;从1970年1月1日&#xff08;UTC/GMT的午夜&#xff09;开始所经过的秒数&#xff0c;不考虑闰秒。 1. 时间戳 获取当前时间戳&#xff1a; import timeprint(time…

Springboot+vue预约上门维修服务系统

前端技术&#xff1a;nodejsvueelementui一般是采用前后端分离模式&#xff0c; 后端支持python/php/java/nodejs MTV模式 M:model&#xff0c;模型&#xff0c;负责与数据库交互 V:view&#xff0c;视图是核心&#xff0c;负责接收请求、获取数据、返回结果 T:template&…

并发编程学习(八):ReentrantLock特性、哲学家吃饭问题

ReentrantLock 是java.util.concurrent.locks包下的类。相对于synchronized,它具备如下特性&#xff1a;可中断。可以设置超时时间。可以设置公平锁。支持多个条件变量。即可以有个多个waitset等待队列。与synchronized都支持可重入。ReentrantLock的基本语法&#xff1a;// 获…

c++11 标准模板(STL)(std::multiset)(二)

定义于头文件 <set>template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class multiset;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using…

Day12【元宇宙的实践构想01】—— 元宇宙概念和发展历程

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 ✍每日一句&#xff1a;【道固远&#xff0c;笃行可至&#xff1b;事虽巨&#xff0c;坚为必成】 &#x1f6a9; 今日留言&#xff1a;亮亮被迫去练科目二啦&#xff0c;定时…

K8S架构熟悉及日常操作

目录 一、架构介绍 二、组件介绍 三、调度介绍 四、CLI指令介绍 五、常见CLI指令 六、常见问题排查思路 一、架构介绍 Kubernetes系统架构为客户端/服务端&#xff08;C/S&#xff09;架构&#xff0c;Master作为服务端&#xff0c;Node作为客户端。 Master服务端也被称…

学习逆向安全的必备基础: 汇编的初步了解

什么是汇编 汇编语言是一种低级编程语言&#xff0c;它使用简单的助记符来表示计算机底层的机器指令。 汇编语言是直接与计算机硬件交互的&#xff0c;它能够控制计算机中的每一个细节。 由于汇编语言非常低级&#xff0c;所以编写汇编程序通常比较困难。不过&#xff0c;汇…

微信怎样开发小程序【公司企业小程序开发】

现在很多公司企业都有自己的小程序&#xff0c;没有小程序的公司企业也会寻找开发小程序的途径。那么今天就给大家简单介绍微信怎样开发小程序&#xff0c;希望对需要开发小程序的公司企业有帮助。 一、注册小程序账号 有一个小程序账号是必须的&#xff0c;小程序账号可以在…

那些外贸老鸟们都在认真使用的8个实用小工具

在我们日常的外贸工作中&#xff0c;有很多地方都可以用到一些实用外贸小工具去提高工作效率&#xff0c;突破局部限制。是否能够灵活的应用这些实用外贸小工具&#xff0c;是一位成熟优秀外贸业务员的衡量标准之一。第一个&#xff1a;知识信息整理和CRMhttps://www.notion.so…

Linux(六)基础I/O

引言 C语言进阶 文件管理 上一篇文章详细回顾了C语言方面关于文件操作的一些库函数&#xff0c;比如输入输出重定向fscanf、fprintf&#xff0c;对于文件内容以字符形式读取的fgetc、fputc&#xff0c;对于文件内容以字符串形式读取的fgets、fputs&#xff0c;对于二进制文件的…

ieee会议论文从手稿到发表

0. 前言 在创新点得到认可之后就可以准备发论文了&#xff0c;这个一定要早点&#xff0c;可以给自己设置一个明确的deadline&#xff0c;毕竟ddl是第一生产力。 1. 确定发什么期刊、会议 一定要符合学校的毕业要求&#xff0c;有一些水的学校并不认。时间看能不能赶上学校毕…

物联网智慧消防对比传统消防具有哪些优势?

随着科技的进步和城市化进程的加快&#xff0c;传统消防已经满足不了社会发展的需求&#xff0c;智慧消防应运而生&#xff0c;目前智慧消防已经成为消防安全管理的核心&#xff0c;物联网时代的到来&#xff0c;让智慧消防迎来了更大的发展机遇&#xff0c;变得更加智慧化、系…

手机网站建设怎么做?【手机网站制作】

对于很多公司企业来说&#xff0c;做网站建设都是优先考虑PC端的网站建设&#xff0c;但是某些公司企业可能对于PC端网站的需求不高&#xff0c;倒是更有需要做移动端网站&#xff0c;也就是我们常说的手机网站。那么关于手机网站建设又是怎么做的呢&#xff1f;本文给大家做一…

软件测试员年底总结怎么写?所有问题都帮你梳理好了!

临近年底&#xff0c;很多公司都有年终总结环节&#xff0c;核心目的发现今年的不足&#xff0c;进而总结经验&#xff0c;更好地用以指导明年的工作。当然&#xff0c;即使公司没有要求&#xff0c;对于测试岗位来说&#xff0c;一年一度的总结不可或缺。假如你是测试负责人&a…

<使用Python自定义生成简易二维码>——《Python项目实战》

目录 1.问题导引 2.实现步骤 &#xff08;1&#xff09;查找并安装第三方库qrcode &#xff08;2&#xff09;编写代码并嵌入内置信息 &#xff08;3&#xff09;使用扫码工具读取信息 后记&#xff1a;●由于作者水平有限&#xff0c;文章难免存在谬误之处&#xff0c;敬…

【Tkinter】终于把StringVar讲明白了

文章目录简介Label使用StringVarEntry输入简介 初学者在使用tkinter时常犯的一个错误就是 def changeText(evt):evt.text "new Text"毕竟在创建控件时&#xff0c;text是出现频率很高的参数&#xff0c;换言之&#xff0c;我们会默认控件中有text这个属性&#xf…

CDGA/CDGP数据治理认证班将于2/4正式开课,报名从速!

新的一年&#xff0c;从考证开始&#xff0c;为职场竞争增添更多优势&#xff01; 做数据行业的话&#xff0c;当然推荐考个DAMA-CDGA/CDGP数据管理证书啦&#xff01; DAMA是全球唯一数据管理方面权威性认证&#xff0c;帮助数据从业者提升数据管理能力。 DAMA认证为数据管理专…