Spring整合Mybatis實現(xiàn)一個簡單的分頁查詢功能

上一篇:組織項目的目錄結構

下面將從零開始配置Sprign和Mybatis,以實現(xiàn)一個簡單的分頁查詢。
數(shù)據(jù)庫為MySql,數(shù)據(jù)源為Druid。具體示例請訪問:https://git.oschina.net/zhaowg3/ShopManage

下載Srping相關包并增加Spring配置文件

本例子使用Gradle構建,故在build.gradle中增加依賴即可,如果是非Gradle項目,可以自行下載,引入到工程中。

在build.gradle中增加依賴,下載spring相關的jar包。

/*spring框架*/
compile "org.springframework:spring-context:3.2.9.RELEASE"

在src/main/resources下面新建springContext.xml,該文件即spring的配置文件,后續(xù)的配置均放在該文件,包括數(shù)據(jù)庫的配置,事物的配置等。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 啟動注解掃描 -->
    <context:annotation-config />
    <!-- 設定注解掃描基礎包 -->
    <context:component-scan base-package="com.ai.emall" />  
</beans>

添加Druid數(shù)據(jù)源

下載mysql驅(qū)動和druid包。

在build.gradle中增加如下依賴

/*mysql驅(qū)動*/
compile 'mysql:mysql-connector-java:5.1.34'
/*druid數(shù)據(jù)連接池*/
compile "com.alibaba:druid:1.0.16"

新建存放Druid數(shù)據(jù)源信息的properties文件

例如,新建mybatis-emall.properties,內(nèi)容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/gcf-emall?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
#初始化連接數(shù)量
jdbc.initialSize=2
#最大并發(fā)連接數(shù)
jdbc.maxActive=4
#最小空閑連接數(shù)
jdbc.minIdle=3
#配置獲取連接等待超時的時間
jdbc.maxWait=60000
#超過時間限制是否回收
jdbc.removeAbandoned=true
#超過時間限制多長
jdbc.removeAbandonedTimeout=180
#配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
jdbc.timeBetweenEvictionRunsMillis=60000
#配置一個連接在池中最小生存的時間,單位是毫秒
jdbc.minEvictableIdleTimeMillis=300000
#用來檢測連接是否有效的sql,要求是一個查詢語句
jdbc.validationQuery=SELECT 1 FROM DUAL
#申請連接的時候檢測
jdbc.testWhileIdle=true
#申請連接時執(zhí)行validationQuery檢測連接是否有效,配置為true會降低性能
jdbc.testOnBorrow=false
#歸還連接時執(zhí)行validationQuery檢測連接是否有效,配置為true會降低性能
jdbc.testOnReturn=false
#打開PSCache,并且指定每個連接上PSCache的大小
jdbc.poolPreparedStatements=true
jdbc.maxPoolPreparedStatementPerConnectionSize=50
#屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監(jiān)控統(tǒng)計用的filter:stat 日志用的filter:log4j
jdbc.filters=stat

在Spring配置文件中添加Druid數(shù)據(jù)源配置

<!-- 加載配置文件 -->
<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:mybatis/mybatis-emall.properties</value>
        </list>
    </property>
</bean>
<!-- 配置數(shù)據(jù)源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
     <!-- 初始化連接數(shù)量 -->        
   <property name="initialSize" value="${jdbc.initialSize}" />       
    <!-- 最大并發(fā)連接數(shù) -->        
   <property name="maxActive" value="${jdbc.maxActive}" />                     
    <!-- 最小空閑連接數(shù) -->        
    <property name="minIdle" value="${jdbc.minIdle}" />         
    <!-- 配置獲取連接等待超時的時間 -->              
    <property name="maxWait" value="${jdbc.maxWait}" />         
    <!-- 超過時間限制是否回收 -->        
    <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />         
    <!-- 超過時間限制多長; -->        
    <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />         
    <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->       
    <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />     
    <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->        
    <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />         
    <!-- 用來檢測連接是否有效的sql,要求是一個查詢語句-->         
    <property name="validationQuery" value="${jdbc.validationQuery}" />        
    <!-- 申請連接的時候檢測 -->        
    <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />         
    <!-- 申請連接時執(zhí)行validationQuery檢測連接是否有效,配置為true會降低性能 -->        
    <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />         
    <!-- 歸還連接時執(zhí)行validationQuery檢測連接是否有效,配置為true會降低性能  -->        
    <property name="testOnReturn" value="${jdbc.testOnReturn}" />         
    <!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->        
    <property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" />              
    <property name="maxPoolPreparedStatementPerConnectionSize" value="${jdbc.maxPoolPreparedStatementPerConnectionSize}" />         
    <!--屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監(jiān)控統(tǒng)計用的filter:stat 日志用的filter:log4j                防御SQL注入的filter:wall -->        
    <property name="filters" value="log4j" />               
