MyBatis

mac2024-05-22  35

文章目录

框架概念生活中的框架主流框架Struts2 (前端和java)hibernate (java 和 数据库)SpringSpringMVCMyBatis MyBatis数据持久化ORM 搭建Mybatis环境新建Maven 普通java项目引入Mybaits 依赖包创建Mybatis核心配置文件新建映射关系类新建用户配置文件把用户配置文件 添加到核心配置文件中测试 Mybatis 的 优缺点优点代码量的优化轻量级, 简单易学灵活支持 ORM 关系映射 缺点工作量大可移植性差 使用场景 Mybatis 核心三要素核心接口和类SqlSessionFactory特性sqlSession获取方式方法 使用配置文件的方式执行sql使用面向接口的方式执行sql 核心配置文件propertiessettings配置别名mappers SQL 映射配置文件根据用户名 模糊查询用户数据占位符 #{} / ${}parameterType 参数类型根据用户编号查询唯一用户多条件查询使用类封装参数使用Map封装参数@Param 传递参数 resultType解决方案1解决方案2下划线转驼峰 resultMapresultMap的高级用法简单查询操作复杂查询- 1添加 Role 属性mapper 接口方法配置文件 使用第二种方式完成 一对一映射简写sql 语句 复杂查询2 resultMap 自动映射级别 增删改操作新增修改操作修改条目较少的操作删除操作 项目优化SqlSessionFactory只需加载一次日志输出功能案例1日志输出功能案例2整合Druid 连接池新建数据源类配置核心配置文件 动态SQLsql 片段改造多条件查询ifwhere if + trimif + set使用trim 替换 setforeach传参为 数组传参为List 集合 choose(when, otherwise) 主键返回策略分页查询功能对比之前的分页查询新建 pageBean 工具类条件查询总数据查询当前页数据 注意IDEA 快捷键

框架

概念

是一个提供了可重用的公共结构的半成品

生活中的框架

- 可以称之为模板的东西

框架

框 : 限制 (比着字帖写字)

架 : 架子

主流框架

Struts2 (前端和java)

hibernate (java 和 数据库)

(持久层框架)

Spring

SpringMVC

MyBatis

MyBatis

数据持久化

将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称 (把数据保存到数据库, 并且读取的过程)

ORM

对象/关系映射 是一种数据持久化技术. 是在对象模型和关系型数据库表之间建立起对应关系,并且提供一种机制,可以通过JavaBean 对象去操作数据库表中的数据.

搭建Mybatis环境

新建Maven 普通java项目

引入Mybaits 依赖包

1- org.mybatis 2- 驱动包 mysql-connector-java 3- druid

创建Mybatis核心配置文件

在Maven 项目 中 main目录下创建 resources 文件夹, 修改 文件属性 在该文件夹下创建 configuration.xml 核心配置文件 <?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> <!-- 可以准备多套环境 --> <environments default="development2"> <!-- 开发默认环境 --> <environment id="development1"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/emp" /> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> <environment id="development2"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/emp" /> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="dept.xml"></mapper> <mapper resource="emp.xml"></mapper> </mappers> </configuration>

新建映射关系类

emp 数据库 dept 表 新建一个 Dept 类与之对应

新建用户配置文件

<?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"> <!--namespace 命名空间 对sql的statement进行分类的,我们调用这里面sql 语句的时候会使用 在进行接口式编程时这里是对应接口的全限定名称 如<mapper namespace="com.qianfeng.mybatis.mapper.UserMapper"> --> <mapper namespace="dept"> <!-- 查询dept 表的 总数据条数 --> <select id="selectCount" resultType="int"> SELECT count(1) FROM dept </select> </mapper>

把用户配置文件 添加到核心配置文件中

<mappers> <mapper resource="dept.xml"></mapper> </mappers>

测试

