更新時(shí)間:2021年03月22日16時(shí)39分 來源:傳智教育 瀏覽次數(shù):
在實(shí)際開發(fā)中,查詢操作通常都會(huì)涉及到單條數(shù)據(jù)的精確查詢,以及多條數(shù)據(jù)的模糊查詢。那么使用MyBatis框架是如何進(jìn)行這兩種查詢的呢?接下來,本小節(jié)將講解下如何使用MyBatis框架根據(jù)客戶編號(hào)查詢客戶信息,以及根據(jù)客戶名模糊查詢客戶信息。
1.根據(jù)客戶編號(hào)查詢客戶信息
根據(jù)客戶編號(hào)查詢客戶信息主要是通過查詢客戶表中的主鍵(這里表示唯一的客戶編號(hào))來實(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è)名稱為mybatis的數(shù)據(jù)庫(kù) CREATE DATABASE mybatis; # 使用mybatis數(shù)據(jù)庫(kù) USE mybatis; # 創(chuàng)建一個(gè)名稱為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所示。
圖1 t_customer表
(2)在Eclipse中,創(chuàng)建一個(gè)名為chapter06的Web項(xiàng)目,將MyBatis的核心JAR包、lib目錄中的依賴JAR包,以及MySQL數(shù)據(jù)庫(kù)的驅(qū)動(dòng)JAR包一同添加到項(xiàng)目的lib目錄下, 并發(fā)布到類路徑中。添加后的lib目錄如圖2所示。
圖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包下所有類的日志記錄級(jí)別設(shè)置為DEBUG。
由于log4j文件中的具體內(nèi)容已經(jīng)超出了本書范圍,所以這里不過多講解,讀者可自行查找資料學(xué)習(xí)。上述配置文件代碼也不需要讀者全部手寫,在MyBatis使用手冊(cè)中的Logging小節(jié),可以找到如圖3所示的配置信息,只需將其復(fù)制到項(xiàng)目的log4j配置文件中,并對(duì)MyBatis的日志配置信息進(jìn)行簡(jiǎn)單修改即可使用。
圖3 MyBatis使用手冊(cè)中的Logging配置
(4)在src目錄下,創(chuàng)建一個(gè)com.itheima.po包,在該包下創(chuàng)建持久化類Customer,并在類中聲明id、username、jobs和phone屬性,及其對(duì)應(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ù)庫(kù)中的表字段相對(duì)應(yīng)。實(shí)際上,Customer就是一個(gè)POJO(普通Java對(duì)象),MyBatis就是采用POJO作為持久化類來完成對(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ào)獲取客戶信息 --> <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>元素是配置文件的根元素,它包含一個(gè)namespace屬性,該屬性為這個(gè)<mapper>指定了唯一的命名空間,通常會(huì)設(shè)置成“包名+SQL映射文件名”的形式。子元素<select>中的信息是用于執(zhí)行查詢操作的配置,其id屬性是<select>元素在映射文件中的唯一標(biāo)識(shí);parameterType屬性用于指定傳入?yún)?shù)的類型,這里表示傳遞給執(zhí)行SQL的是一個(gè)Integer類型的參數(shù);resultType屬性用于指定返回結(jié)果的類型,這里表示返回的數(shù)據(jù)是Customer類型。在定義的查詢SQL語(yǔ)句中,“#{}”用來表示一個(gè)占位符,相當(dāng)于“?”,而“#{id}”表示該占位符待接收參數(shù)的名稱為id。
多學(xué)一招: 快速獲取配置文件的約束信息
在MyBatis的映射文件中,包含了一些約束信息,初學(xué)者如果自己動(dòng)手去編寫,不但浪費(fèi)時(shí)間,還容易出錯(cuò)。其實(shí),在MyBatis使用手冊(cè)中,就可以找到這些約束信息,具體的獲取方法如下:
打開MyBatis的使用手冊(cè)mybatis-3.4.2.pdf,在第2小節(jié)Getting started(入門指南)下的2.1.5小節(jié)Exploring Mapped SQL Statements中,即可找到映射文件的約束信息。如圖4所示。
圖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)容就是開發(fā)人員需要編寫的配置信息。這里按照<configuration>子元素的功能不同,將配置分為了兩個(gè)步驟:第1步配置了環(huán)境,第2步配置了Mapper的位置。關(guān)于上述代碼中各個(gè)元素的詳細(xì)配置信息將在下一章進(jìn)行詳細(xì)講解,此案例中讀者只需要按照上述代碼配置即可。
小提示:
上述配置文件同樣不需要讀者完全手動(dòng)編寫。在MyBatis使用手冊(cè)mybatis-3.4.2.pdf的2.1.2小節(jié)中,已經(jīng)給出了配置模板(包含約束信息),讀者只需要復(fù)制過來,依照自己的項(xiàng)目需求修改即可。
(7)在src目錄下,創(chuàng)建一個(gè)com.itheima.test包,在該包下創(chuàng)建測(cè)試類MybatisTest,并在類中編寫測(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; /** * 入門程序測(cè)試類 */ public class MybatisTest { /** * 根據(jù)客戶編號(hào)查詢客戶信息 */ @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對(duì)象。接下來通過SqlSessionFactory對(duì)象又創(chuàng)建了SqlSession對(duì)象,并通過SqlSession對(duì)象的selectOne()方法執(zhí)行查詢操作。selectOne()方法的第1個(gè)參數(shù)表示映射SQL的標(biāo)識(shí)字符串,它由CustomerMapper.xml中<mapper>元素的namespace屬性值+<select>元素的id屬性值組成;第2個(gè)參數(shù)表示查詢所需的參數(shù),這里查詢的是客戶表中id為1的客戶。為了查看查詢結(jié)果,這里使用了輸出語(yǔ)句輸出查詢結(jié)果信息。最后,程序執(zhí)行完畢時(shí),關(guān)閉了SqlSession。
使用JUnit4測(cè)試執(zhí)行findCustomerByIdTest()方法后,控制臺(tái)的輸出結(jié)果如圖5所示。
圖5 運(yùn)行結(jié)果
從圖5可以看出,使用MyBatis框架已經(jīng)成功查詢出了id為1的客戶信息。
2.根據(jù)客戶名模糊查詢客戶信息
了解了如何使用MyBatis根據(jù)客戶編號(hào)查詢客戶信息后,接下來講解下如何根據(jù)客戶的名稱來模糊查詢相關(guān)的客戶信息。
模糊查詢的實(shí)現(xiàn)非常簡(jiǎn)單,只需在映射文件中通過<select>元素編寫相應(yīng)的SQL語(yǔ)句,并通過sqlSession的查詢方法執(zhí)行該SQL即可。其具體實(shí)現(xiàn)步驟如下:
(1)在映射文件CustomerMapper.xml中,添加根據(jù)客戶名模糊查詢客戶信息列表的SQL語(yǔ)句,具體實(shí)現(xiàn)代碼如下。
<!--根據(jù)客戶名模糊查詢客戶信息列表--> <select id="findCustomerByName" parameterType="String" resultType="com.itheima.po.Customer"> select * from t_customer where username like '%${value}%' </select>
與根據(jù)客戶編號(hào)查詢相比,上述配置代碼中的屬性id、parameterType和SQL語(yǔ)句都發(fā)生相應(yīng)變化。其中,SQL語(yǔ)句中的“${}”用來表示拼接SQL的字符串,即不加解釋的原樣輸出。“${value}”表示要拼接的是簡(jiǎn)單類型參數(shù)。
腳下留心:防止SQL注入
在使用“${}”進(jìn)行SQL字符串拼接時(shí),無法防止SQL注入問題。所以想要既能實(shí)現(xiàn)模糊查詢,又要防止SQL注入,可以對(duì)上述映射文件CustomerMapper.xml中模糊查詢的select語(yǔ)句進(jìn)行修改,使用MySQL中的concat()函數(shù)進(jìn)行字符串拼接。具體修改示例如下所示。
select * from t_customer where username like concat('%',#{value},'%')
(2)在測(cè)試類MybatisTest中,添加一個(gè)測(cè)試方法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步時(shí)與根據(jù)客戶編號(hào)查詢的測(cè)試方法有所不同,其他步驟都一致。在第4步時(shí),由于可能查詢出的是多條數(shù)據(jù),所以調(diào)用的是SqlSession的selectList()方法來查詢返回結(jié)果的集合對(duì)象,并使用for循環(huán)輸出結(jié)果集對(duì)象。
使用JUnit4執(zhí)行findCustomerByNameTest()方法后,控制臺(tái)的輸出結(jié)果如圖6所示。
圖6 運(yùn)行結(jié)果
從圖6可以看出,使用MyBatis框架已成功查詢出了客戶表中客戶名稱中帶有“j”的2條客戶信息。
至此,MyBatis入門程序的查詢功能就已經(jīng)講解完成。從上面兩個(gè)查詢方法中可以發(fā)現(xiàn),MyBatis的操作大致可分為以下幾個(gè)步驟:
1) 讀取配置文件。
2) 根據(jù)配置文件構(gòu)建SqlSessionFactory。
3) 通過SqlSessionFactory創(chuàng)建SqlSession。
4) 使用SqlSession對(duì)象操作數(shù)據(jù)庫(kù)(包括查詢、添加、修改、刪除,以及提交事務(wù)等)。
5) 關(guān)閉SqlSession。
猜你喜歡:
Mybatis原理介紹:MyBatis如何操作數(shù)據(jù)庫(kù)?
北京校區(qū)