Git Product home page Git Product logo

mybatis-pagehelper's People

Contributors

abel533 avatar alenx-zheng avatar angrydisk avatar chodenke avatar dhhua avatar iimik avatar ijliym avatar jssgsy avatar leaves615 avatar lenosp avatar lihongzheshuai avatar liumian97 avatar luozhenyu avatar lvshuyan avatar majiang213 avatar miaogr86 avatar miniministar avatar moonfruit avatar muyun12 avatar outian avatar pagehelper avatar panmingzhi815 avatar qxo avatar saxisuer avatar siwet avatar sxh0570 avatar uyong avatar xianlaioy avatar yesand92 avatar zhanliquan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mybatis-pagehelper's Issues

JRebel重新加载导致分页失效

IDEA 2016.3.3 + JRebel 7.0.2 + SpringBoot 1.4.3 + SpringBoot的插件
这个模式下,Jrebel模式重新编译代码,会导致PageHelper的分页查询直接失效。
目前在多台机器上都100%存在这个问题。

该插件能结合 LEFT JOIN 实现一对多查询时的分页吗?

image

image

image

显示用户列表的时候想同时显示用户所属的所有公司名称,所以用了 LEFT JOIN 来实现一对多,目前结合该插件分页查询后总的条数和单独执行 SQL 的结果是一样的「但是希望分页的时候能按左表来计算分页属性,该插件能通过某种配置来实现这种一对多的查询吗?」

PageHelper插件对于informix数据库的支持问题

您好,最近在做一个项目,采用Sping+SpringMVC+MyBatis,数据库采用informix,其中也引入了您的开源项目PageHelper。
调用时我观察了一下总条数的查询语句,SELECT count(0) FROM company WHERE 1 = 1 AND companyid = ? 。count(0)的写法在informix数据里是不支持的,所以我在测试时,SQL部分直接报错,
==> Preparing: SELECT count(0) FROM company WHERE 1 = 1 AND companyid = ?
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@ea04cb]
[org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
[org.springframework.jdbc.support.SQLErrorCodesFactory] - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
五月 08, 2017 3:28:59 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet rpReport threw exception
java.sql.SQLException
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:373)
at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3523)
at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2353)
at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2269)
at com.informix.jdbc.IfxSqli.executePrepare(IfxSqli.java:1153)
at com.informix.jdbc.IfxPreparedStatement.e(IfxPreparedStatement.java:318)
at com.informix.jdbc.IfxPreparedStatement.a(IfxPreparedStatement.java:298)
at com.informix.jdbc.IfxPreparedStatement.(IfxPreparedStatement.java:168)
at com.informix.jdbc.IfxSqliConnect.h(IfxSqliConnect.java:5918)
at com.informix.jdbc.IfxSqliConnect.prepareStatement(IfxSqliConnect.java:1999)
at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:248)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:54)
at com.sun.proxy.$Proxy34.prepareStatement(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:75)
at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:85)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:57)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:73)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:59)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:137)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:96)
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:112)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:60)
at com.sun.proxy.$Proxy33.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:108)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:102)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
at com.sun.proxy.$Proxy21.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:198)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:119)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at com.sun.proxy.$Proxy31.select(Unknown Source)
at com.picc.service.impl.CompanyServiceImpl.select(CompanyServiceImpl.java:21)
at com.picc.controller.CompanyController.select(CompanyController.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:745)

limit出现两次,如: LIMIT 1,5 LIMIT 1,5,导致sql报错

打印出来的sql语句,其中的LIMIT1,5有两次,导致sql报错

select * from t_weike   
  WHERE  `published` = ?   
    AND `publish_user_id` = ?  
    AND `deleted` = ?
    ORDER BY id desc LIMIT 1,5 LIMIT 1,5

我的环境:

  • Mysql 5.6
  • SpringBoot
  • Maven

其中pom.xml配置如下:

       <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!--mybatis 分页插件-->
        <!--mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!--pagehelper-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!--mybatis 分页插件 end -->

