若是有疑問能夠先看上一篇博文:mybatis入門環境的部署java
下面開始展現Mybatis的增刪改查操做mysql
在Maven項目中須要的環境以下:sql
<!--以下是maven的導包問題--> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
MyBatis框架在操做數據庫時,大致通過了8個步驟。具體以下。數據庫
(1)讀取MyBatis配置文件mybatis-config.xml。mybatis-config.xml做爲MyBatis的全局配置文件,配置了MyBatis的運行環境等信息,其中主要內容是獲取數據庫鏈接。apache
(2)加載映射文件Mapper.xml。Mapper.xml文件即SQL映射文件,該文件中配置了操做數據庫的SQL語句,須要在mybatis-config.xml中加載才能執行。mybatis-config.xml能夠加載多個配置文件,每一個配置文件對應數據庫中的一張表。編程
(3)構建會話工廠。經過MyBatis的環境等配置信息構建會話工廠SqlSessionFactory。api
(4)建立SqlSession對象。由會話工廠建立SqlSession對象,該對象中包含了執行SQL的全部方法。緩存
(5)MyBatis底層定義了一個Executor接口來操做數據庫,它會根據SqlSession傳遞的參數動態地生成須要執行的SQL語句,同時負責查詢緩存的維護。session
(6)在Executor接口的執行方法中,包含一個MappedStatement類型的參數,該參數是對映射信息的封裝,用於存儲要映射的SQL語句的id、參數等。Mapper.xml文件中一個SQL對應一個MappedStatement對象,SQL的id便是MappedStatement的id。mybatis
(7)輸入參數映射。在執行方法時,MappedStatement對象會對用戶執行SQL語句的輸入參數進行定義(能夠定義爲Map、List類型、基本類型和POJO類型), Executor執行器會經過MappedStatement對象在執行SQL前,將輸入的Java對象映射到SQL語句中。這裏對輸入參數的映射過程就相似於JDBC編程中對preparedStatement對象設置參數的過程。
(8)輸出結果映射。在數據庫中執行完SQL語句後,MappedStatement對象會對SQL執行輸出的結果進行定義(能夠定義爲Map和List類型、基本類型、POJO類型), Executor執行器會經過MappedStatement對象在執行SQL語句後,將輸出結果映射至Java對象中。這種將輸出結果映射到Java對象的過程就相似於JDBC編程中對結果的解析處理過程。經過上面對MyBatis框架執行流程的講解,相信讀者對MyBatis框架已經有了一個初步的瞭解。對於初學者來講,上面所講解的內容可能不會徹底理解,現階段也不要求讀者能徹底理解,這裏講解MyBatis框架的執行過程是爲了方便後面程序的學習。在學習完MyBatis框架後,讀者天然就會明白上面所講解的內容了。
如上是測試時對配置文件的讀取操做是以上八個步驟的演示
如上是映射文件的查詢代碼
如上是實現方法的接口
測試案例的代碼
如上圖所示是結果顯示的代碼
映射文件的完整代碼
<?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"> <mapper namespace="top.zyz.dao.UserDao"> <!--配置查詢全部--> <select id="findAll" resultType="top.zyz.damain.User"> select *from user </select> <!--保存用戶--> <insert id="saveUsers" parameterType="top.zyz.damain.User"> <!-- 配置插入操做後,獲取插入數據的id --> <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER"> select last_insert_id(); </selectKey> insert into user(username,password,useremail)values(#{username},#{password},#{useremail}); </insert> <!--更新用戶的信息--> <update id="updateUser" parameterType="top.zyz.damain.User"> update user set username=#{username},password=#{password},useremail=#{useremail} where id=#{id} </update> <!--刪除用戶--> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> </mapper>
用戶接口類的完整代碼
import top.zyz.damain.User; import java.util.List; /* * 用戶接口方法 * */ public interface UserDao { /* * 查詢全部的用戶信息 * */ List<User> findAll(); /* * 保存用戶方法 * */ void saveUser(User user); /* * 更新用戶操做 * */ void updateUser(User user); /* *刪除用戶 * */ void deleteUser(int id); }
實現類的完整方法
import com.zyz.dao.UserDao; import com.zyz.domain.Users; 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.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.Date; import java.util.List; public class MybatisTest2 { private InputStream in; private SqlSession sqlSession; private UserDao usersDao; @Before//用於在測試方法執行以前執行 public void init()throws Exception{ //1.讀取配置文件,生成字節輸入流 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.獲取SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3.獲取SqlSession對象 sqlSession = factory.openSession(); //4.獲取dao的代理對象 usersDao=sqlSession.getMapper(UserDao.class); } @After//用於在測試方法執行以後執行 public void destroy()throws Exception{ //提交事務 sqlSession.commit(); //6.釋放資源 sqlSession.close(); in.close(); } @Test public void test1(){ Users users=new Users(); users.setUsername("test2"); users.setAddress("test2"); users.setSex("男"); users.setBirthday(new Date()); System.out.println("保存操做以前:"+users); //5.執行保存方法 usersDao.saveUsers(users); System.out.println("保存操做以後:"+users); } /*測試查詢全部*/ @Test public void test2(){ List<Users> users=usersDao.findAll(); for(Users user:users){ System.out.println(user); } } /*測試更新操做*/ @Test public void test3(){ Users user=new Users(); user.setId(50); user.setUsername("mybastis update user"); user.setAddress("mybastis update user"); user.setSex("男"); user.setBirthday(new Date()); usersDao.updateUsers(user); } /* * 測試刪除案例 * */ @Test public void testdeleteUsers(){ int id=50; usersDao.deleteUsers(id); } /** * 測試模糊查詢操做 */ @Test public void testFindByName(){ List<Users> users=usersDao.findByName("%王%"); for(Users user:users){ System.out.println(user); } } /** * 測試查詢總記錄條數 */ @Test public void testFindTotal(){ //5.執行查詢一個方法 int count = usersDao.findTotal(); System.out.println(count); } }
模糊查詢可使用如上的方式進行
SqlSession對象中包含了不少方法,其經常使用方法以下所示。
<T> T selectOne(String statement);
查詢方法。參數statement是在配置文件中定義的<select>元素的id。使用該方法後,會返回執行SQL語句查詢結果的一條泛型對象。
· <T> T selectOne(String statement, Object parameter);
查詢方法。參數statement是在配置文件中定義的<select>元素的id, parameter是查詢所需的參數。使用該方法後,會返回執行SQL語句查詢結果的一條泛型對象。
· <E> List<E> selectList(String statement);
查詢方法。參數statement是在配置文件中定義的<select>元素的id。使用該方法後,會返回執行SQL語句查詢結果的泛型對象的集合。·
<E> List<E> selectList(String statement, Object parameter);
查詢方法。參數statement是在配置文件中定義的<select>元素的id, parameter是查詢所需的參數。使用該方法後,會返回執行SQL語句查詢結果的泛型對象的集合。
<E> List<E> selectList(String statement, Object parameter, RowBoundsrowBounds);
查詢方法。參數statement是在配置文件中定義的<select>元素的id, parameter是查詢所需的參數,rowBounds是用於分頁的參數對象。使用該方法後,會返回執行SQL語句查詢結果的泛型對象的集合。
· void select(String statement, Object parameter, ResultHandler handler);
查詢方法。參數statement是在配置文件中定義的<select>元素的id, parameter是查詢所需的參數,ResultHandler對象用於處理查詢返回的複雜結果集,一般用於多表查詢。
· int insert(String statement);
插入方法。參數statement是在配置文件中定義的<insert>元素的id。使用該方法後,會返回執行SQL語句所影響的行數。
· int insert(String statement, Object parameter);
插入方法。參數statement是在配置文件中定義的<insert>元素的id, parameter是插入所需的參數。使用該方法後,會返回執行SQL語句所影響的行數。
· int update(String statement);
更新方法。參數statement是在配置文件中定義的<update>元素的id。使用該方法後,會返回執行SQL語句所影響的行數。
· int update(String statement, Object parameter);
更新方法。參數statement是在配置文件中定義的<update>元素的id, parameter是更新所需的參數。使用該方法後,會返回執行SQL語句所影響的行數。
· int delete(String statement);
刪除方法。參數statement是在配置文件中定義的<delete>元素的id。使用該方法後,會返回執行SQL語句所影響的行數。
· int delete(String statement, Object parameter);
刪除方法。參數statement是在配置文件中定義的<delete>元素的id, parameter是刪除所需的參數。使用該方法後,會返回執行SQL語句所影響的行數。
· void commit();
提交事務的方法。
· void rollback();
回滾事務的方法。
void close();
關閉SqlSession對象。
· <T> T getMapper(Class<T> type);
該方法會返回Mapper接口的代理對象,該對象關聯了SqlSession對象,開發人員可使用該對象直接調用方法操做數據庫。參數type是Mapper的接口類型。MyBatis官方推薦經過Mapper對象訪問MyBatis。
· Connection getConnection();
獲取JDBC數據庫鏈接對象的方法。
可是注意一下:sqlsession的對象在使用時必定注意:不一樣dao映射文件中的方法名不要相同,不然會報錯的
OGNL表達式:
Object Graphic Navigation Language
對象 圖 導航 語言
它是經過對象的取值方法來獲取數據。在寫法上把get給省略了。
好比:咱們獲取用戶的名稱
類中的寫法:user.getUsername();
OGNL表達式寫法:user.username
mybatis中爲何能直接寫username,而不用user.呢:
由於在parameterType中已經提供了屬性所屬的類,因此此時不須要寫對象名