</bean>

Spring事物配置

添加依賴

/*spring事物*/
compile 'org.springframework:spring-tx:3.2.9.RELEASE'
compile 'org.springframework:spring-jdbc:3.2.9.RELEASE'
/*支持aspectj*/
compile "org.aspectj:aspectjrt:1.7.1"
compile "org.aspectj:aspectjweaver:1.7.1"

springContext配置

<!-- Spring數(shù)據(jù)源事務管理器: -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!--AOP 事務配置 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>
<aop:config>
    <!-- 配置注入點 -->
    <aop:pointcut id="transactionPointcut" expression="execution(* com.ai.emall.business..*Impl.*(..))" />
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="txAdvice" />
</aop:config>
<!-- 使用annotation注解方式配置事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />

Spring整合Mybatis配置

1. Mybatis-spring插件,配置創(chuàng)建session

具體使用可以參考:http://www.mybatis.org/spring/zh/index.html, 里面已經(jīng)說的很詳細了,我就不多說了,創(chuàng)建session有兩種方法,1.使用SqlSessionTemplate,2.使用MapperScannerConfigurer,這里使用的是第二種。

在build.gradle中添加依賴

/*mybatis核心包*/
compile 'org.mybatis:mybatis:3.3.0'
/*mybatis-spring插件*/
compile 'org.mybatis:mybatis-spring:1.2.4'

在springContext.xml中增加創(chuàng)建session所需配置

<!-- 配置myBatis的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 指定數(shù)據(jù)源 -->
    <property name="dataSource" ref="dataSource" />
    <!-- 指定mapper的xml文件位置 -->
    <property name="mapperLocations" value="classpath*:mybatis/*mapper/*.xml" />
</bean>
<!-- 使用MapperScannerConfigurer自動配置basePackage下面的所有映射器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.ai.emall.dao" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

2. Mybatis-generator插件,自動生成java代碼

使用該插件可以自動生成mapper,bean,dao,很大的節(jié)約了開發(fā)時間,尤其是生成bean時同時生成example,example可以滿足對單表的大部分操作,支持對每個字段的=,<,>,in,not in,is null,is not null,like,order by等常規(guī)操作,如果沒有特殊需要,完成不需要再自己手寫sql。

具體操作可以參考:Mybatis自動生成Dao,Bean,Mapper

3. Mybatis-pageHelper分頁插件

詳細操作和介紹請參考:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md,這里我只說下我的配置和使用方式。

在build.gradle中添加依賴

/*mybatis分頁插件*/
compile 'com.github.pagehelper:pagehelper:4.1.6'
compile 'com.github.jsqlparser:jsqlparser:0.9'

增加Mybatis配置文件,用以配置分頁插件
在resource下面新建MybatisPlugin.xml,內(nèi)容如下:

<?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>  
    <plugins>  
        <!-- com.github.pagehelper為PageHelper類所在包名 -->  
        <plugin interceptor="com.github.pagehelper.PageHelper">  
            <!-- 4.0.0以后版本可以不設置該參數(shù) -->  
            <property name="dialect" value="mysql"/>   
            <!-- 和startPage中的pageNum效果一樣-->  
            <property name="offsetAsPageNum" value="true"/>  
            <!-- 該參數(shù)默認為false -->  
            <!-- 設置為true時,使用RowBounds分頁會進行count查詢 -->  
            <property name="rowBoundsWithCount" value="true"/>  
            <!-- 設置為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->  
            <!-- (相當于沒有執(zhí)行分頁查詢,但是返回結果仍然是Page類型)-->  
            <property name="pageSizeZero" value="true"/>   
            <!-- 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 -->  
            <!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數(shù)據(jù) -->  
            <property name="reasonable" value="true"/>  
            <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->  
            <!-- 增加了一個`params`參數(shù)來配置參數(shù)映射,用于從Map或ServletRequest中取值 -->  
            <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默認值 -->  
            <!-- 不理解該含義的前提下,不要隨便復制該配置 -->  
            <property name="params" value="pageNum=start;pageSize=limit;"/>  
            <!-- 支持通過Mapper接口參數(shù)來傳遞分頁參數(shù) -->  
            <property name="supportMethodsArguments" value="true"/>  
            <!-- always總是返回PageInfo類型,check檢查返回類型是否為PageInfo,none返回Page -->  
            <property name="returnPageInfo" value="check"/>  
        </plugin>  
    </plugins>  
</configuration>

將上面的配置文件整合到spring中,在spirngContxt.xml的bean id=sqlSessionFactory下面增加
<property name="configLocation" value="classpath:mybatisPlugin.xml" />

