咱們經過寫一個簡單的MyBatis小項目來在實戰中學習MyBatis
1.需求
根據用戶id(主鍵)查詢用戶信息
根據用戶名稱模糊查詢用戶信息
添加用戶
刪除 用戶
更新用戶
mybatis運行環境(jar包):
從https://github.com/mybatis/mybatis-3/releases下載,3.2.7版本
lib下:依賴包
mybatis-3.2.7.jar:核心 包
mybatis-3.2.7.pdf,操做指南
加入mysql的驅動包
加入的全部jar包如圖(能夠在這裏下載:http://download.csdn.net/detail/u013517797/8781295)
2.建立log4j.properties
在src中放入日誌配置文件
文件內容(拷貝自官方幫助文檔)
java
# Global logging configuration #在開發環境下日誌級別要設成DEBUG,生產環境設爲INFO或ERROR log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # 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
接下來建立SqlMapConfig.xml等文件
配置好以後的整個工程結構爲圖
3.SqlMapConfig.xml
SqlMapConfig.xml內容以下
(因爲沒有整合Spring,暫時在environments中配數據庫鏈接池dataSource,整合Spring以後將這一塊刪除就好了)
mysql
<?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> <!-- 和spring整合後 environments配置將廢除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理--> <transactionManager type="JDBC" /> <!-- 數據庫鏈接池--> <dataSource type="POOLED"> <property name="driver" value="org.gjt.mm.mysql.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments> </configuration>
4.建立PO(persistant object持久對象)類
在數據庫中建立mtbatis數據庫,建立user表,表詳細內容爲
id<int>、username<vachar>、birthday<Date>、sex<int>、address<vachar>
在cn.edu.hpu.mybatis.PO包下建立PO對象User.java:
git
package cn.edu.hpu.mybatis.PO; import java.util.Date; public class User { private int id; private String username;// 用戶姓名 private String sex;// 性別 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
5.編寫User.xml配置文件
咱們來寫User.xml(裏面詳細註釋,就很少說了):
github
<?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命名空間,做用就是對sql進行分類化管理,理解sql隔離
注意:使用mapper代理方法開發,namespace有特殊重要的做用 -->
spring
<mapper namespace="test"> <!-- 在映射文件中配置不少sql語句 --> <!-- 需求:經過id查詢用戶表的記錄 --> <!-- 經過select執行數據庫查詢, id:標示映射文件中的sql,成爲Statement的id 將sql語句封裝到mappedStatement對象中,因此將id稱爲statement的id, parameterType:指定輸入參數的類型, #{}標示一個佔位符, #{id}其中id表示接收輸入參數的名稱,若是輸入參數是簡單類型,那麼#{}中的值能夠任意。 resultType:指定sql輸出結果的映射的java對象類型, select指定resultType表示將單條記錄映射成java對象--> <select id="findUserById" parameterType="int" resultType="cn.edu.hpu.mybatis.PO.User"> SELECT * FROM USER WHERE id=#{id} </select> </mapper>
6.在SqlMapConfig.xml中加載映射文件(User.xml)
sql
<!-- 加載映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers>
7.編寫程序
(1)同歸id查詢用戶
在cn.edu.hpu.mybatis.first包下編寫測試樣例MyBatisfirst.java
這裏咱們查詢id爲1的用戶
數據庫
package cn.edu.hpu.mybatis.first; import java.io.IOException; 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 cn.edu.hpu.mybatis.PO.User; public class MyBatisfirst { private SqlSession sqlSession=null; //根據id查詢用戶信息,獲得一條記錄結果 @Test public void findUserById(){ //mybatis配置文件 String resource="SqlMapConfig.xml"; //將配置文件加載成流 InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); //建立會話工廠,傳入mybatis配置文件的信息 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //經過工廠獲得sqlSession sqlSession=sqlSessionFactory.openSession(); //經過SqlSession操做數據庫 //第一個參數:映射文件中的statement的Id,等於=namespace+"."+statement的Id //第二個參數:指定和映射文件所匹配的parameterType類型的參數 //sqlSession.selectOne最終結果與你映射文件中所匹配的resultType類型 User user=sqlSession.selectOne("test.findUserById",1);//數據庫id=1的字段username爲"張三" System.out.println(user.getUsername()); } catch (IOException e) { e.printStackTrace(); }finally{ //釋放資源 sqlSession.close(); } } }
測試結果:張三
查看控制檯Console輸出的日誌記錄:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 29683960.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1c4f0f8]
DEBUG [main] - ==> Preparing: SELECT * FROM USER WHERE id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
張三
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1c4f0f8]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1c4f0f8]
DEBUG [main] - Returned connection 29683960 to pool.
很清晰的看到整個執行過程
(2)經過用戶名模糊查詢用戶id
使用User.xml,添加根據用戶名稱模糊查詢用戶信息的sql語句。
apache
<!-- ${}:表示拼接sql串,將接收到的參數內容不加任何修飾拼接在sql中。 使用${}拼接sql,引發sql注入。 ${}中只能使用value--> <select id="findUserByUsername" parameterType="java.lang.String" resultType="cn.edu.hpu.mybatis.PO.User"> select * from user where username like '%${value}%' </select>
測試方法:
//根據用戶姓名模糊查詢用戶id,獲得一個記錄集合
session
@Test public void findUserByName(){ //mybatis配置文件 String resource="SqlMapConfig.xml"; //將配置文件加載成流 InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); //建立會話工廠,傳入mybatis配置文件的信息 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //經過工廠獲得sqlSession sqlSession=sqlSessionFactory.openSession(); //經過SqlSession操做數據庫 //第一個參數:映射文件中的statement的Id,等於=namespace+"."+statement的Id //第二個參數:指定和映射文件所匹配的parameterType類型的參數 //sqlSession.selectOne最終結果與你映射文件中所匹配的resultType類型 List<User> users=sqlSession.selectList("test.findUserByUsername","張三"); //數據庫一共有兩個相關數據,"張三"和"張三丰" for (int i = 0; i < users.size(); i++) { User u=users.get(i); System.out.println(u.getId()+":"+u.getUsername()); } } catch (IOException e) { e.printStackTrace(); }finally{ //釋放資源 sqlSession.close(); } }
測試結果:
1:張三
4:張三丰
輸出的日誌信息:
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 29945809.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1c8efd1]
DEBUG [main] - ==> Preparing: select * from user where username like '%張三%'
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 2
1:張三
4:張三丰
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@1c8efd1]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@1c8efd1]
DEBUG [main] - Returned connection 29945809 to pool.
小結:
a.parameterType
在映射文件中經過parameterType指定輸入參數的類型
b.resultType
在映射文件中經過resultType指定輸出結果的類型
c.#{}和${}
#{}表示一個佔位符號
${}表示一個拼接符號,會引發sql注入,因此不建議使用
d.selectOne和selectList
selectOne表示查詢一條記錄進行映射,使用selectList也可使用,只不過只有一個對象
selectList表示查詢出一個列表(參數記錄)進行映射,不嗯可以使用selectOne查,否則會報下面的錯:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
mybatis