全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

MyBatis框架如何實(shí)現(xiàn)數(shù)據(jù)查詢(xún)?有幾種方法?

更新時(shí)間:2021-03-22 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

在實(shí)際開(kāi)發(fā)中,查詢(xún)操作通常都會(huì)涉及到單條數(shù)據(jù)的精確查詢(xún),以及多條數(shù)據(jù)的模糊查詢(xún)。那么使用MyBatis框架是如何進(jìn)行這兩種查詢(xún)的呢?接下來(lái),本小節(jié)將講解下如何使用MyBatis框架根據(jù)客戶(hù)編號(hào)查詢(xún)客戶(hù)信息,以及根據(jù)客戶(hù)名模糊查詢(xún)客戶(hù)信息。

1.根據(jù)客戶(hù)編號(hào)查詢(xún)客戶(hù)信息

根據(jù)客戶(hù)編號(hào)查詢(xún)客戶(hù)信息主要是通過(guò)查詢(xún)客戶(hù)表中的主鍵(這里表示唯一的客戶(hù)編號(hào))來(lái)實(shí)現(xiàn)的,其具體實(shí)現(xiàn)步驟如下:

(1)在MySQL數(shù)據(jù)庫(kù)中,創(chuàng)建一個(gè)名為mybatis的數(shù)據(jù)庫(kù),在此數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)t_customer表,同時(shí)預(yù)先插入幾條數(shù)據(jù)。此操作所執(zhí)行的SQL語(yǔ)句如下所示。

# 創(chuàng)建一個(gè)名稱(chēng)為mybatis的數(shù)據(jù)庫(kù)
CREATE DATABASE mybatis;
# 使用mybatis數(shù)據(jù)庫(kù)
USE mybatis;
# 創(chuàng)建一個(gè)名稱(chēng)為t_customer的表
CREATE TABLE t_customer (
    id int(32) PRIMARY KEY AUTO_INCREMENT,
    username varchar(50),
    jobs varchar(50),
    phone varchar(16)
);
# 插入3條數(shù)據(jù)
INSERT INTO t_customer VALUES ('1', 'joy', 'doctor', '13745874578');
INSERT INTO t_customer VALUES ('2', 'jack', 'teacher', '13521210112');
INSERT INTO t_customer VALUES ('3', 'tom', 'worker', '15179405961');

完成上述操作后,數(shù)據(jù)庫(kù)t_customer表中的數(shù)據(jù)如圖1所示。

1616402840156_11.jpg

圖1 t_customer表

(2)在Eclipse中,創(chuàng)建一個(gè)名為chapter06的Web項(xiàng)目,將MyBatis的核心JAR包、lib目錄中的依賴(lài)JAR包,以及MySQL數(shù)據(jù)庫(kù)的驅(qū)動(dòng)JAR包一同添加到項(xiàng)目的lib目錄下, 并發(fā)布到類(lèi)路徑中。添加后的lib目錄如圖2所示。

1616402847759_12.png

圖2 MyBatis相關(guān)JAR包

(3)由于MyBatis默認(rèn)使用log4j輸出日志信息,所以如果要查看控制臺(tái)的輸出SQL語(yǔ)句,那么就需要在classpath路徑下配置其日志文件。在項(xiàng)目的src目錄下創(chuàng)建log4j.properties文件,編輯后的內(nèi)容如文件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的日志配置和控制臺(tái)輸出,其中MyBatis的日志配置用于將com.itheima包下所有類(lèi)的日志記錄級(jí)別設(shè)置為DEBUG。

由于log4j文件中的具體內(nèi)容已經(jīng)超出了本書(shū)范圍,所以這里不過(guò)多講解,讀者可自行查找資料學(xué)習(xí)。上述配置文件代碼也不需要讀者全部手寫(xiě),在MyBatis使用手冊(cè)中的Logging小節(jié),可以找到如圖3所示的配置信息,只需將其復(fù)制到項(xiàng)目的log4j配置文件中,并對(duì)MyBatis的日志配置信息進(jìn)行簡(jiǎn)單修改即可使用。

1616402856810_13.png

圖3 MyBatis使用手冊(cè)中的Logging配置

