MyBatis

文章目录

框架

概念

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

生活中的框架

- 可以称之为模板的东西

框架

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

架 : 架子

主流框架

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
输入法 简繁操作 先取消
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值