1. 程式人生 > >Mybatis外掛和批量操作

Mybatis外掛和批量操作

擴充套件一個簡單的實現 

@Intercepts({
        @Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class)
})
public class MyFirstPlugin implements Interceptor {
    /**
     * intercept:攔截
     *      攔截目標物件的方法的執行
     * @param invocation
* @return
* @throws Throwable
     */
@Override public
Object intercept(Invocation invocation) throws Throwable { System.out.println("MyFirstPlugin....interceptor:"+invocation.getMethod()); //動態改變sql執行的引數:以前1號員工,現在4號 Object target = invocation.getTarget(); System.out.println("當前攔截物件:"+target); //拿到StatementHandler====》ParameterHandler===》ParameterObject
//拿到目標物件target的元資料
MetaObject metaObject = SystemMetaObject.forObject(target); Object value = metaObject.getValue("parameterHandler.parameterObject"); System.out.println("SQL語句用的引數是"+value); metaObject.setValue("parameterHandler.parameterObject",4); //執行目標方法 Object proceed = invocation.proceed();
//返回執行後的返回值 return
proceed; } /** * plugin:包裝目標物件——包裝:為目標物件建立一個代理類 * @param target * @return */ @Override public Object plugin(Object target) { System.out.println("MyFirstPlugin....plugin:mybatis將要包裝的物件"+target); //我們可以藉助Plugin的wrap方法來使用當前的intercept包裝我們目標物件 Object wrap = Plugin.wrap(target, this); //返回為當前target建立好的動態代理 return wrap; } /** * setProperties:將外掛註冊時的property屬性設定進來 * @param properties */ @Override public void setProperties(Properties properties) { System.out.println("外掛配置的資訊"+properties); } }
@Test
public void testPlugin() throws IOException {
    SqlSession sqlSession = getSqlSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee e = mapper.getEmps(1);
System.out.println(e);
}


分頁外掛pageHelper

配置依賴

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

在全域性配置檔案中配置攔截器

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

在程式碼中使用PageHelper.startPage( )即可實現分頁

@Test
public void test() throws IOException {
    SqlSession sqlSession = getSqlSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
PageHelper.startPage(1,5);
List<Employee> employeeList = mapper.getEmps();
    for (Employee e:employeeList) {
        System.out.println(employeeList);
}
}

外掛會自動查詢數量和進行分頁的sql


其他資訊

@Test
public void test() throws IOException {
    SqlSession sqlSession = getSqlSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Page<Object> page = PageHelper.startPage(1, 5);
List<Employee> employeeList = mapper.getEmps();
    for (Employee e:employeeList) {
        System.out.println(employeeList);
}

    System.out.println("當前頁碼"+page.getPageNum());
System.out.println("總記錄數"+page.getTotal());
System.out.println("每頁記錄數"+page.getPageSize());
System.out.println("總頁碼"+page.getPages());
}

還可以使用PageInfo達到更多分頁的資訊:

@Test
public void test() throws IOException {
    SqlSession sqlSession = getSqlSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Page<Object> page = PageHelper.startPage(1, 5);
List<Employee> employeeList = mapper.getEmps();
PageInfo info = new PageInfo(employeeList);
    for (Employee e:employeeList) {
        System.out.println(employeeList);
}

    System.out.println("當前頁碼"+info.getPageNum());
System.out.println("總記錄數"+info.getTotal());
System.out.println("每頁記錄數"+info.getPageSize());
System.out.println("總頁碼"+info.getPages());
System.out.println("是否第一頁"+info.isIsFirstPage());
System.out.println("是否最後一頁"+info.isIsLastPage());
批量操作

可以使用<foreach>標籤做批量,但是使用這個標籤是對sql執行拼接,但是比如MySQL資料庫對於大量資料的這種處理是特別麻煩!

使用批量:

@Test
public void testBatch() throws IOException {
   String str = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(str);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//可以執行批量操作sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    try {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            mapper.addEmployee(new Employee(UUID.randomUUID().toString().substring(1,5)+"lala","1","[email protected]"));
}
        sqlSession.commit();
        long end = System.currentTimeMillis();
System.out.println("執行的時長"+(end-start));
} finally {
        sqlSession.close();
}
}


預編譯SQL一次==》設定引數10000次==》資料庫執行(批量,1次)

非批量:

public void testBatch() throws IOException {
   String str = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(str);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//可以執行批量操作sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            mapper.addEmployee(new Employee(UUID.randomUUID().toString().substring(1,5)+"lala","1","[email protected]"));
}
        sqlSession.commit();
        long end = System.currentTimeMillis();
System.out.println("執行的時長"+(end-start));
} finally {
        sqlSession.close();
}
}


預編譯SQL==》設定引數==》執行——呼叫多少次執行多少次

與spring整合的時候,批量:

在spring配置檔案中:

<!--配置一個可以批量執行的SqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
    <constructor-arg name="executorType" value="BATCH"/>
</bean>

使用:在service中

@Autowired
private SqlSession sqlSession;
這個就是可以使用批量的SqlSession

相關推薦

Mybatis外掛批量操作

擴充套件一個簡單的實現 @Intercepts({ @Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class) }) pub

maven+mybatis+mybatis-generator+sql server 2005自動生成程式碼,加上自定義分頁外掛批量插入更新外掛

第一步:準備需要的jar包。由於maven只要配置pom.xml就可以從倉庫下載jar包。因此我們首先配置pom.xml。 注意com.microsoft.sqlserver需要自己加入maven倉庫的。 <dependencies> ......

