Mybatis 是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。在Java或者Java Web項目中,添加Mybatis必須的核心包,就能對數據表進行增刪改查操做了。下面以MySQL數據庫oa中的數據表userinfo爲例,使用Mybatis實現數據的增刪改查。java
爲了方便,我是用IDEA+Maven來解決項目的包管理工做,IDEA配置Maven的方法,參考連接,本Demo使用的開發版本以下:mysql
File->new->project,選擇左側的maven,設置項目的project SDk:jdk 1.8,勾選Create from archetype,在列表中勾選maven-archetype-quickstartgit
而後,填寫項目名mybatisDemo,項目位置,配置Maven(此處的User settings file 和 local repository均勾選Override),finish建立項目,初始化目錄結構以下圖a,完整運行的項目目錄結構以下圖b:github
編寫配置文件pom.xml
,添加依賴項以下,而後IDE出現提示信息,選擇 reimport changes便可,隨後Maven開始下載須要的包到本項目中。
本項目使用的jdbc驅動版本爲5.1.18,使用較新的版本,須要注意後面mysql.properties配置文件的編寫,二者有區別。web
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.18</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies>
編寫實體類 UserInfo.java
,同時在MySQL數據庫中建立對應的數據表userinfo,如上圖csql
package org.example; import java.io.Serializable; public class UserInfo implements Serializable { private int id; private String username; private String password; public UserInfo(){} public UserInfo(int id, String username, String password) { this.id = id; this.username = username; this.password = password; } 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 getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "UserInfo{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
在src/main目錄下建立java的同級文件夾resource,並右鍵 Mark Directory as -> Sources Root,在resource下新建mapper包,新建SQL映射的UserInfo.xml文件數據庫
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace設置格式:包名+SQL映射文件名--> <mapper namespace="com.mybatis.mapper.UserInfoMapper"> <!--根據用戶ID查詢用戶信息--> <select id="findUserInfoById" parameterType="int" resultType="UserInfo"> select * from userinfo where id = #{id} </select> <!--根據用戶名模糊查詢用戶--> <select id="findUserInfoByUserName" parameterType="String" resultType="UserInfo"> select * from userinfo where username like CONCAT(CONCAT('%',#{username}),'%') </select> <!--添加用戶--> <insert id="addUserInfo" parameterType="UserInfo"> insert into userinfo(id,username,password) values(#{id},#{username},#{password}) </insert> <!--修改用戶信息--> <update id="updateUserInfo" parameterType="UserInfo"> update userinfo set password = #{password} where id = #{id} </update> <!--刪除用戶信息--> <delete id="deleteUserInfo" parameterType="int"> delete from userinfo where id = #{id} </delete> </mapper>
在resource文件夾下,新建兩個屬性文件:mysql.properties
、log4j.properties
,用於配置MySQL和log4japache
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/oa username=root password=8636hyh
### 設置Logger輸出級別和輸出目的地 ### log4j.rootLogger=debug,stdout,logfile ### 把日誌信息輸出到控制檯 ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout ### 把日誌信息輸出到文件:jbit.log ### log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=jbit.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n ### 顯示SQL語句部分 log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
最後,添加mybatis的核心配置文件mybatis-config.xml
session
<?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> <!--加載文件屬性--> <properties resource="mysql.properties"></properties> <!--給包中的類註冊別名--> <typeAliases> <typeAlias type="org.example.UserInfo" alias="UserInfo"/> </typeAliases> <!--配置環境--> <environments default="development"> <!--配置一個id爲development的環境--> <environment id="development"> <!--使用JDBC事務--> <transactionManager type="JDBC"></transactionManager> <!--數據庫鏈接池--> <!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI --> <!-- POOLED 表示支持JDBC數據源鏈接池 --> <!-- UNPOOLED 表示不支持數據源鏈接池 --> <!-- JNDI 表示支持外部數據源鏈接池 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--引用映射文件--> <mappers> <mapper resource="mapper/UserInfo.xml"/> </mappers> <!-- Continue going here --> </configuration>
編寫測試類AppTest.java
,使用單元測試來逐項檢查「增刪改查」功能,只須要在各方法名上右鍵運行,便可進行測試;
其中註解的含義:在測試類中,每個用@Test註解修飾的方法稱爲測試方法,它們的調用順序爲@Before->@Test->@After。所以,每次執行一個單元測試方法,都會先運行init()方法初始化,創建數據庫會話,而後運行測試函數,最後調用destroy()釋放資源。mybatis
package org.example; import static org.junit.Assert.assertTrue; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.*; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLOutput; import java.util.List; /** * Unit test for simple App. */ public class AppTest { /** * Rigorous Test :-) */ private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; @Before public void init() { //讀取mybatis配置文件 String resource = "mybatis-config.xml"; InputStream inputStream; try { //獲得配置文件流 inputStream = Resources.getResourceAsStream(resource); //根據配置文件信息,建立會話工廠 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //經過工廠獲得Sqlsession sqlSession = sqlSessionFactory.openSession(); } catch (IOException e) { e.printStackTrace(); } } //根據id查詢用戶 @Test public void testFindUserInfoById() { //經過sqlSession執行映射文件中定義的SQL,並返回映射結果 UserInfo ui = sqlSession.selectOne("findUserInfoById", 101); //打印輸出結果 System.out.println(ui.toString()); } //根據用戶名模糊查詢用戶 @Test public void testFindUserInfoByUserName() { //執行映射文件中定義的SQL,並返回結果集 List<UserInfo> uis = sqlSession.selectList("findUserInfoByUserName", "ang"); for (UserInfo ui : uis) { System.out.println(ui); } } //添加用戶 @Test public void testAddUserInfo() { //建立UserInfo對象ui UserInfo ui = new UserInfo(104, "xia", "12334"); int res = sqlSession.insert("addUserInfo", ui); if (res > 0) { System.out.println("insert successfully!"); } else { System.out.println("insert failed!"); } } //修改用戶 @Test public void testUpdateUserInfo(){ //加載編號爲103的用戶 UserInfo ui = sqlSession.selectOne("findUserInfoById",103); ui.setPassword("13345"); int res = sqlSession.update("updateUserInfo",ui); if(res > 0){ System.out.println("update successfully!"); }else{ System.out.println("update failed!"); } } @Test public void testDeleteUserInfo(){ //執行sqlSession的delete方法,返回結果受影響的行數 int res = sqlSession.delete("deleteUserInfo",102); if(res > 0){ System.out.println("delete successfully!"); }else{ System.out.println("delete failed!"); } } @After public void destroy() { //提交事務 sqlSession.commit(); //關閉sqlSession sqlSession.close(); } }
使用用戶名模糊查詢用戶的結果,結果正確。