MyBatis框架如何实现数据查询?有几种方法?
创始人
2024-05-21 03:18:29
0

在实际开发中,查询操作通常都会涉及到单条数据的精确查询,以及多条数据的模糊查询。那么使用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;// 主键idprivate 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

在文件3中,第2~3行是MyBatis的约束配置,第5~11行是需要程序员编写的映射信息。其中,元素是配置文件的根元素,它包含一个namespace属性,该属性为这个指定了唯一的命名空间,通常会设置成“包名+SQL映射文件名”的形式。子元素元素在映射文件中的唯一标识;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

在文件4中,第2~3行是MyBatis的配置文件的约束信息,下面元素中的内容就是开发人员需要编写的配置信息。这里按照子元素的功能不同,将配置分为了两个步骤:第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、关闭SqlSessionsqlSession.close();}}

在文件5的findCustomerByIdTest()方法中,首先通过输入流读取了配置文件,然后根据配置文件构建了SqlSessionFactory对象。接下来通过SqlSessionFactory对象又创建了SqlSession对象,并通过SqlSession对象的selectOne()方法执行查询操作。selectOne()方法的第1个参数表示映射SQL的标识字符串,它由CustomerMapper.xml中元素的namespace属性值+元素编写相应的SQL语句,并通过sqlSession的查询方法执行该SQL即可。其具体实现步骤如下:

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

与根据客户编号查询相比,上述配置代码中的属性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、根据配置文件构建SqlSessionFactorySqlSessionFactory sqlSessionFactory = 
new SqlSessionFactoryBuilder().build(inputStream);// 3、通过SqlSessionFactory创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果List customers = sqlSession.selectList("com.itheima.mapper"+".CustomerMapper.findCustomerByName","j");for(Customer customer : customers) {//打印输出结果集System.out.println(customer);}// 5、关闭SqlSessionsqlSession.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。

相关内容

热门资讯

给老婆的结婚周年祝福语 给老婆的结婚周年祝福语  在日常的学习、工作、生活中,大家都尝试过写祝福语吧,祝福语可以起到增进感情...
母亲节给妈妈的贺卡祝福语 母亲节给妈妈的贺卡祝福语  在日常学习、工作抑或是生活中,大家总少不了要接触或使用祝福语吧,祝福语往...
端午节的祝福语 2018端午节的祝福语  在日常学习、工作抑或是生活中,许多人都写过祝福语吧,祝福语是指对人们的美好...
通用春节新年祝福语 2020年通用春节新年祝福语汇编32句  一点喜,两点乐,三点美,四点欢,五点福,六点禄,七点吉,八...
给老公生日祝福语 老公生日祝福语 推荐度:
春节快乐的祝福语短信 春节快乐的祝福语短信汇编61条  短信把年拜,收到笑颜开;新年好运来,保准你发财;健康又实在,做人有...
元旦快乐的祝福语 2021年元旦快乐的祝福语集锦34句  元旦送走了[20XX],元旦迎来了[20XX],在元旦的钟声...
中考祝福语 中考祝福语(精选160句)  无论在学习、工作或是生活中,大家对祝福语都再熟悉不过了吧,祝福语往往灵...
暖心小满祝福语 暖心小满祝福语29句  小满小满,真诚祝愿:每年的收获圆满!每月的口袋填满!每天的心情美满!每时的快...
简短情人节祝福语句 简短情人节祝福语句30句精选  你心我心,爱上了你,终身痴心;君心我心,见不到你,只需悲哀;你心贰心...
国庆祝福语句摘录 精选国庆祝福语句摘录35句  我把所有的祝福都塞在这条短信里,在这普天同庆的日子里,送到你的身边,愿...
对领导离别的简短祝福语 对领导离别的简短祝福语  在日复一日的学习、工作或生活中,大家都有写祝福语的经历,对祝福语很是熟悉吧...
送给父亲的问候祝福语   父亲是家里的顶梁柱,是给你无期限的保护,下面是YJBYS小编为大家收集了关于父亲问候祝福语大全,...
经典暖心生日祝福语 经典暖心生日祝福语(精选260句)  无论是身处学校还是步入社会,大家或多或少都会用到过祝福语吧,祝...
中秋节公司简短祝福语 中秋节公司简短祝福语  在学习、工作乃至生活中,要用到祝福语的情况还是蛮多的,祝福语可以传达对他人的...
中秋节唯美祝福语短信 2020年精选中秋节唯美祝福语短信大汇总42句  当太阳还没下去,当明月还没起来之时,我的祝福已经到...
给老爸的祝福语 给老爸的祝福语  有种爱叫无私,从不计较付出。有种爱叫伟大,从不祈求回报。以下是CN人才网小编为大家...
新春快乐祝贺词 新春快乐祝贺词大全(精选70句)  回忆过去,展望未来,[20新春快乐祝贺词]年并不平凡,努力工作,...
春节新年祝福语短信摘录 2020年春节新年祝福语短信摘录56条  亲情、爱情、朋友情、情情相伴;歌声、笑声、手机声、声声祝福...
60岁大寿祝贺词 60岁大寿祝贺词60岁大寿祝贺词1尊敬的各位长辈,各位来宾,各位朋友:  春秋迭易,岁月轮回,今天,...