public static void main( String[] args ) throws IOException { /* 使用 Mybatis 查询数据库内容 */ // 获取核心配置文件流 InputStream is = Resources.getResourceAsStream("configuration.xml"); // 根据配置文件 创建sqlsession工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); // 使用工厂 打开一个 sqlsession SqlSession sqlSession = factory.openSession(); // (使用结果集) int count = sqlSession.selectOne("dept.selectCount"); // sqlsession执行 sql 语句 List<Dept> list = sqlSession.selectList("dept.selectDepts"); System.out.println(list); sqlSession.close(); }

Mybatis 的 优缺点

优点

代码量的优化

轻量级, 简单易学

灵活

1- sql 语句 和 代码分离, 降低耦合度 java代码 需要先经过编译,再执行. 如果sql 语句需要经常变动,java 代码需要经过反复的编译 分离的好处, java代码可以重用, 只需要更改xml 配置文件中的sql 语句 2- 可重用,便于统一管理和优化

支持 ORM 关系映射

缺点

工作量大

SQL 语句 需要开发人员手动编写

可移植性差

手动编写 sql 语句, 开发人员一般会根据当前数据库进行SQL语句编写 如果更换基础数据库,不兼容的SQL 语句需要重新编写

使用场景

1- 性能要求较高 (自定义SQL 可以根据项目需求,优化数据库性能) 2- 需求变化较多 (可随时更改 sql 语句, 以适应新的需求变化) (互联网项目)

Mybatis 核心三要素

核心接口和类

1- SqlSessionFactoryBuilder > build() 2- SqlSessionFactory > openSession() 3- SqlSession

SqlSessionFactory特性

最好只需要创建一次

sqlSession

获取方式

SqlSessionFactory.opensession(传递参数 true or false)

true 自动提交事务

false 取消自动提交事务

(默认值为 false )

方法

selectOne();

selectList();

update()

测试删除命令 在执行增删改操作的时候, 需要用户管理提交操作. 1- opensession(true); 2- sqlSession.commit();

使用配置文件的方式执行sql

以上方式 为java 直接操作xml 中的id属性

使用面向接口的方式执行sql

1- 新建一个接口 和xml 做映射关系 满足四个条件 1- xml 文件的命名空间需要和 接口的全路径一致 2- xml sql语句的id 需要和 接口的方法名保持一致 3- 参数类型一致 4- 返回值一致

核心配置文件

properties

创建db.properties

driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/smbms user=root password=123456

核心配置文件中引入该文件

<properties resource="db.properties"></properties>

引入之后可以使用表达式获取资源

<environment id="development1"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}" /> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment>

settings

<settings> <!-- 缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 设置全局懒加载 (懒汉和饿汉) --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 打印日志 --> <setting name="logImpl" value="LOG4J"/> <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> <!-- 自动映射级别 NONE 禁止自动映射 PARTIAL 自动匹配所有属性 内部嵌套除外 , association collection 除外 FULL 自动匹配所有 三个选项 为 AutoMappingBehavior 枚举类型 必须大写 --> <setting name="autoMappingBehavior" value="FULL"/> </settings>

配置别名

<typeAliases> <!--可以在 映射文件中 任何出现cn.bdqn.pojo.Provider 的地方都可以使用 别名来代替 --> <typeAlias type="cn.bdqn.pojo.Provider" alias="provider" /> </typeAliases> <!-- 给该包 中的所有类 统一起别名 , 别名即类名 不区分大小写 --> <package name="cn.bdqn.pojo"/>

mappers

可以写 resource 指向的是 xml 配置文件

可以写 class 指向的是 接口的路径

因为不能够根据 接口找到配置文件 要求 , 配置文件和接口都在同一路径下, 并且名称保持一致

使用Maven 饿方式打包 java 文件的时候, 不会吧配置文件一起打包,

两种方式解决问题

1- 在resources 中 新建和java类同路径的文件夹

2- 在 配置文件中配置 把配置文件一起打包

SQL 映射配置文件

根据用户名 模糊查询用户数据

1- 在接口中书写一个方法

/** * 根据用户名 模糊查询用户数据 */ List<User> selectByName(String name);

2- 在配置文件中书写对应的sql

