springboot整合mybatis

目录

1.简介

2.基于全注解的MyBatis快速入门

 3.基于配置文件的mybatis快速入门

4.简易的增删改方法

5.根据条件id查询

 6.关于*.xml里面的占位符"#{}"和"${}"

 7.@Param参数注解(指定参数名)

8.动态sql

if标签

where标签

 set标签

9.foreach标签

1.批量删除

2.批量添加

 10.高级查询(多表查询)

一.多对一

 二.一对多

1.简介

啥子是mybatis?

  • 一款优秀的持久层框架,用于简化JDBC开发

持久层:负责将数据保存到数据库的那一层代码

啥子又是持久层?

在javaEE的开发中,几乎都是基于B/S架构开发.B/S架构包括:表现层,业务层(service),持久层(dao)

2.基于全注解的MyBatis快速入门

  MyBatis中文网

 1.导入相关的依赖

 2.建表

3.编写application.yml配置文件,删除原来的property文件

包含连接数据的核心信息

 4.编写实体类(pojo包下),属性和表中字段一一对应

 5.创建接口(mapper包下),用来写方法

 6.测试

可以先测试是否链接成功,不报错就是成功!

 

打印成功啦! 

 3.基于配置文件的mybatis快速入门

1-4步和全注解开发一样的,不说了.

5.创建接口(mapper)写方法

 6.配置application.yml文件

 7.配置核心文件

每一个实体类对应一个mapper映射文件,在resources资源包下创建mapper文件里面创建sql的映射文件.Mapper.xml

在核心xml文件里配置请求头

<?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">

8.测试一下

 

 文件结构

4.简易的增删改方法

