mybatis分页 动态sql,关联查询

  1. 常用标签的介绍
  1. mybatis配置文件的标签

Properties

     resource:  直接可以获取类路径 <properties resource=”jdbc.properties” />

     url:      指定文件所在位置的绝对路径

<properties url=”d:/a/b/jdbc.properties” />

使用properties配置时有两种方式

  方式一:

     <properties>

<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>

<property name="jdbc.url" value="jdbc:mysql://localhost:3306/test"/>

<property name="jdbc.username" value="root"/>

<property name="jdbc.password" value="root"/>

</properties>

  方式二:

<dataSource type="POOLED">

<property name="driver" value="${jdbc.driver}"/>

<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

</dataSource>

typeAliases

   <typeAliases>

<!-- 单个别名定义 -->

<typeAlias alias="user" type="com.tledu.zrz.pojo.User"/>

<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->

<package name="com.tledu.zrz.pojo"/>

<package name="其它包"/>

</typeAliases>

Mappers属性

Mappers使我们所说的映射器,用于通过mybatis配置文件去找到对应的mapper文件

有三种用法

Resources

使用相对于类路径的资源

如:<mapper resource="com/tledu/mjw/mapper/UserMapper.xml" />

class

使用 mapper 接口类路径

如:<mapper class="com.tledu.mjw.mapper.UserMapper"/>

注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

Package

注册指定包下的所有 mapper 接口

如:<package name="com.tledu.zrz.mapper"/>

注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

  1. Mapper.xml sql标签介绍

  取值属性:

  #{} 取值特点:会默认将获取值加单引号,可以防止sql注入

  String name = “tom”;

  Select * from t_user where name = #{name}

解析后:

  Select * from t_user where name = ‘tom’

  可以防止sql注入

  举例:

  Select * from user where account = ‘admin’ and password=’123’

                       account= ‘’’ or 1=1 #’  and password=’’;

  ${} 取值特点:直接将值取出不会加引号,可能会出现sql注入的风险

  select * from t_user order by id

   我们在操作表结构表中的字段的时候可以使用这种取值方式

  alter t_user add column sex

parameterType

作用:用来接收出入参数的类型

如果在mybatis中已经有注册的别名那么我们就可以直接使用

如下图

 

如果没有注册,那么我们一般写类型的全类名,获取我们自定义别名

resultType

作用:用来设置返回数据的数据类型

如果在mybatis中已经有注册的别名那么我们就可以直接使用

注意:

   实体类中的名称必须与表的字段名保持一致

resultMap

作用:如果在表中的字段与接收对象的属性名不一致时,可以通过定义resultMap来实现映射。

可以实现一次封装多次调用

  1. Junit单元测试

   作用:实现局部多个不同模块的快速测试

       第一步:导入junit 包

 

  

       第二部:直接在要测试的方法上加@Test注解

//Test方法执行前调用

@Before

public void before(){

    System.out.println("before");

}

//Test方法执行后调用

@After

public void after(){

    System.out.println("after");

}

//要测试运行的方法

@Test

public void test1(){

    System.out.println("test");

}
  1. 分页

   分页需要的参数:

   cpage:当前页

   PageSize: 分页单位

   totalPage:总页数

   totalCount:总条数

   start: 起始值= (cpage-1) * pageSize;

   核心sql:   limit start,pageSize;

   实现分页sql拼接需要两个参数,所以我们封装了一个Map集合,在遇到传入多个参数时要想到这种方式。在Map结合中的key值要一定与sql中取值的获取名保持一致

   Map map = new HashMap();

   map.put(“start”,start);

