2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁技術文章正文

MyBatis框架如何實現數據查詢?有幾種方法?

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

1577370495235_學IT就到黑馬程序員.gif

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

1.根據客戶編號查詢客戶信息

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

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

# 創建一個名稱為mybatis的數據庫
CREATE DATABASE mybatis;
# 使用mybatis數據庫
USE mybatis;
# 創建一個名稱為t_customer的表
CREATE TABLE t_customer (
    id int(32) PRIMARY KEY AUTO_INCREMENT,
    username varchar(50),
    jobs varchar(50),
    phone varchar(16)
);
# 插入3條數據
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');

完成上述操作后,數據庫t_customer表中的數據如圖1所示。

1616402840156_11.jpg

圖1 t_customer表

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

1616402847759_12.png

圖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的日志配置信息進行簡單修改即可使用。

1616402856810_13.png

圖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;     // 電話
         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并沒有什么區別,只是其屬性字段與數據庫中的表字段相對應。實際上,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所示。

1616402869264_14.png

圖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

     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 {
         /**
          * 根據客戶編號查詢客戶信息
          */
         @Test
         public void findCustomerByIdTest() 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,并返回映射結果
             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所示。

1616402879593_15.png

圖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(),其代碼如下所示。

/**
 * 根據用戶名稱來模糊查詢用戶信息列表
 */
@Test
public 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所示。

1616402887706_16.jpg

圖6 運行結果

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

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

1) 讀取配置文件。

2) 根據配置文件構建SqlSessionFactory。

3) 通過SqlSessionFactory創建SqlSession。

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

5) 關閉SqlSession。



猜你喜歡:

MyBatis框架操作數據庫有哪些步驟?

什么是MyBatis?【java培訓】

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

黑馬程序員java培訓課程

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