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

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

更新時間:2021-03-22 來源:黑馬程序員 瀏覽量:

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

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

1.根據(jù)客戶編號查詢客戶信息

根據(jù)客戶編號查詢客戶信息主要是通過查詢客戶表中的主鍵(這里表示唯一的客戶編號)來實現(xiàn)的,其具體實現(xiàn)步驟如下:

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

# 創(chuàng)建一個名稱為mybatis的數(shù)據(jù)庫
CREATE DATABASE mybatis;
# 使用mybatis數(shù)據(jù)庫
USE mybatis;
# 創(chuà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ù)庫t_customer表中的數(shù)據(jù)如圖1所示。

1616402840156_11.jpg

圖1 t_customer表

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

1616402847759_12.png

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

(3)由于MyBatis默認使用log4j輸出日志信息,所以如果要查看控制臺的輸出SQL語句,那么就需要在classpath路徑下配置其日志文件。在項目的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的日志配置和控制臺輸出,其中MyBatis的日志配置用于將com.itheima包下所有類的日志記錄級別設(shè)置為DEBUG。

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

1616402856810_13.png

圖3 MyBatis使用手冊中的Logging配置

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

文件2 Customer.java

     package com.itheima.po;
     /**
      * 客戶持久化類
      */
     public class Customer {
         private Integer id;       // 主鍵id
         private String username; // 客戶名稱
         private String jobs;      // 職業(yè)
         private String phone;     // 電話
         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 + "]";
         }
     }

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

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

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

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

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

1616402869264_14.png

圖4 映射文件的約束信息

在圖4中,方框處標(biāo)注的文件信息就是MyBatis映射文件的約束信息。初學(xué)者只需將信息復(fù)制到項目創(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)境 ,默認的環(huán)境id為mysql-->
         <environments default="mysql">
             <!--1.2.配置id為mysql的數(shù)據(jù)庫環(huán)境 -->
             <environment id="mysql">
                 <!-- 使用JDBC的事務(wù)管理 -->
                 <transactionManager type="JDBC" />
                 <!--數(shù)據(jù)庫連接池 -->
                 <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)容就是開發(fā)人員需要編寫的配置信息。這里按照<configuration>子元素的功能不同,將配置分為了兩個步驟:第1步配置了環(huán)境,第2步配置了Mapper的位置。關(guān)于上述代碼中各個元素的詳細配置信息將在下一章進行詳細講解,此案例中讀者只需要按照上述代碼配置即可。

小提示:

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

(7)在src目錄下,創(chuàng)建一個com.itheima.test包,在該包下創(chuàng)建測試類MybatisTest,并在類中編寫測試方法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;
     /**
      * 入門程序測試類
      */
     public class MybatisTest {
         /**
          * 根據(jù)客戶編號查詢客戶信息
          */
         @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、通過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()方法中,首先通過輸入流讀取了配置文件,然后根據(jù)配置文件構(gòu)建了SqlSessionFactory對象。接下來通過SqlSessionFactory對象又創(chuàng)建了SqlSession對象,并通過SqlSession對象的selectOne()方法執(zhí)行查詢操作。selectOne()方法的第1個參數(shù)表示映射SQL的標(biāo)識字符串,它由CustomerMapper.xml中<mapper>元素的namespace屬性值+<select>元素的id屬性值組成;第2個參數(shù)表示查詢所需的參數(shù),這里查詢的是客戶表中id為1的客戶。為了查看查詢結(jié)果,這里使用了輸出語句輸出查詢結(jié)果信息。最后,程序執(zhí)行完畢時,關(guān)閉了SqlSession。

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

1616402879593_15.png

圖5 運行結(jié)果

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

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

了解了如何使用MyBatis根據(jù)客戶編號查詢客戶信息后,接下來講解下如何根據(jù)客戶的名稱來模糊查詢相關(guān)的客戶信息。

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

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

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

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

腳下留心:防止SQL注入

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

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

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

/**
 * 根據(jù)用戶名稱來模糊查詢用戶信息列表
 */
@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、通過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步時與根據(jù)客戶編號查詢的測試方法有所不同,其他步驟都一致。在第4步時,由于可能查詢出的是多條數(shù)據(jù),所以調(diào)用的是SqlSession的selectList()方法來查詢返回結(jié)果的集合對象,并使用for循環(huán)輸出結(jié)果集對象。

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

1616402887706_16.jpg

圖6 運行結(jié)果

從圖6可以看出,使用MyBatis框架已成功查詢出了客戶表中客戶名稱中帶有“j”的2條客戶信息。

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

1) 讀取配置文件。

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

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

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

5) 關(guān)閉SqlSession。



猜你喜歡:

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

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

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

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

分享到:
在線咨詢 我要報名
和我們在線交談!