map.put(“pageSize”,pageSize);

   Select * from t_user limit #{start},#{pageSize}

  1. 模糊查询

   以前的查询:select * from t_user where username like “%a%”;

   select CONCAT('a','b','c');

   concat()函数就是用来拼接字符串的

   where username like “%a%” and sex=’男’ and age > 18

   当在where后面有多个条件的时候我们可以用and连接条件

   但如果where后面的第一个条件没有那么就没办法使用and

  

  1. 动态SQL

   if标签

    <if test=”name != null”>

       where name like concat(‘%’,#{name},’%’);

</if>

where标签

   <where>

    <if test=”name != null”>

       where name like concat(‘%’,#{name},’%’);

</if>

<if test=”name != null”>

       where name like concat(‘%’,#{name},’%’);

</if>

<where>

set标签

          <set>

                                 <if test="name != null">name=#{name},</if>

                                 <if test="price != null">price=#{price},</if>

                   </set>

trim标签

<trim prefix="WHERE" prefixOverrides="AND |OR ">

...

</trim>

<trim prefix="SET" suffixOverrides=",">

...

</trim>

choose、when、otherwise

<where>

   <choose>

       <when test="name != null">

           name like concat('%',#{name},'%')

       </when>

       <when test="price != null and price != 0">

           price > #{price}

       </when>

       <otherwise>

           id > 1

       </otherwise>

   </choose>

</where>

foreach标签

item集合中每一个元素进行迭代时的别名,

open该语句以什么开始,

separator在每次进行迭代之间以什么符号作为分隔 符,

close以什么结束,

<foreach collection="list" item="ii" open="(" close=")" separator="," >

    #{ii}

</foreach>

bind标签

<select id="listProductByName" parameterType="Product" resultType="Product">

    <bind name="likename" value="'%' + name + '%'" />

    select * from  t_product where name like #{likename}

</select>

  1. 关联查询

一对多:一个产品类型有多个产品信息

  1. 想到在一的一方Category 添加多的一方属性 List<Product> products
  2. 创建ResultMap标签,通过collection标签将多的一方进行封装
  3. 注意哪张表是主表哪张表信息是从表

   resultMap标签中的type属性表示主表的数据类型

   Collection标签中的 ofType属性表示从表也就是多数据的数据类型

<resultMap id="categoryBean" type="Category">

    <id column="cid" property="id"></id>

    <result column="cname" property="name"></result>

    <collection property="products" ofType="Product">

        <id column="pid" property="id"></id>

        <result column="pname" property="name"></result>

        <result column="price" property="price"></result>

    </collection>

</resultMap>

多对一:多个产品中每个产品对应了一个产品类型

  1. 在每个商品中添加对应的类型属性  Category category
  2. 创建ResultMp标签,通过association标签将对应的每个类型进行映射
  3. association标签中的 javaType 指定对应的映射类型 Category

<resultMap id="productBean" type="Product">

    <id column="pid" property="id"></id>

    <result column="pname" property="name"></result>

    <!--映射对应的类型-->

    <association property="category" javaType="Category">

        <id column="cid" property="id"></id>

        <result column="cname" property="name"></result>

    </association>

</resultMap>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis Plus多表关联查询分页的实现可以通过使用Mybatis Plus提供的Wrapper类来实现。以下是一个示例: ```java Page<User> page = new Page<>(1, 10); QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("role_id", roleId); wrapper.orderByDesc("create_time"); IPage<User> userPage = userMapper.selectPage(page, wrapper); List<User> userList = userPage.getRecords(); ``` 在以上示例中,我们使用了QueryWrapper来构建查询条件,其中eq表示等于,orderByDesc表示按照create_time字段进行降序排序。然后我们调用了Mybatis Plus提供的selectPage方法来进行分页查询,其中第一个参数是Page对象,表示查询的分页信息,第二个参数是Wrapper对象,表示查询的条件。最后我们可以通过getRecords方法获取查询结果。 在多表关联查询时,我们可以使用Mybatis Plus提供的LambdaQueryWrapper类来进行条件构造,例如: ```java LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.eq(User::getRoleId, roleId) .orderByDesc(User::getCreateTime); IPage<User> userPage = userMapper.selectPage(page, wrapper); ``` 以上示例使用了LambdaQueryWrapper来构造查询条件,其中eq表示等于,orderByDesc表示按照create_time字段进行降序排序。然后我们调用了Mybatis Plus提供的selectPage方法来进行分页查询,其中第一个参数是Page对象,表示查询的分页信息,第二个参数是Wrapper对象,表示查询的条件。最后我们可以通过getRecords方法获取查询结果。 需要注意的是,在多表关联查询时,我们需要使用Mybatis Plus提供的@TableName和@TableField注解来指定表名和字段名,以便Mybatis Plus能够正确地生成SQL语句。另外,在查询结果中,我们可以通过使用Mybatis Plus提供的@Result注解来指定实体类中的属性和查询结果中的字段的映射关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值