文章目录
框架
概念
是一个提供了可重用的公共结构的半成品
生活中的框架
- 可以称之为模板的东西
框架
框 : 限制 (比着字帖写字)
架 : 架子
主流框架
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 default |
where | 简化条件判断 |
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
输入法 简繁操作 先取消