<select id="selectByName" resultType="user" parameterType="string"> SELECT * FROM smbms_user WHERE username LIKE concat('%',#{name},'%') </select>

占位符 #{} / ${}

#{} 相当于 JDBC 中 的 ? 号 占位符 (安全,高效,防止sql注入)

${} 相当于 JDBC 中 的 字符串拼接传参

parameterType 参数类型

string int 自定义类 map

根据用户编号查询唯一用户

1- 接口方法

/** * 根据用户编号查询唯一用户 */ User selectById(int id);

2- 映射文件

<select id="selectById" resultType="user" parameterType="int"> SELECT * FROM smbms_user WHERE id = #{id} </select>

多条件查询

单条件查询, 使用一个参数, 多条件查询, 需要使用多个参数, 若干一个方法传递多个参数,

使用类或者map 封装多个参数

使用类封装参数

配置文件的传参 #{需要和类的成员变量保持一致 }

1- 接口代码

/** * 多条件查询, 根据用户的姓名(模糊查询)和 用户角色 */ List<User> selectByCondition(User user);

2- 配置文件

<select id="selectByCondition" resultType="user" parameterType="user"> SELECT * FROM smbms_user WHERE username LIKE concat('%',#{userName},'%') AND userRole =#{userRole} </select>

使用Map封装参数

配置文件的传参 #{需要和map 的 键 保持一致 }

1- 接口

/** * 多条件查询, 根据用户的姓名(模糊查询)和 用户角色 */ List<User> selectByConditionMap(Map map);

2- 映射文件

<select id="selectByConditionMap" resultType="user" parameterType="map"> SELECT * FROM smbms_user WHERE username LIKE concat('%',#{abc},'%') AND userRole =#{userRole} </select>

@Param 传递参数

resultType

问题:数据库的字段和 java 类中的属性 名称不一致的时候, 自动映射失败

解决方案1

给数据库字段起别名 SELECT t_name tName , t_value tValue FROM test

解决方案2

使用 resultMap

<!-- 定义映射结果集的匹配 --> <resultMap id="abc" type="Test"> <result column="t_name" property="tName"></result> <result column="t_value" property="tValue"></result> </resultMap> <!-- 查询所有 --> select id="selectAll" resultMap="abc"> SELECT t_name , t_value FROM test /select>

下划线转驼峰

数据库不区分大小写, 数据库中, 一个字段如果由多个单词组成, 使用下划线连接,

MyBatis 有一种配置可以直接完成 数据库字段下划线 转换成java类驼峰命名的策略

<!-- 是否开启自动驼峰命名规则(camel case)映射,即从数据库列名 A_COLUMN 到属性名 aColumn 的类似映射 需要注意的是 当resultTpye=map时,该配置无效 --> <setting name="mapUnderscoreToCamelCase" value="true"/>

resultMap

<resultMap id="abc" type="Test"> <result column="t_name" property="tName"></result> <result column="t_value" property="tValue"></result> </resultMap>

属性

​ id 当前 resultMap 唯一编号

​ type 当前 resultMap 最终需要转换成为的java类

子标签

​ id 表示当前表的主键

​ result 表示当前表的非主键

result

​ column 数据库表的字段名

​ property 要转换成为的类的 属性名

​ javaType 要转换成为的类的 属性数据类型

resultMap的高级用法

简单查询操作

查询 所有角色信息

复杂查询- 1

查询 所有用户信息, 并列出该用户的角色 ( 一用户只能拥有一种角色)(一对一)

添加 Role 属性

查询语句的返回结果集, 超出了 User类的 范围, 1- 需要在User 类中添加 Role 的类型属性, 用于保存所有用户角色信息

mapper 接口方法

/** * 查询用户和其角色信息 */ List<User> selectAllWithRole();

配置文件

<resultMap id="abc" type="User"> <!--自动映射--> <id column="id" property="id"/> <result column="userCode" property="userCode"/> <!--一对一关系的映射 如何把用户的角色信息添加到 User类中的Role 属性中--> <association property="role" javaType="Role"> <id column="id" property="id"/> <result column="roleName" property="roleName"/> </association> </resultMap> <!-- 返回值类型 --> <select id="selectAllWithRole" resultMap="abc"> SELECT u.*,r.* FROM smbms_user u JOIN smbms_role r ON u.userRole = r.id </select>

使用第二种方式完成 一对一映射

用户和角色之间的关系 每一个用户 对应一个角色, 根据用户表的 userRole 和 角色的Id

简写sql 语句

<resultMap id="abc" type="User"> <association property="role" javaType="Role" column="userRole" select="cn.bdqn.mapper.RoleMapper.selectById"> </association> </resultMap> <!-- 返回值类型 --> <select id="selectAllWithRole" resultMap="abc"> select * from smbms_user </select>

因为 user 和 role 表 通过 角色id 联系起来的

需要在角色表中添加一个方法, 通过id 查询角色信息的方法 <mapper namespace="cn.bdqn.mapper.RoleMapper"> <!-- 根据 角色 ID 查询角色信息 --> <select id="selectById" parameterType="int" resultType="role"> select * FROM smbms_role where id = #{id} </select>

复杂查询2

查询某角色 , 列出该角色 下的所有用户

resultMap 自动映射级别

<!-- 默认值 PARTIAL 自动匹配 可以修改为 NONE 取消自动匹配 FULL 级别最高 --> <setting name="autoMappingBehavior" value="PARTIAL"/>

如果resultMap 中 嵌套了 association 或者 collection ,不会全部自动映射

需要重新设置映射级别 <setting name="autoMappingBehavior" value="FULL"/>

增删改操作

新增

1- 接口方法

/** * 新增方法 可以返回值为 boolean 或者 int */ boolean insert(User user);

2- 映射文件

<insert id="insert" parameterType="user"> insert into smbms_user (username,gender,birthday) values (#{userName},#{gender},#{birthday}) </insert>

3- 测试类

@Test public void insertTest(){ SqlSessionFactory factory = MyBatisUtil.getFactory(); SqlSession session = factory.openSession(true); // 给予接口的代理类 mapper 实际上是 MyBatis 生成的一个UserMapper 的子类 UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(); user.setUserName("李四"); user.setGender(2); user.setBirthday(new Date()); // new Timestamp(new Date().getTime()); System.out.println( mapper.insert(user)); session.close(); }

修改操作

1- 接口

/** * 修改操作 */ boolean update(User user);

2- 映射文件

<update id="update" parameterType="user"> update smbms_user set username=#{userName}, gender=#{gender},birthday=#{birthday} where id=#{id} </update>

3- 测试类

@Test public void uopdateTest(){ SqlSessionFactory factory = MyBatisUtil.getFactory(); SqlSession session = factory.openSession(true); // 给予接口的代理类 mapper 实际上是 MyBatis 生成的一个UserMapper 的子类 UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(); user.setUserName("张三丰"); user.setBirthday(new Date()); user.setId(18); // new Timestamp(new Date().getTime()); System.out.println( mapper.update(user)); session.close(); }

修改条目较少的操作

修改密码操作 , 只需要两个字段 谁要修改(id), 修改成什么(新密码)

1- 接口

/** * 修改密码操作 */ // boolean updatePwd(int id,String pwd); boolean updatePwd(@Param("id") int wwww, @Param("pwd") String aaaaa);

2- 映射文件

<update id="updatePwd" > update smbms_user set userPassword=#{pwd} where id=#{id} </update>

3- 测试类

@Test public void uopdatePwdTest(){ SqlSessionFactory factory = MyBatisUtil.getFactory(); SqlSession session = factory.openSession(true); // 给予接口的代理类 mapper 实际上是 MyBatis 生成的一个UserMapper 的子类 UserMapper mapper = session.getMapper(UserMapper.class); System.out.println( mapper.updatePwd(18,"123456")); session.close(); }

删除操作

项目优化

SqlSessionFactory只需加载一次

public class MyBatisUtil { private static SqlSessionFactory factory; // 静态代码块保证代码程序只运行一次 static{ /* 使用 Mybatis 查询数据库内容 */ // 获取核心配置文件流 InputStream is = null; try { is = Resources.getResourceAsStream("configuration.xml"); // 根据配置文件 创建sqlsession工厂 factory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } public static SqlSessionFactory getFactory(){ return factory; } }

日志输出功能案例1

1- 核心配置文件中添加配置

<!-- 打印日志 --> <setting name="logImpl" value="LOG4J"/>

2- 导入jar包

<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>

3- 创建日志配置文件

log4j.rootLogger=debug,CONSOLE,file #log4j.rootLogger=ERROR,ROLLING_FILE log4j.logger.cn.itrip=debug log4j.logger.org.apache.ibatis=debug log4j.logger.org.mybatis.spring=debug log4j.logger.java.sql.Connection=debug log4j.logger.java.sql.Statement=debug log4j.logger.java.sql.PreparedStatement=debug log4j.logger.java.sql.ResultSet=debug # log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=debug log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout # log4j.appender.CONSOLE.layout.ConversionPattern= - (%r ms) - [%p] %d %c - %m%n

日志输出功能案例2

单独使用MyBatis (1)在mybatis.xml配置文件中添加如下配置

<setting name="logImpl" value="STDOUT_LOGGING" />

(2)使用slf4j输出

因此要先添加slf4j的依赖

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.6</version> </dependency>

log4j配置文件:

log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG

整合Druid 连接池

新建数据源类

public class DuridDataSourceFactory extends UnpooledDataSourceFactory { public DuridDataSourceFactory() { dataSource = new DruidDataSource(); } }

配置核心配置文件

<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="org.lian.datasource.DuridDataSourceFactory"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="initialSize" value="1"/> <property name="maxActive" value="20" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> </dataSource> </environment> </environments>

动态SQL

语法元素说明if简单条件判断choose(when,otherwise)相当于java中的 switch case defaultwhere简化条件判断set解决更新语法问题(update)trim灵活去除 多余关键字foreach循环迭代

sql 片段

查询语句中 * 尽量少出现, 每一个* 号 的位置, 当前表的所有字段 id,userCode,userName,userPassword,gender 实际开发中 表中的字段, 非常多, 需要把 sql 语句中 通用的内容 提取到外部 sql 片段

语法

<sql id="basecolumn" > id,userCode,userName,gender </sql>

引入sql 片段

select <include refid="basecolumn"/> , 字段 from 表名

改造多条件查询

<select id="selectByConditionMap" resultType="user" parameterType="map"> SELECT * FROM smbms_user <where> <if test="abc != null and abc != ''"> username LIKE concat('%',#{abc},'%') </if> <if test="userRole != null and userRole != ''"> AND userRole =#{userRole} </if> </where> </select>

if

判断所传字段是否为null 或 空字符串

where

条件存在, 自动添加 where 自动去除第一个 and

if + trim

java 字符串常用类 javascript (去除前后空格)

trim

自动识别标签内是否有返回值 , 可以再自己包含的内容上添加某些前缀,和某些后缀 (prefix, suffix) 也可以删除某些指定的某些前缀和后缀 (prefixOverrides,suffixOverrides)

改造 多条件查询

<select id="selectByConditionMap" resultType="user" parameterType="map"> SELECT * FROM smbms_user <trim prefix="where" prefixOverrides="and|or"> <if test="abc != null and abc != ''"> username LIKE concat('%',#{abc},'%') </if> <if test="userRole != null and userRole != ''"> AND userRole =#{userRole} </if> </trim> </select>

if + set

更新操作

如果用户没有传递新值, 表示想把那些没有传入的值变为null吗?

用户只需要传递自己需要改变的数据, 那些没传的, 不需要改变的

set 标签 1- 自动添加 set 关键字 2- 可以去除最后出现的 逗号

<update id="update" parameterType="user"> update smbms_user <set> <if test="userName != null and userName != ''"> username=#{userName},</if> <if test="gender != null and gender != ''">gender=#{gender},</if> <if test="birthday != null and birthday != ''"> birthday=#{birthday}</if> </set> where id=#{id} </update>

使用trim 替换 set

<update id="update" parameterType="user"> update smbms_user <trim prefix="set" suffixOverrides=","> <if test="userName != null and userName != ''"> username=#{userName},</if> <if test="gender != null and gender != ''">gender=#{gender},</if> <if test="birthday != null and birthday != ''"> birthday=#{birthday}</if> </trim> where id=#{id}

foreach

传参为 数组

删除功能(一次删除多条数据) <!-- 把用户传递的 数组{1,2,3,4,5} 组装成为 (1,2,3,4,5) --> <delete id="deleteByIds"> delete from smbms_user where id in ( <foreach collection="array" item="i" separator=","> #{i} </foreach> ) </delete>

其他方式

<delete id="deleteByIds"> delete from smbms_user where id in <foreach collection="array" item="i" separator="," open="(" close=")"> #{i} </foreach> </delete>

传参为List 集合

一次添加多条记录

接口

映射文件

<!-- 把list集合 转换位 ('zhangsan',2),('lisi',2) --> <insert id="insertBatch"> insert into smbms_user (userName,gender) values <foreach collection="list" item="user" separator=","> ( #{user.userName},#{user.gender}) </foreach> </insert>

choose(when, otherwise)

- 淘宝商品搜索排序功能 虽然有很多排序类型, 但是一般一次只能使用一种排序 order by <choose> <when 销量 != null and 销量 != ''> 销量 </when> <when 价格 != null and 价格 != ''> 价格 </when> <otherwise> 综合排序 </otherwise> </choose>

主键返回策略

当插入某条数据的时候, 自动生成的主键 , 可以返回到 对象中 <insert id="insertEmp" parameterType="emp"> <selectKey keyColumn="empno" keyProperty="empno" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO emp (ename,job) VALUES (#{ename},#{job}) </insert>

分页查询功能

对比之前的分页查询

1- 获取总记录数 2- 获取当前页的数据条目 增加条件查询功能的分页 1- 获取满足条件的 总记录数 2- 获取满足条件的 当前页数据条目

新建 pageBean 工具类

public class PageBean<T> { private int recordCount; private int totalPage; private int pageSize; private int pageIndex; private List<T> list; // 存储条件的 private T t;

条件查询总数据

1- mapper

/** * 分页查询功能- 查询总条数 */ int getRecordCount(User user); 映射文件 <select id="getRecordCount" parameterType="user" resultType="int"> SELECT count(1) FROM smbms_user <where> <if test="userName != null and userName != ''"> and userName LIKE "%"#{userName}"%" </if> <if test="userRole != null and userRole != ''"> and userRole = #{userRole} </if> </where> </select>

查询当前页数据

mapper /** * 分页查询功能 - 查询当前页数据 */ List<User> getUsersByPage(PageBean<User> pageBean); 映射文件 <!-- 表达式占位符 不支持做运算 功能 (pageIndex-1)*pageSize 参数绑定<bind name="变量" value="表达式"></bind> --> <select id="getUsersByPage" resultType="user" parameterType="cn.bdqn.util.PageBean"> <bind name="start" value="(pageIndex-1)*pageSize"></bind> SELECT * FROM smbms_user <where> <if test="t.userName != null and t.userName != ''"> and userName LIKE "%"#{t.userName}"%" </if> <if test="t.userRole != null and t.userRole != ''"> and userRole = #{t.userRole} </if> </where> limit #{start} , #{pageSize} </select>

注意点

1- 参数类型为 Pagebean , user对象中的属性不是直接存放在PageBean 中的 传参时 需要使用 t.userName 2- 当前页 数据 如何转换为起始查询位置, #{} 不支持 表达式运算, <bind> 标签绑定参数

注意

IDEA 快捷键

页面内查找

Ctrl + F

全局查找

Ctrl + Shift + F 输入法 简繁操作 先取消
最新回复(0)