mybatis實現增刪改查操做

若是有疑問能夠先看上一篇博文:mybatis入門環境的部署java

下面開始展現Mybatis的增刪改查操做mysql

在Maven項目中須要的環境以下:sql

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
<!--以下是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>
View Code

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框架後,讀者天然就會明白上面所講解的內容了。

如上是測試時對配置文件的讀取操做是以上八個步驟的演示

如上是映射文件的查詢代碼

如上是實現方法的接口

測試案例的代碼

如上圖所示是結果顯示的代碼

映射文件的完整代碼

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
<?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>
View Code

 

用戶接口類的完整代碼

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
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);

}
View Code

 

實現類的完整方法

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
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);
    }
}
View Code

模糊查詢可使用如上的方式進行

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中已經提供了屬性所屬的類,因此此時不須要寫對象名

請參考:

 

 

 

一紙高中萬里風,寒窗讀破華堂空。 莫道長安花看盡,由來枝葉幾相同?
相關文章
相關標籤/搜索