<!-- 配置myBatis的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 指定數(shù)據(jù)源 -->
    <property name="dataSource" ref="dataSource" />
    <!-- 指定mapper的xml文件位置 -->
    <property name="mapperLocations" value="classpath*:mybatis/*mapper/*.xml" />
    <!-- 設置配置文件地路徑 -->
    <property name="configLocation" value="classpath:mybatisPlugin.xml" />
</bean>

分頁查詢測試

做完以上操作后,就可以真正開始編寫分頁查詢了。假設我們有一張產(chǎn)品表,實現(xiàn)分頁查詢產(chǎn)品信息。

  1. 產(chǎn)品表結構
CREATE TABLE `product` (
  `PRODUCT_ID` bigint(9) NOT NULL auto_increment COMMENT '產(chǎn)品ID',
  `NAME` varchar(45) default NULL COMMENT '產(chǎn)品名稱',
  `CREATER_ID` bigint(9) default NULL COMMENT '創(chuàng)建人',
  `CREATE_TIME` date default NULL COMMENT '創(chuàng)建時間',
  `MODIFIER_ID` bigint(9) default NULL COMMENT '修改人',
  `MODIFY_TIME` date default NULL COMMENT '修改時間',
  `PARAM` varchar(500) default NULL COMMENT '在線商品PRODUCT_ID和SKU_ID,用逗號分隔',
  `DRAINAGE_URL` varchar(300) default NULL COMMENT '引流URL',
  `SORT` bigint(15) default '0' COMMENT '排序',
  `PRODUCT_DESC` varchar(500) default NULL COMMENT '產(chǎn)品描述',
  PRIMARY KEY  (`PRODUCT_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='產(chǎn)品表';

在數(shù)據(jù)庫中隨便增加幾條信息,方便查詢看效果。

  1. 使用Mybatis-generator生成java的bean,dao,mapper。
  2. 編寫分頁查詢測試類:
/** 
 * 產(chǎn)品DAO相關操作測試
 * @author zhaowg3
 * @Date 2017年1月13日
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:springContext.xml")
public class ProductDaoTest {
    @Autowired
    private ProductMapper productMapper;
    
    /**
     * 測試分頁查詢
     * @throws Exception
     * @author zhaowg3
     * @Date 2017年1月16日
     */
    @Test
    public void testQueryByPage() throws Exception {
        ProductExample example = new ProductExample();
        //增加查詢條件
        Criteria criteria = example.createCriteria();
        criteria.andCreaterIdEqualTo(123L);//創(chuàng)建人Id=123
        //增加排序
        example.setOrderByClause("product_id desc");//通過產(chǎn)品ID,降序排列
        //獲取第1頁,10條內(nèi)容,默認查詢總數(shù)count
        PageHelper.startPage(1, 10);
        List<Product> products = productMapper.selectByExample(example );
        if(CollectionUtils.isEmpty(products)){
            System.out.println("***************未查詢到相關數(shù)據(jù)*************");
            return;
        }
        //將查詢結果使用pageInfo包裝
        PageInfo<Product> page = new  PageInfo<Product>(products);
        //測試PageInfo全部屬性
        //PageInfo包含了非常全面的分頁屬性
        assertEquals(1, page.getPageNum());
        assertEquals(10, page.getPageSize());
        assertEquals(1, page.getStartRow());
        assertEquals(10, page.getEndRow());
        assertEquals(183, page.getTotal());
        assertEquals(19, page.getPages());
        assertEquals(1, page.getFirstPage());
        assertEquals(8, page.getLastPage());
        assertEquals(true, page.isIsFirstPage());
        assertEquals(false, page.isIsLastPage());
        assertEquals(false, page.isHasPreviousPage());
        assertEquals(true, page.isHasNextPage());
    }

}
分頁查詢測試

完整配置信息請參見:https://git.oschina.net/zhaowg3/ShopManage/tree/master/shopmanage-project/shpm-emall-project/src/main/resources

相關參考:
Mybatis 工具集
Mybatis 分頁插件

下一篇:Spring 整合Dubbo提供服務

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,255評論 6 342
  • Spring 技術筆記Day 1 預熱知識一、 基本術語Blob類型,二進制對象Object Graph:對象圖...
    OchardBird閱讀 1,074評論 0 2
  • 一 踩狗屎 有這么一個劍客,他的劍并沒有達到最頂尖的水平。 但是大多江湖人卻都有所耳聞他的名字。 因為他每次用劍都...
    月下破曉閱讀 386評論 1 1
  • “腹有詩書氣自華”這是我們對女生的一種評價。 倘若我們喜歡那個人,就會說好有氣質(zhì),漂亮之類的話。 還記得開學第一課...
    青果果說閱讀 257評論 0 4

友情鏈接更多精彩內(nèi)容