maven导包:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>
spring-mybatis.xml 中:
注册:
<bean id="defaultSqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="你的数据源配置"/>
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<property name="logImpl" value="org.apache.ibatis.logging.log4j.Log4jImpl"/>
<property name="aggressiveLazyLoading" value="false"/>
<property name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<property name="databaseId" value="mysql"/>
<property name="lazyLoadingEnabled" value="true"/>
<property name="lazyLoadTriggerMethods" value="equals,hashCode,toString,clone,toJSON"/>
<property name="localCacheScope" value="SESSION"/>
<property name="useGeneratedKeys" value="true"/>
</bean>
</property>
<!-- 指定mybatis的全局配置文件 -->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"/> -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=sqlserver
</value>
</property>
</bean>
</array>
</property>
<property name="mapperLocations" value="classpath*:mybatis-mappers/*Mapper.xml"/>
<!-- 设置包中类的别名 -->
<property name="typeAliasesPackage" value="com.keepbreath.entity"/>
</bean>
如此即可使用:在查询语句的上一行代码写上:PageHelper.startPage(pageNumber, pageSize)
-
- 增加
属性,使用时可以指定该属性(不指定的情况下,分页插件会自动判断),可选值为dialect
,oracle
,mysql
,mariadb
,sqlite
,hsqldb
,postgresql
,db2
,sqlserver
,informix
,h2
。sqlserver2012
- 增加
属性,默认值为offsetAsPageNum
,使用默认值时不需要增加该配置,需要设为false
时,需要配置该参数。当该参数设置为true
时,使用true
分页时,会将RowBounds
参数当成offset
使用,可以用页码和页面大小两个参数进行分页。pageNum
- 增加
属性,默认值为rowBoundsWithCount
,使用默认值时不需要增加该配置,需要设为false
时,需要配置该参数。当该参数设置为true
时,使用true
分页会进行count查询。RowBounds
- 增加
属性,默认值为pageSizeZero
,使用默认值时不需要增加该配置,需要设为false
时,需要配置该参数。当该参数设置为true
时,如果true
或者pageSize=0
就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是RowBounds.limit = 0
类型)。Page
- 增加
属性,默认值为reasonable
,使用默认值时不需要增加该配置,需要设为false
时,需要配置该参数。具体作用请看上面配置文件中的注释内容。true
- 为了支持
方法,增加了一个startPage(Object params)
参数来配置参数映射,用于从Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值。params
-
支持通过Mapper接口参数来传递分页参数,默认值supportMethodsArguments
,具体用法参考false
包下的com.github.pagehelper.test.basic
和ArgumentsMapTest
测试类。ArgumentsObjTest
-
用来支持直接返回returnPageInfo
类型,默认值PageInfo
,可选参数always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page(List)类型。用法和配置参考none
包下的com.github.pagehelper.test.basic
,特别要注意接口的返回值和xml中的PageInfoTest
类型。resultType
- 增加
属性,当使用动态数据源或没有设置closeConn
属性自动获取数据库类型时,会自动获取一个数据库连接,通过该属性来设置是否关闭获取的这个连接,默认dialect
关闭。true
- 增加
重要提示:
当
offsetAsPageNum=false
的时候,由于PageNum问题,
RowBounds
查询的时候reasonable会强制为false。使用
PageHelper.startPage
方法不受影响。
另外使用
RowBounds
在这种情况下返回的
Page
对象由于没有正确的
pageNum
属性,所以也不能使用
PageInfo
处理。
如果你不理解为什么,可以看这样一个例子:查询
offset=7,limit=10
,这个时候
pageNum=?
,这种情况没法计算
pageNum
,没法判断当前是第几页
实例编写
public interface UserInfoMapper extends Mapper<UserInfo> {
//其他必须手写的接口...
}
一旦继承了
Mapper<T>
,继承的
Mapper
就拥有了以下通用的方法:
//根据实体类不为null的字段进行查询,条件全部使用=号and条件
List<T> select(T record);
//根据实体类不为null的字段查询总数,条件全部使用=号and条件
int selectCount(T record);
//根据主键进行查询,必须保证结果唯一
//单个字段做主键时,可以直接写主键的值
//联合主键时,key可以是实体类,也可以是Map
T selectByPrimaryKey(Object key);
//插入一条数据
//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
//优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
int insert(T record);
//插入一条数据,只插入不为null的字段,不会影响有默认值的字段
//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
//优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
int insertSelective(T record);
//根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
int delete(T key);
//通过主键进行删除,这里最多只会删除一条数据
//单个字段做主键时,可以直接写主键的值
//联合主键时,key可以是实体类,也可以是Map
int deleteByPrimaryKey(Object key);
//根据主键进行更新,这里最多只会更新一条数据
//参数为实体类
int updateByPrimaryKey(T record);
//根据主键进行更新
//只会更新不是null的数据
int updateByPrimaryKeySelective(T record);
4. 泛型(实体类) <T>
的类型必须符合要求
<T>
实体类按照如下规则和数据库表进行转换,注解全部是JPA中的注解:
- 表名默认使用类名,驼峰转下划线,如
默认对应的表名为UserInfo
.user_info
- 表名可以使用
进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.@Table(name = "tableName")
- 字段默认和
一样,都会作为表字段,表字段默认为Java对象的@Column
名字驼峰转下划线形式.Field
- 可以使用
指定不符合第3条规则的字段名@Column(name = "fieldName")
- 使用
注解可以忽略字段,添加该注解的字段不会作为表字段使用.@Transient
- 建议一定是有一个
注解作为主键的字段,可以有多个@Id
注解的字段作为联合主键.@Id
- 默认情况下,实体类中如果不存在包含
注解的字段,所有的字段都会作为主键字段进行使用(这种效率极低).@Id
- 实体类可以继承使用,可以参考测试代码中的
类.com.github.abel533.model.UserLogin2
- 由于基本类型,如int作为实体类字段时会有默认值0,而且无法消除,所以实体类中建议不要使用基本类型.
除了上面提到的这些,Mapper还提供了序列(支持Oracle)、UUID(任意数据库,字段长度32)、主键自增(类似MySQL,Hsqldb)三种方式,其中序列和UUID可以配置多个,主键自增只能配置一个。
转载于:https://www.cnblogs.com/skyLogin/p/6598631.html