Spring的applicationContext.xml配置如下:

    <!-- mybatis 配置 start -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:mybatis/*.xml"/>
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>reasonable=true</value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.benmei.weike.dao"/>
    </bean>
    <!-- mybatis 配置 end/ -->

Java代码如下:

        PageRowBounds pageRowBounds = new PageRowBounds(1, 5);
        List<Weike> list = weikeDao.searchWeike(weike,pageRowBounds);
        long total = pageRowBounds.getTotal();

pagehelper 5.0.0版本 动态SQL分页问题

PageHelper.startPage(1,5);
mapper.executeSql(String sqlStr);//此sql语句是动态传入的,mapper.xml文件写法是${sqlStr}。执行后确实分页了。
PageHelper.clearPage();
mapper.select1(pagram1);//但是这个普通的select 语句都也被分页了。mapper.xml文件写法是select * from **
mapper.select2(pagram1);//这个普通的select 语句都也被分页了。
mapper.select3(pagram1);//这个普通的select 语句都也被分页了。
而我只想分页一次,即让executeSql分页,不想让select1,select2,select3分页。怎么办?
加上PageHelper.clearPage();也不行。

分页取数据时,如果数据一条都没有返回, pageInfo.isIsLastPage(); 返回false

 int offset = 0;
        boolean isLast = false;

        while (!isLast) {
            PageHelper.offsetPage(offset, LIMIT);
            PageInfo<Gjc> pageInfo = new PageInfo<>(gjcMapper.getGjcs());
            for (Gjc gjc : pageInfo.getList()) {
                redisService.set(GJC.concat(gjc.getGjc()), String.valueOf(gjc.getBh()));
            }
            isLast = pageInfo.isIsLastPage();
            offset = offset + LIMIT;
        }

代码如上
gjcMapper.getGjcs()
数据库一条数据都没有,取回的时候
isLast = pageInfo.isIsLastPage(); 的标志位始终为false

异常:There is no getter for property named 'distinct' ExampleProvider.java 84 行

错误信息

org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'distinct' in 'class com.dhcc.mis.pub.product.entity.ProductEntity'
	at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:381)
	at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:94)
	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:108)
	at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2420)
	at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114)
	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)
	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458)
	at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)
	at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
	at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
	at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)
	at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:279)
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:80)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy77.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
	at sun.reflect.GeneratedMethodAccessor360.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354)
	at com.sun.proxy.$Proxy22.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
	at com.sun.proxy.$Proxy37.selectByExample(Unknown Source)
	at com.dhcc.mis.pub.product.service.ProductService.getProductList(ProductService.java:35)

调用:

 PageHelper.offsetPage(prod.getStart(),prod.getLength()); 

        List<ProductEntity> list = mapper.selectByExample(prod);
 public String selectByExample(MappedStatement ms) {
        Class<?> entityClass = getEntityClass(ms);
        //将返回值修改为实体类型
        setResultType(ms, entityClass);
        StringBuilder sql = new StringBuilder("SELECT ");
        sql.append("<if test=\"distinct\">distinct</if>");
        //支持查询指定列

这里 我的ProductEntity没有distinct 这里会报错
使用版本:
pagehelper-5.0.0.jar
mybatis-3.3.1.jar
mapper-3.3.6.jar

PageHelper-SpringBoot + OrderByHelper 排序无效!

这是POM:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.1.0</version> </dependency>

	`<dependency>
	    <groupId>tk.mybatis</groupId>
	    <artifactId>orderby-helper</artifactId>
	    <version>0.0.1</version>
	</dependency>`

分页+排序代码片段:
PageHelper.startPage(pageBean.getPage(),pageBean.getRows()); //添加排序字段 OrderByHelper.orderBy(baseEntity.getSort()+" "+baseEntity.getOrder());

还有 MyBatis.xml的配置: <plugins> <!-- 分页插件或其他插件,OrderBy 一定要在分页插件下面(主要是为了避免 count 也被增加排序) --> <plugin interceptor="tk.mybatis.orderbyhelper.OrderByHelper"/> </plugins>

结果是没排序

关于PageInfo响应为json的问题请教

我在开发API的时候,需要给客户端返回json,而且要包括分页信息,但是PageInfo类的信息太多了,我并不想全部给客户端显示,而Page类又无法被转化为json,有没有什么办法解决下?还是说我只能重新写一个类来包装一下

fulltext search

在使用mysql5.7版本的fulltext查询时 count语句变成了
select count(0) from (select * from table WHERE MATCH (text) AGAINST (? IN BOOLEAN MODE)) tmp_count
未使用fulltext全文检索查询时count语句为
SELECT count(0) FROM table

为什么fulltext全文检索的count语句不能直接是
SELECT count(0) FROM table WHERE MATCH (text) AGAINST (? IN BOOLEAN MODE)) 感觉这样效率更高

PageRowBounds统计总数为null?

    val p = PageRowBounds(0, 10)
    val users = userDao.pageSearch(p)
    users.forEach { println(it.username) }
    println(p)
    val total = p.total
    if (total == null) {
        println(0)
    } else {
        println(total)
    }
    println("+++++++++++++++++++++++++++++")

输出如下

test1395990298
test-181769175
com.github.pagehelper.PageRowBounds@232bdc3d
0
+++++++++++++++++++++++++++++

why?

Cause: java.sql.SQLSyntaxErrorException: ORA-00907: 缺失右括号

使用的版本是4.2.1

SQL: select count(0) from (select S.ID, S.NAME, S.STATION_CODE, S.POSITION_CODE, S.ADDRESS, S.PHONE, S.LONGITUDE, S.LATITUDE, S.CREATE_DATE ,U.FULL_NAME as YWY_NAME from SERVICE_STATIONS S LEFT JOIN YWY_IN_STATION Y ON S.ID = Y.STATION_ID LEFT JOIN USERS U ON U.ID = Y.USER_ID WHERE S.NAME LIKE "%"?"%" order by S.id) tmp_count

Cause: java.sql.SQLSyntaxErrorException: ORA-00907: 缺失右括号

请问支持这样传参分页么

public PageInfo<T> byPage(Integer pageNo, Integer pageSize, List<T> llist) 
{
        pageNo = pageNo == null ? 1 : pageNo;
        pageSize = pageSize == null ? 10 : pageSize;
        PageHelper.startPage(pageNo, pageSize);
        List<T> list = llist ;

        return new PageInfo<T>(list);
}

配置方法

使用javaconfig方式配置的话,应该怎么配置,不用xml

PageHelper Cannot cast to Interceptor.

Hi
I am trying to add PageHelper to my [Sping - SpringMVC - MyBatis] project.
But some errors happened. Can you tell me why. Thanks in advance.

五月 02, 2017 11:40:35 下午 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [D:\Software\apache-tomcat-8.0.36\webapps\joker\WEB-INF\classes\config\spring\applicationContext-dao.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [config/mybatis/SqlMapConfig.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:732)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4842)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5303)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1092)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1834)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [config/mybatis/SqlMapConfig.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor
at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:499)
at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:381)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
... 25 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:120)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:98)
at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:493)
... 28 more
Caused by: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor
at org.apache.ibatis.builder.xml.XMLConfigBuilder.pluginElement(XMLConfigBuilder.java:182)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:109)
... 30 more
五月 02, 2017 11:40:35 下午 org.apache.catalina.core.ApplicationContext log


this is mybatis config file:


this is the DAO config file for spring

<!-- 数据库连接池 -->
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:config/resource/database.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
	destroy-method="close">
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
	<property name="driverClassName" value="${jdbc.driver}" />
	<property name="maxActive" value="10" />
	<property name="minIdle" value="5" />
</bean>
<!-- 配置sqlsessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="configLocation" value="classpath:config/mybatis/SqlMapConfig.xml"></property>
	<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置扫描包,加载mapper代理对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="com.joker.mapper"></property>
</bean>

高并发测试时,出现RuntimeException

使用版本:4.1.6
说明:查看5.0.1版本源码,该部分代码没变,应该也可以重现该bug
异常现场

### Error querying database.  Cause: java.lang.RuntimeException: 无法处理该类型[class com.github.pagehelper.sqlsource.PageDynamicSqlSource]的SqlSource
### Cause: java.lang.RuntimeException: 无法处理该类型[class com.github.pagehelper.sqlsource.PageDynamicSqlSource]的SqlSource
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:79)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447)
	at com.sun.proxy.$Proxy72.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:231)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:128)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53

重现
在启一个线程池,进行同一个分页查询操作时,出现RuntimeException,无法处理该类型PageDynamicSqlSource

所用代码如下:

    @Test
    public void search() throws Exception {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for(int i = 0;i<10;i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    Object result = testService.search(1, new Random().nextInt(1000));
                    logger.info(JSONObject.toJSONString(result));
                }
            });
        }
        executorService.shutdown();
        while(true){
            if(executorService.isTerminated()){
                break;
            }
            Thread.sleep(100);
        }
    }

异常分析
在SqlUtils方法中有以下处理:

     //判断并处理为PageSqlSource
        if (!isPageSqlSource(ms)) {
            processMappedStatement(ms);
        }

其中:
processMappedStatement方法为:

public void processMappedStatement(MappedStatement ms) throws Throwable {
        SqlSource sqlSource = ms.getSqlSource();
        MetaObject msObject = SystemMetaObject.forObject(ms);
        SqlSource pageSqlSource;
        if (sqlSource instanceof StaticSqlSource) {
            pageSqlSource = new PageStaticSqlSource((StaticSqlSource) sqlSource);
        } else if (sqlSource instanceof RawSqlSource) {
            pageSqlSource = new PageRawSqlSource((RawSqlSource) sqlSource);
        } else if (sqlSource instanceof ProviderSqlSource) {
            pageSqlSource = new PageProviderSqlSource((ProviderSqlSource) sqlSource);
        } else if (sqlSource instanceof DynamicSqlSource) {
            pageSqlSource = new PageDynamicSqlSource((DynamicSqlSource) sqlSource);
        } else if(sqlSource instanceof PageDynamicSqlSource) {
            pageSqlSource = sqlSource;
        }else {
            throw new RuntimeException("无法处理该类型[" + sqlSource.getClass() + "]的SqlSource");
        }
        msObject.setValue("sqlSource", pageSqlSource);
        //由于count查询需要修改返回值,因此这里要创建一个Count查询的MS
        msCountMap.put(ms.getId(), MSUtils.newCountMappedStatement(ms));
    }

由于processMappedStatement是非线程安全的方法,虽然前面进行过if判断,进入这个方法体后sqlSource对象还是有可能是处理过的PageSqlSource,此时instanceof 判断失败,抛出RuntimeException

建议订正
在条件判断最后,再进行一次PageSqlSource的判断,如果是,直接返回:

else if(sqlSource instanceof PageSqlSource){
    pageSqlSource  = sqlSource ;
}else {
            throw new RuntimeException("无法处理该类型[" + sqlSource.getClass() + "]的SqlSource");
 }

关于 SqlServer2012Dialect 生成的分页 SQL 格式问题

我遇到当使用 PageHelper.startPage(1, 10); 的方式进行分页查询时,会爆出 :

数据库是 SQL Server 2014,helperDialect 设置为 sqlserver2012

com.microsoft.sqlserver.jdbc.SQLServerException: Invalid usage of the option NEXT in the FETCH statement.

PageHelper自动生成的:

SELECT
  [num]
FROM vw_app_query_1
WHERE (num LIKE '%' + ? + '%')
ORDER BY [num] 
  FETCH NEXT 10 ROWS ONLY;

可以正确执行的:

SELECT
  [num]
FROM vw_app_query_1
WHERE (num LIKE '%' + '32' + '%')
ORDER BY [num]
  OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

主要是缺少了 OFFSET 0 ROWS

业务层封装vo. PageInfo失效

我在使用静态方法使下一个select方法分页生效后,得到的list中是po对象,将它们转换为了适用于页面的vo对象list后,放入PageInfo中,也可以分页,但是pageinfo的属性失效了,所以我现在调用两种Service方法,一种返回po,一种封装为vo,因为我只想要PageInfo的分页属性,请问有没有什么好的解决方案?我也在思考中,感谢!

pagehelper 5.0.0 Paging failure

This is my pom.xml:

com.github.pagehelper
pagehelper

        <!--5.0.0 Paging failure,4.1.0 Paging success-->
        <version>4.1.0</version>
        <!--<version>5.0.0</version>-->
  </dependency>

Of cause , pagehelper-spring-boot-starter is ok!Only version 5.0.0 is failure.

版本5.0.0-rc 报空指针异常。

该方法未使用分页。打断点看了下类PageInterceptor中intercept方法被调用了2次

第一次的时候 dialect 的值为PageHelper

第二次dialet的值就为空了。所以在finaly里面调用afterAll 时报空指针

collection 关联查询 First_PageHelper 缺失异常

使用版本pagehelper-4.1.3

重现:
1.使用分页查询某条数据 假设在Mapper里面 id="selectA" (此处会改变 id="selectA" 的sqlSource 为PageDynamicSqlSource)
2.使用分页查询另外一条数据,但是其resultMap里面包含了selectA
如:

	<resultMap id="ResultMap" type="XXXForm" >
 		<collection property="pros" column="Id=prosID" select="selectA" />
	</resultMap>

在mybatis在查出主表的数据之后,会执行查询属性pros的语句selectA,在 PageSqlSource.getBoundSql方法里面获取SQL的时候就会将selectA也当作是需要分页查询的语句

原因是getCount()获取的是线程变量Page的countSignal属性(count信号,3种情况,null的时候执行默认BoundSql,true的时候执行count,false执行分页)

然后这里实际上是不需要分页查询的,所以再获取 First_PageHelper 的时候会报找不到 First_PageHelper 属性的异常。

请教一下,这个bug在后续的版本有修复吗?

分页得出结果PageInfo中的navigatePages值的疑惑

表里面一共 5 条记录, 我按照每页 2 条分页, 查第一页

{
  "endRow": 2,
  "firstPage": 1,
  "hasNextPage": true,
  "hasPreviousPage": false,
  "isFirstPage": true,
  "isLastPage": false,
  "lastPage": 3,
  "list": [
    ...//省略
  ],
  "navigateFirstPage": 1,
  "navigateLastPage": 3,
  "navigatePages": 8,     //?????????为什么是8
  "navigatepageNums": [
    1,
    2,
    3
  ],
  "nextPage": 2,
  "pageNum": 1,
  "pageSize": 2,
  "pages": 3,
  "prePage": 0,
  "size": 2,
  "startRow": 1,
  "total": 5
}

版本5.0.0 报空指针异常,注册两次分页插件

嗨,我遇到了一个问题,跟 #9 一样。
可我只配置了一次,PageInterceptor中intercept方法却被调用了2次,换成4.2的版本就正常了。
我的设置如下:

<property name="plugins">
            <array>
                <!--配置mybatis分页插件-->
                <bean class="com.github.pagehelper.PageInterceptor"/>
            </array>
        </property>

请问还有可能是哪里的问题呢?
@wolazy

分页时枚举类型报错?

在mapper.xml中已经对相应的枚举类型设置了

typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler

page自动查询count的语句正常输出,但是查询list结果的语句就会提示Object does not represent an enum type.的异常。dubug的时候,我的两个枚举两次正常进入,不明白的是为什么又进入了第三次传入了一个Object类型的Class对象,理应来说只有两个参数设置了typeHandler,应该进入两次就完了。

image

page_bug

如果注释掉分页,直接查询list结果集也是可以正常查询的,所以我斗胆猜测是否是分页引起的bug,麻烦作者检查一下(PS:我用mybatis的时间不是很长,也许是我使用方法有误,也麻烦请告知,请包涵)

建议Page实现java.lang.AutoCloseable接口

需要在SQL异常的后处理中,进行其他SQL查询操作等, 所以需要在每个startPage时,通过try finally调用clearPage,如果Page本身实现AutoCloseable接口(调用clearPage),则直接使用ty(){}就可以了。

不配置方言直接空指针!

<bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=mysql
                        </value>
                    </property>
                </bean>

必须上面那样写,但是在你文档里面说。不写也可以。默认自动分析来着。。。。。。。。。。大天坑

批量分页查询中执行update操作导致数据缺失

在一个循环中,从第一页查询到最后一页,在这个过程中,将查询出来的结果执行update操作,导致分页查询的记录数不准确。如果不执行update操作,就能准确查出所有记录,请问这种情况只能手动写分页了吗?

jsqlparser-0.9.6及以上版本会异常,net.sf.jsqlparser.statement.select.Top类在0.9.6中有变更

Caused by: java.lang.NoSuchMethodError: net.sf.jsqlparser.statement.select.Top.setRowCount(J)V
at com.github.pagehelper.parser.SqlServerParser.(SqlServerParser.java:77)
at com.github.pagehelper.dialect.helper.SqlServerDialect.(SqlServerDialect.java:44)
at com.github.pagehelper.dialect.helper.SqlServer2012Dialect.(SqlServer2012Dialect.java:33)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

maven工程5.0.0启动报错

在同一个工程的测试类里边运行没问题,用maven的tomcat插件运行的时候会报如下错误

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [E:\JAVA\eclipse2017workplace\vcgo-manager\vcgo-manager-service\target\classes\spring\applicationContext-dao.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [mybatis/SqlMapConfig.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [mybatis/SqlMapConfig.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:434)
	at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:340)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
	... 21 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:109)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:92)
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:428)
	... 24 more
Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
	at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:103)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.pluginElement(XMLConfigBuilder.java:142)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:100)
	... 26 more
Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
	at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:117)
	at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:130)
	at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:101)
	... 28 more
Caused by: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
	at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:190)
	at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89)
	at org.apache.ibatis.io.Resources.classForName(Resources.java:256)
	at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:113)
	... 30 more

求助,找不到原因啊

关于SQL SERVER左关联丢失on及关联条件的问题

数据库:SQLSERVER2008
Pagehelper版本:4和5
SQL:select a.id from table1 a with(nolock) left join table2 b with(nolock) on a.id = b.rid where a.name = 'xxx'
执行问题:
执行SQL会解析成:select count(0) from table1 a with(nolock) left join table2 b with(nolock) where a.name = 'xxx'
报错信息:where附近语法错误
补充,解析后的SQL中丢失了on 及后面的关联条件

请问如何解决该bug,谢谢!万分感谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.