(4)在src目錄下,創(chuàng)建一個(gè)com.itheima.po包,在該包下創(chuàng)建持久化類(lèi)Customer,并在類(lèi)中聲明id、username、jobs和phone屬性,及其對(duì)應(yīng)的getter/setter方法,如文件2所示。

文件2 Customer.java

     package com.itheima.po;
     /**
      * 客戶(hù)持久化類(lèi)
      */
     public class Customer {
         private Integer id;       // 主鍵id
         private String username; // 客戶(hù)名稱(chēng)
         private String jobs;      // 職業(yè)
         private String phone;     // 電話(huà)
         public Integer 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;
         }
         @Override
         public String toString() {
             return "Customer [id=" + id + ", username=" + username + 
                            ", jobs=" + jobs + ", phone=" + phone + "]";
         }
     }

從上述代碼可以看出,持久化類(lèi)Customer與普通的JavaBean并沒(méi)有什么區(qū)別,只是其屬性字段與數(shù)據(jù)庫(kù)中的表字段相對(duì)應(yīng)。實(shí)際上,Customer就是一個(gè)POJO(普通Java對(duì)象),MyBatis就是采用POJO作為持久化類(lèi)來(lái)完成對(duì)數(shù)據(jù)庫(kù)操作的。

(5)在src目錄下,創(chuàng)建一個(gè)com.itheima.mapper包,并在包中創(chuàng)建映射文件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">
         <!--根據(jù)客戶(hù)編號(hào)獲取客戶(hù)信息 -->
         <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行是需要程序員編寫(xiě)的映射信息。其中,<mapper>元素是配置文件的根元素,它包含一個(gè)namespace屬性,該屬性為這個(gè)<mapper>指定了唯一的命名空間,通常會(huì)設(shè)置成“包名+SQL映射文件名”的形式。子元素<select>中的信息是用于執(zhí)行查詢(xún)操作的配置,其id屬性是<select>元素在映射文件中的唯一標(biāo)識(shí);parameterType屬性用于指定傳入?yún)?shù)的類(lèi)型,這里表示傳遞給執(zhí)行SQL的是一個(gè)Integer類(lèi)型的參數(shù);resultType屬性用于指定返回結(jié)果的類(lèi)型,這里表示返回的數(shù)據(jù)是Customer類(lèi)型。在定義的查詢(xún)SQL語(yǔ)句中,“#{}”用來(lái)表示一個(gè)占位符,相當(dāng)于“?”,而“#{id}”表示該占位符待接收參數(shù)的名稱(chēng)為id。

多學(xué)一招: 快速獲取配置文件的約束信息

在MyBatis的映射文件中,包含了一些約束信息,初學(xué)者如果自己動(dòng)手去編寫(xiě),不但浪費(fèi)時(shí)間,還容易出錯(cuò)。其實(shí),在MyBatis使用手冊(cè)中,就可以找到這些約束信息,具體的獲取方法如下:

打開(kāi)MyBatis的使用手冊(cè)mybatis-3.4.2.pdf,在第2小節(jié)Getting started(入門(mén)指南)下的2.1.5小節(jié)Exploring Mapped SQL Statements中,即可找到映射文件的約束信息。如圖4所示。

1616402869264_14.png

圖4 映射文件的約束信息

在圖4中,方框處標(biāo)注的文件信息就是MyBatis映射文件的約束信息。初學(xué)者只需將信息復(fù)制到項(xiàng)目創(chuàng)建的XML文件中即可。

(6)在src目錄下,創(chuàng)建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.配置環(huán)境 ,默認(rèn)的環(huán)境id為mysql-->
         <environments default="mysql">
             <!--1.2.配置id為mysql的數(shù)據(jù)庫(kù)環(huán)境 -->
             <environment id="mysql">
                 <!-- 使用JDBC的事務(wù)管理 -->
                 <transactionManager type="JDBC" />
                 <!--數(shù)據(jù)庫(kù)連接池 -->
                 <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>元素中的內(nèi)容就是開(kāi)發(fā)人員需要編寫(xiě)的配置信息。這里按照<configuration>子元素的功能不同,將配置分為了兩個(gè)步驟:第1步配置了環(huán)境,第2步配置了Mapper的位置。關(guān)于上述代碼中各個(gè)元素的詳細(xì)配置信息將在下一章進(jìn)行詳細(xì)講解,此案例中讀者只需要按照上述代碼配置即可。