1.在接口定义增删改的方法

 2.在xml配置文件编sql语句

 <insert id="add" >
        insert into t_user values (#{id},#{username},#{password})
    </insert>

 <update id="update">
        update t_user set password=#{password},username=#{username} where id=#{id}
 </update>

 <delete id="delete">
        delete from t_user where id=#{id}
 </delete>

3.测试执行代码

    @Test
    void add(){
        User user = new User(2,"法外狂徒","李四");
        int add = userXmlMapper.add(user);
        System.out.println(add>0?"插入成功":"");
    }

    @Test
    void Update(){
        User user = new User(2, "张三", "法外狂徒");
        int updata = userXmlMapper.update(user);
        System.out.println(updata>0?"更新成功":"");
    }

    @Test
    void delete(){
        int delete = userXmlMapper.delete(2);
        System.out.println(delete>0?"删除成功":"");
    }

5.根据条件id查询

    /*
    * 查询id=2的数据
    * */
    List<User> selectId(int id);
    <select id="selectId" resultType="com.zkwf.mybatis.pojo.User">
        select * from t_user where id=#{id}
    </select>
   @Test
    void selectId(){
        List<User> users = userXmlMapper.selectId(2);
        System.out.println(users);
    }

 6.关于*.xml里面的占位符"#{}"和"${}"

1、#{}占位符是为了获取值,通常在where语句后。

2、若在Sql代码中语句为select * from users where id=#{id},执行后自动翻译为select * from users where id=?。这就相当于JDBC中的PreparedStatement预编译阶段,可以有效的防止Sql注入。

3、#{}里如何写,看parameterType参数的类型。如果parameterType的类型是简单类型(8种基本(封装)+String),则#{}里随便写;如果是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写。

4、${}字符串用于拼接或字符串替换。一般用于模糊查询中,建议少用,因为有Sql注入的风险。同样分两种情况:如果parameterType的类型是简单类型,则${}里随便写,但是分版本,如果是3.5.1及以下的版本,只能写value;如果是实体类的类型,则${}里只能是类中成员变量的名称(现在已经少用)。

 7.@Param参数注解(指定参数名)

可增强代码的可读性

   /*
    * 使用@Param注解增强可读性
    * */
    List<User> selectParam(@Param("zhanghu") String username);
<select id="selectParam" resultType="com.zkwf.mybatis.pojo.User">
        select * from t_user where username=#{zhanghu}
    </select>
    @Test
    void selectParam(){
        List<User> s = userXmlMapper.selectParam("郭靖");
        s.forEach(System.out::println);
    }

8.动态sql

什么是动态sql?

sql语句的内容是变化的,可以根据条件获取不同的sql语句.

如何实现?

动态sql的实现利用的是mybatis提供的标签实现的.

使用场景?

例如:我在使用淘宝进行商品筛选时,我选择了价格区间,选择了牌子,选择了颜色等等进行筛选时,静态sql查询不出来的,使用动态sql就可以很轻松的解决这个问题.

if标签

1.if标签里的test属性是必须有的

2.test属性里面的值是false或者true,if是false就不拼接是true就拼接

3.如果使用@Param注解指定的参数名,test里面出现就是自己指定的参数名

4.如果没有使用@Param那么就是实体类的属性名

5.连接的最前面使用1=1,防止第一个条件不存在出现sql语句错误

select * from t-user and id=?这种情况  很明显这里不能有and

 /*
    * 多条件动态sql查询
    * */
    List<User> selectIf(@Param("ID") Integer id,@Param("USERNAME") String username,@Param("PASSWORD") String password);
  <select id="selectIf" resultType="com.zkwf.mybatis.pojo.User">
        select * from t_user where
        1=1
        <if test="ID!=null and ID!=''">
            and id=#{ID}
        </if>
        <if test="USERNAME!=null and USERNAME!=''">
            and username=#{USERNAME}
        </if>
        <if test="PASSWORD!=null and PASSWORD=''">
            and password=#{PASSWORD}
        </if>
    </select>
 @Test
    void selectIf(){
        List<User> users = userXmlMapper.selectIf(1, "令狐冲", null);
        users.forEach(System.out::println);
    }

where标签

上面的代码还有一种情况就是所有的条件都不存在,那么where标签会保证不会出现where子句.

 

 测试一下

 set标签

主要使用在update语句中,用于生成set关键字,同时去掉最后的多余的","

如果提交的数据为空则不更新.

9.foreach标签

foreach标签的属性:

  1. collection:指定数组或者集合

  2. item:代表数组或集合中的元素

  3. separator:循环之间的分隔符

  4. open:在标签先添加的符号

  5. close:在标签后添加的符号

1.批量删除

   /*
    * 批量删除
    * */
    int delectBatch(@Param("ids") int[] id );
   <delete id="delectBatch" >
        delete from t_user where id in
        <foreach collection="ids" item="aaa" separator="," open="(" close=")">
        #{aaa}
        </foreach>
    </delete>
   @Test
    void delectBatch(){
        int[] ids={3,4};
        int i = userXmlMapper.delectBatch(ids);
        System.out.println(i>0?"删除成功":"删除失败");
    }

2.批量添加

    /*
    * 批量插入,集合实现
    * */
    int addBatch(@Param("users") List<User> user);
    <insert id="addBatch">
        insert into t_user values
        <foreach collection="users" item="user" separator=",">
            (#{user.id},#{user.username},#{user.password})
        </foreach>
    </insert>

 10.高级查询(多表查询)

一.多对一

建立学生表和班级表,一个班级有多个学生

首先建立如下表结构:

 建立对应的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {  //Student是多的一方
    private Integer sid;
    private String sname;
    private  Class aClass;//aClass是一的一方
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
//教室类
public class Class {
    private String cid;
    private String cname;
}

 新建一个mapper接口,写方法


@Mapper
public interface StudentXmlMapper {

    /*
     * 根据id获取学生的所有信息,包括关联的信息
     * */
    Student selectById(Integer sid);
}

 编写xml文件

 

 二.一对多

 一对多的实现一般是在一的一方添加List集合属性.

在实体类Class上添加List<Student> xxx属性.

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
//教室类
public class Class {
    private String cid;
    private String cname;
    private List<Student> studentList;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {  //Student是多的一方
    private Integer sid;
    private String sname;
    private  Class aClass;//aClass是一的一方
}
  /*
    * 一对多,获取1001班的所有学生信息
    * */
    Class selectByClassId(String cid);

 

 测试一哈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值