mybatis新增批量新增

需要 開始 long 報錯 result 新增 sel mage blog 先上圖: 圖1 新增一條數據,並返回新增後的主鍵,沒問題。 圖2 批量新增,這樣寫就會報錯。剛開始我以為是要 insert into table(id,**,**) values(id,**,*

模擬admin組件自己開發stark組件之搜索批量操作

btn 但是 相關 操作 else htm actions 函數 自己 搜索相關,搜索的本質就是從數據庫查詢出來的數據過濾 用戶自定義給出過濾條件joker.py list_display = (‘id‘,‘title‘,‘price‘,) show_add_btn =

jQuery之事件批量操作、事件委託示例

一、常用事件 click(function(){...}) // 點選時觸發 focus(function(){...}) // 獲得焦點觸發 blur(function(){...}) // 失去焦點觸發 change(function(){...}) // 內容改變後觸發

myBatis 配置檔案 批量操作(增、刪、改)操作(資料庫 oracle 11g)

1、更新 <update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="

mybatis單條批量插入返回插入成功後的主鍵id

有些時候我們在新增記錄成功後希望能直接獲取到該記錄的主鍵id值,而不需要再執行一次查詢操作。在使用mybatis作為ORM元件時,可以很方便地達到這個目的。鑑於mybatis目前已經支援xml配置和註解2種方式,所以分別給予詳細介紹。使用xml配置方式1.xml配置:<!-- 插入資料:返回記錄的id值

頁面實現全選批量操作

全選的思路是:遍歷標籤下的type為checkbox的input標籤,改變這些checkbox的check狀態和點選全選的狀態一樣 批量操作的思路是:用js獲取記錄中的id用逗號拼接,傳到後臺執行批量操作的處理 全選js: $("#checkAll").click(fun

SSM之Mybatis查詢以及批量操作

這篇文章是在我的SpringMVC前後端資料互動基礎上把資料庫環節打通,主要涉及mybatis的查詢(傳多個引數),批量刪除,新增,修改,資料庫是MySQL,註釋很詳細,直接看程式碼即可: JSP <%@ page language="java" import="ja

Dojo 1.6 最新官方教程: 如何使用dojo.query 進行DOM查詢批量操作

在本講義中,我們將學到DOM的查詢,以及如何使用dojo.query來方便的查詢並操作DOM節點。 難度:初學者  適用的Dojo 版本: 1.6 作者: Bryan Forbes 譯者: feijia 入門 對DOM程式設計的一個關鍵要素是能夠快速高效的獲

MyBatis插入批量插入

注意事項: 批量插入的時候,需要注意動態SQL的寫法:即拼接出來的SQL語句和常規的SQL語句語法一致。 批量插入的時候,需要注意,在後臺要寫成user.name或者map.name,否則會出錯 插入返回主鍵需要通過entity.getId()來進行返回。 概述

SpringCloud或SpringBoot+Mybatis-Plus利用AOP+mybatis外掛實現資料操作記錄及更新對比

引文   本文主要介紹如何使用Spring AOP + mybatis外掛實現攔截資料庫操作並根據不同需求進行資料對比分析,主要適用於系統中需要對資料操作進行記錄、在更新資料時準確記錄更新欄位 核心:AOP、mybatis外掛(攔截器)、mybatis-Plus實體規範、資料對比 1、相關技術簡介 mybat

mybatis使用foreach進行批量插入刪除操作

JD div foreach class AR tis 默認 post AC 一、批量插入 1.mapper層 int insertBatchRoleUser(@Param("lists") List<RoleUser> lists);//@Param

mybatis中使用replace into insert INTO … ON DUPLICATE KEY UPDATE批量操作

一、replace into <insert id=“a" useGeneratedKeys="true"> REPLACE INTO table_name (product_id,departs_date,price_value) VALUES

C# 遍歷所有的子控件孫控件,包括容器中的,並批量操作調用

cnblogs ati tex foreach pri int 遍歷 asc 語句 這裏要用兩個知識,一個是遞歸,一個是隊列。 //定義一個Control類型的隊列allCtrls private static Queue <Control> allCtrls

數據庫--MyBatis的(insert,update,delete)三種批量操作

tno open let 項目 sep arraylist htm 子句 由於 轉自:http://blog.csdn.net/starywx/article/details/23268465 前段時間由於項目趕期沒顧上開發過程中的性能問題,現對部分代碼進行優化的過程中發

StackExchange.Redis學習筆記(四) 事務控制Batch批量操作

成了 pan arp 展示 關於 public 連續 因此 用戶 Redis事物 Redis命令實現事務 Redis的事物包含在multi和exec(執行)或者discard(回滾)命令中 和sql事務不同的是,Redis調用Exec只是將所有的命令變成一個單元一起執行,期

Mybatis 批量操作

name targe str public del tor rop arch 設置 轉自:https://www.cnblogs.com/liaojie970/p/5577018.html Mapper.xml: <?xml version="1.0" en

mybatis批量操作

gin bat 格式 integer tiny entity reat del case mybatis批量操作: 批量保存: <insert id="batchInsertBeneficiary" parameterType="com.api.params.Ben

Django ORM批量操作foreign key

The objects clas length 批量操作 小寫 sql delete 不同 批量操作 Django ORM 中的批量操作 Django ORM 中的批量操作 在Hibenate中,通過批量提交SQL操作,部分地實現了數據庫的批量操作。但在Django的ORM