小提示:

上述配置文件同樣不需要讀者完全手動(dòng)編寫(xiě)。在MyBatis使用手冊(cè)mybatis-3.4.2.pdf的2.1.2小節(jié)中,已經(jīng)給出了配置模板(包含約束信息),讀者只需要復(fù)制過(guò)來(lái),依照自己的項(xiàng)目需求修改即可。

(7)在src目錄下,創(chuàng)建一個(gè)com.itheima.test包,在該包下創(chuàng)建測(cè)試類(lèi)MybatisTest,并在類(lèi)中編寫(xiě)測(cè)試方法findCustomerByIdTest(),如文件5所示。

文件5 MybatisTest.java

     package com.itheima.test;
     import java.io.InputStream;
     import org.apache.ibatis.io.Resources;
     import org.apache.ibatis.session.SqlSession;
     import org.apache.ibatis.session.SqlSessionFactory;
     import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     import org.junit.Test;
     import com.itheima.po.Customer;
     /**
      * 入門(mén)程序測(cè)試類(lèi)
      */
     public class MybatisTest {
         /**
          * 根據(jù)客戶(hù)編號(hào)查詢(xún)客戶(hù)信息
          */
         @Test
         public void findCustomerByIdTest() throws Exception {
             // 1、讀取配置文件
             String resource = "mybatis-config.xml";
             InputStream inputStream = 
                          Resources.getResourceAsStream(resource);
             // 2、根據(jù)配置文件構(gòu)建SqlSessionFactory
             SqlSessionFactory sqlSessionFactory = 
                          new SqlSessionFactoryBuilder().build(inputStream);
             // 3、通過(guò)SqlSessionFactory創(chuàng)建SqlSession
             SqlSession sqlSession = sqlSessionFactory.openSession();
             // 4、SqlSession執(zhí)行映射文件中定義的SQL,并返回映射結(jié)果
             Customer customer = sqlSession.selectOne("com.itheima.mapper"
                       + ".CustomerMapper.findCustomerById", 1);
             // 打印輸出結(jié)果
             System.out.println(customer.toString());
             // 5、關(guān)閉SqlSession
             sqlSession.close();
         }
     }

在文件5的findCustomerByIdTest()方法中,首先通過(guò)輸入流讀取了配置文件,然后根據(jù)配置文件構(gòu)建了SqlSessionFactory對(duì)象。接下來(lái)通過(guò)SqlSessionFactory對(duì)象又創(chuàng)建了SqlSession對(duì)象,并通過(guò)SqlSession對(duì)象的selectOne()方法執(zhí)行查詢(xún)操作。selectOne()方法的第1個(gè)參數(shù)表示映射SQL的標(biāo)識(shí)字符串,它由CustomerMapper.xml中<mapper>元素的namespace屬性值+<select>元素的id屬性值組成;第2個(gè)參數(shù)表示查詢(xún)所需的參數(shù),這里查詢(xún)的是客戶(hù)表中id為1的客戶(hù)。為了查看查詢(xún)結(jié)果,這里使用了輸出語(yǔ)句輸出查詢(xún)結(jié)果信息。最后,程序執(zhí)行完畢時(shí),關(guān)閉了SqlSession。

使用JUnit4測(cè)試執(zhí)行findCustomerByIdTest()方法后,控制臺(tái)的輸出結(jié)果如圖5所示。

1616402879593_15.png

圖5 運(yùn)行結(jié)果

從圖5可以看出,使用MyBatis框架已經(jīng)成功查詢(xún)出了id為1的客戶(hù)信息。

2.根據(jù)客戶(hù)名模糊查詢(xún)客戶(hù)信息

了解了如何使用MyBatis根據(jù)客戶(hù)編號(hào)查詢(xún)客戶(hù)信息后,接下來(lái)講解下如何根據(jù)客戶(hù)的名稱(chēng)來(lái)模糊查詢(xún)相關(guān)的客戶(hù)信息。

模糊查詢(xún)的實(shí)現(xiàn)非常簡(jiǎn)單,只需在映射文件中通過(guò)<select>元素編寫(xiě)相應(yīng)的SQL語(yǔ)句,并通過(guò)sqlSession的查詢(xún)方法執(zhí)行該SQL即可。其具體實(shí)現(xiàn)步驟如下:

