使用mybatis进行动态sql语句的步骤

 

目录

前言:

1.准备工作:

2. 创建实体类:

3.创建相对应的xml文件

4. 通过mybatis操作数据库

总结


前言:

        MyBatis是一款用于持久层的、轻量级的半自动化ORM框架,封装了所有JDBC操作以及设置查询参数和获取结果集的操作,支持自定义SQL、存储过程和高级映射。它通过XML或注解方式配置SQL语句,并支持动态SQL,用条件判断进行查询可以实现SQL复用。MyBatis的优势在于减少了50%以上的代码量,是最简单的持久化框架,小巧并且简单易学。与JDBC相比,MyBatis通过参数映射方式可以将参数灵活地配置在SQL语句中的配置文件中,避免在Java类中配置参数。同时,MyBatis通过输出映射机制将结果集的检索自动映射成相应的Java对象,避免对结果集手工检索。

1.准备工作:

首先是需要在pom.xml文件中添加:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

然后需要在mybatis-config.xml文件中添加如下内容,这个文件需要自己手动创建,然后把以下内容自己复制。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <!--加载properties文件-->
    <properties resource="db.properties"/>
    <!--配置类的别名-->
    <typeAliases>
        <package name="com.fs.entity"/>
    </typeAliases>
    <!--environments: 环境复数
      default: 默认使用那个环境,  environment的id值
    -->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.user}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>

    <!--加载sql映射文件-->
    <mappers>
       <mapper resource="UserMapper.xml"/>
        <mapper resource="OrderMapper.xml"/>
    </mappers>
</configuration>

 数据库配置文件和xml文件需要在同一目录,这里可以自己配置。

其中mappers中添加相对应的mapper.xml文件路径

2. 创建实体类:

接下来,需要创建对应的实体类和Mapper接口。例如,我们要操作一个User表,可以创建如下的实体类,这里我们使用的一个lombok插件中的注解,使用@data可以省略get/set方法

package com.fs.entity;

import lombok.Data;
import lombok.ToString;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Data
@ToString(callSuper=true) //调用父类toString()
public class User  extends  BaseEntity{
    private String username;
    private String password;
    private String sex;
    private Date brithday;
    private String address;

    /**关联属性: 订单的关联属性*/
    private List<Order> orders = new ArrayList<>();
}

创建相对应mapper接口

package com.fs.mapper;

import com.fs.entity.User;

public interface UserMapper {

    /**
     *  表关联查询
     * 根据用户id查询用户信息以及订单信息
     * @param uid 用户id
     * @return
     */
    User queryUserAndOrdersById(Integer uid);


    /**
     *  分多条sql
     * 根据用户id查询用户信息以及订单信息
     * @param uid 用户id
     * @return
     */
    User queryUserAndOrdersById2(Integer uid);
}

3.创建相对应的xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fs.mapper.UserMapper">

    <!--手动映射-->
    <resultMap id="userBaseMap" type="User">
         <!--User类映射-->
         <id column="id" property="id"/>
        <result column="name" property="username"/>
        <result column="password" property="password"/>
        <result column="sex" property="sex"/>
        <result column="brithday" property="brithday"/>
        <result column="address" property="address"/>
    </resultMap>

    <resultMap id="userOrderMap" type="User" extends="userBaseMap">
        <!--关联属性的映射
           集合的关联属性  collection标签来映射
           collection属性:
              property: 关联属性名
              javaType: 关联属性的数据类型 不写
              ofType: 集合关联属性的元素的类型, 映射那个对象 必须
         -->
        <collection property="orders" ofType="Order">
            <!--字段与关联属性对象的属性的映射-->
            <id property="id" column="oid"/>
            <result property="userId" column="userid"/>
            <result property="createtime" column="createtime"/>
            <result property="state" column="state"/>
            <!--配置它的关联属性-->
        </collection>


    </resultMap>
    <select id="queryUserAndOrdersById" parameterType="int" resultMap="userOrderMap">
        select  u.*, o.id oid ,o.userid,o.createtime ,o.state from tb_user u join tb_order o
        on u.id = o.userid
        where u.id = #{id}
    </select>

    <resultMap id="userOrderMap2" type="User" extends="userBaseMap">
        <!--
          select: 查询关联属性的statementId:   namespace+statementId
         -->
        <collection property="orders" ofType="Order" select="com.fs.mapper.OrderMapper.queryById"
        column="id"
        ></collection>
    </resultMap>
    <select id="queryUserAndOrdersById2" parameterType="int" resultMap="userOrderMap2">
        select * from tb_user u where u.id = #{id}
    </select>
</mapper>

其中,namespace表示对应的Mapper接口的全限定名,id表示对应的方法名称,resultType表示返回结果的类型,#{...}表示参数值。

4. 通过mybatis操作数据库

编写测试方法,进行测试

package com.fs.mapper;

import com.fs.entity.User;
import com.fs.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import static org.junit.Assert.*;

public class UserMapperTest {

    @Test
    public void queryUserAndOrdersById() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.queryUserAndOrdersById(4);
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    public void queryUserAndOrdersById2() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.queryUserAndOrdersById2(4);
        System.out.println(user);
        sqlSession.close();
    }
}

总结:

        本文介绍了如何使用MyBatis操作数据库,包括准备工作、创建实体类和Mapper接口、创建Mapper XML文件以及使用MyBatis操作数据库。同时,还介绍了一些高级特性,例如动态SQL、参数映射、结果集映射。总的来说,MyBatis是一种开源的持久层框架,它可以将SQL语句与JAVA代码分离,使得程序员可以更加专注于业务逻辑的编写。在实际使用中,需要根据具体的情况选择不同的映射方式,以满足不同场景下的需求。使用MyBatis操作数据库可以提高开发效率,降低代码耦合度,使得代码更加易于维护。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值