(1)在映射文件CustomerMapper.xml中,添加根據(jù)客戶(hù)名模糊查詢(xún)客戶(hù)信息列表的SQL語(yǔ)句,具體實(shí)現(xiàn)代碼如下。

<!--根據(jù)客戶(hù)名模糊查詢(xún)客戶(hù)信息列表-->
<select id="findCustomerByName" parameterType="String"
    resultType="com.itheima.po.Customer">
    select * from t_customer where username like '%${value}%'
</select>

與根據(jù)客戶(hù)編號(hào)查詢(xún)相比,上述配置代碼中的屬性id、parameterType和SQL語(yǔ)句都發(fā)生相應(yīng)變化。其中,SQL語(yǔ)句中的“${}”用來(lái)表示拼接SQL的字符串,即不加解釋的原樣輸出?!?{value}”表示要拼接的是簡(jiǎn)單類(lèi)型參數(shù)。

腳下留心:防止SQL注入

在使用“${}”進(jìn)行SQL字符串拼接時(shí),無(wú)法防止SQL注入問(wèn)題。所以想要既能實(shí)現(xiàn)模糊查詢(xún),又要防止SQL注入,可以對(duì)上述映射文件CustomerMapper.xml中模糊查詢(xún)的select語(yǔ)句進(jìn)行修改,使用MySQL中的concat()函數(shù)進(jìn)行字符串拼接。具體修改示例如下所示。

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

(2)在測(cè)試類(lèi)MybatisTest中,添加一個(gè)測(cè)試方法findCustomerByNameTest(),其代碼如下所示。

/**
 * 根據(jù)用戶(hù)名稱(chēng)來(lái)模糊查詢(xún)用戶(hù)信息列表
 */
@Test
public void findCustomerByNameTest() throws Exception{    
    // 1、讀取配置文件
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    // 2、根據(jù)配置文件構(gòu)建SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = 
new SqlSessionFactoryBuilder().build(inputStream);
    // 3、通過(guò)SqlSessionFactory創(chuàng)建SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 4、SqlSession執(zhí)行映射文件中定義的SQL,并返回映射結(jié)果
    List<Customer> customers = sqlSession.selectList("com.itheima.mapper"
                + ".CustomerMapper.findCustomerByName", "j");
    for (Customer customer : customers) {
        //打印輸出結(jié)果集
        System.out.println(customer);
    }
    // 5、關(guān)閉SqlSession
    sqlSession.close();
}

從上述代碼可以看出,findCustomerByNameTest()方法只是在第4步時(shí)與根據(jù)客戶(hù)編號(hào)查詢(xún)的測(cè)試方法有所不同,其他步驟都一致。在第4步時(shí),由于可能查詢(xún)出的是多條數(shù)據(jù),所以調(diào)用的是SqlSession的selectList()方法來(lái)查詢(xún)返回結(jié)果的集合對(duì)象,并使用for循環(huán)輸出結(jié)果集對(duì)象。

使用JUnit4執(zhí)行findCustomerByNameTest()方法后,控制臺(tái)的輸出結(jié)果如圖6所示。

1616402887706_16.jpg

圖6 運(yùn)行結(jié)果

從圖6可以看出,使用MyBatis框架已成功查詢(xún)出了客戶(hù)表中客戶(hù)名稱(chēng)中帶有“j”的2條客戶(hù)信息。

至此,MyBatis入門(mén)程序的查詢(xún)功能就已經(jīng)講解完成。從上面兩個(gè)查詢(xún)方法中可以發(fā)現(xiàn),MyBatis的操作大致可分為以下幾個(gè)步驟:

1) 讀取配置文件。

2) 根據(jù)配置文件構(gòu)建SqlSessionFactory。

3) 通過(guò)SqlSessionFactory創(chuàng)建SqlSession。

4) 使用SqlSession對(duì)象操作數(shù)據(jù)庫(kù)(包括查詢(xún)、添加、修改、刪除,以及提交事務(wù)等)。

5) 關(guān)閉SqlSession。



猜你喜歡:

MyBatis框架操作數(shù)據(jù)庫(kù)有哪些步驟?

什么是MyBatis?【java培訓(xùn)】

Java視頻教程:Mybatis由淺入深教程

黑馬程序員java培訓(xùn)課程

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!