一篇帮你搞懂MyBatis的增删改查

目录

引入

1.Dao区域

2.entity区域(数据库的实体)

 3.Mapper.xml区域

4.SqlMapConfig.xml区域

详细介绍

Mapper.xml语法

查找全部

根据ID查找 

根据名字查找

分页

通过name和Id查找

查询数量

模糊查找

添加

删除

修改


 

引入

在这篇文章中“一篇帮你配置Mybatis-CSDN博客”,已经实现了MyBatis的配置,任何语言的使用都离不开底层算法“添加”、“修改”、“搜索”、“删除”。

接下来就着上次文章来介绍一下,Mybatis是怎么实现增删改查的。

实现增删改查主要应用这四部分的文件 

 

先简单介绍一下各个部分的作用。 

1.Dao区域

DAO(数据访问层)

  • 包含与数据库交互的接口和实现类。每个DAO接口对应一个数据库表或实体类,而实现类则提供了与数据库进行CRUD(创建、读取、更新、删除)操作的方法。
  • PersonDaoStudentDaoTeacherDaoUserDao是分别对应PersonStudentTeacherUser实体的Dao接口。
  • PersonDaoImplStudentDaoImplTeacherDaoImplUserDaoImpl是这些Dao接口的实现类,它们包含了与数据库交互的具体实现。

里面代码主要长这样(先看一眼,稍后详细介绍):

2.entity区域(数据库的实体)

实体类包(entity)

  • 包含所有实体类,这些类通常与数据库表结构相对应。
  • PersonStudentTeacherUser类代表了数据库中的四个表或四个不同类型的实体。

 3.Mapper.xml区域

资源包(resources)

  • 包含配置文件和映射文件。
  • mapper目录:包含Mybatis的映射文件,这些文件定义了实体类与数据库表之间的映射关系。
  • PersonMapper.xmlStudentMapper.xmlTeacherMapper.xml是Mybatis的映射文件,分别对应PersonStudentTeacher实体的映射关系。

 里面代码主要长这样(先看一眼,稍后详细介绍):

【简而言之,这里是存储那些数据库的sql查询语句的地方。】 

4.SqlMapConfig.xml区域

SqlMapConfig.xml:Mybatis的配置文件,用于配置数据源、事务管理器等。

这里承载着连接3.部分的Mapper.xml文件(如下)

详细介绍

这里是一份数据库数据,通过MyBatis对它进行增删改查处理:

首先,要有一份Teacher类对数据库表项进行映射,并具备基础的构建以及重写toString:

package com.qcby.entity;

public class Teacher {
    private Integer id;
    private String sex;
    private String name;
    private String phone;
    private String email;

    public Teacher(Integer id, String name, String sex, String phone, String email) {
        this.id = id;
        this.sex = sex;
        this.name = name;
        this.phone = phone;
        this.email = email;
    }

    public Teacher() {

    }

    public Teacher(String name, String sex, String phone, String email) {
        this.sex = sex;
        this.name = name;
        this.phone = phone;
        this.email = email;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", phone='" + phone + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

Mapper.xml语法

查找全部

 <select id="findAll" resultType="com.qcby.entity.User">
        select *from user;
 </select>

对应的Dao方法区域所编写:

List<Teacher> findAll();//注意:这里的“findAll”方法名,要和Mapper文件中id=“”中的名字相对应
//查出来的可能不止一条所以引入泛型存储查出来的Teacher对象们

对应Test测试编写: 

 @Test
    public void findAll(){
        List<Teacher> teachers = mapper.findAll();//创建承载对象的List来盛纳查找出来的对象
        for(Teacher teacher:teachers){
            System.out.println(teacher.toString());//遍历打印
        }

    }
  • <select>: 这是MyBatis中用于定义查询操作的标签。

  • id="findAll": 这是查询的唯一标识符。在MyBatis的Mapper接口中,你可以使用这个ID来引用这个查询。例如,如果你有一个名为UserMapper的接口,你可能会在其中定义一个名为findAll的方法,该方法将执行这个查询。

  • resultType="com.qcby.entity.User": 这指定了查询结果应该被映射到的Java类型。在这个例子中,结果将被映射到com.qcby.entity.User类的实例中。这意味着MyBatis将期望从数据库查询中返回的结果列与User类中的属性相匹配,并将它们相应地填充到User对象中。

  • select * from user; 这是实际的SQL查询语句。它从user表中检索所有列和所有行。

根据ID查找 

<!--  id后面跟着的是方法名字(UserDao接口相对应)  -->
    <!--  parameterType后面表示入参类型  -->
    <select id="findById" resultType="com.qcby.entity.User" parameterType="int">
        select *from user where id=#{id};
    </select>

 对应的Dao方法区域所编写:

Teacher findById(int id);
//因为id是主键只能查出来一条,即对应Teacher一个类,所以直接写Teacher就行,不用再用List<>承载
注意:()里面表示传参,和Mapper中的parameterType="int"相对应

对应Test测试编写:

@Test
    public void findById(){
        Teacher teacher=mapper.findById(2);//只能查出来一条,用一个Teacher对象就能承纳
        System.out.println(teacher.toString());
    }

 

  • <select>: 如前所述,这是MyBatis中用于定义查询操作的标签。

  • id="findById": 这是查询的唯一标识符,与UserDao(或UserMapper,取决于您的命名约定)接口中的方法名相对应。这意味着在UserDao接口中,您应该有一个名为findById的方法,它接受一个整数参数并返回一个User对象或User对象的列表(尽管在这个例子中,由于是根据ID查询,所以通常只返回一个User对象)。

  • resultType="com.qcby.entity.User": 这指定了查询结果应该被映射到的Java类型。MyBatis将期望从数据库查询中返回的结果列与User类中的属性相匹配,并将它们相应地填充到User对象中。

  • parameterType="int": 这指定了传入查询的参数类型。在这个例子中,参数是一个整数,表示要查询的用户的ID。

  • select * from user where id=#{id};: 这是实际的SQL查询语句。它从user表中检索所有列,但仅限于那些其id列值等于传入参数#{id}的行。#{id}是一个参数占位符,MyBatis会将其替换为实际传入的参数值。

根据名字查找

<!-- 通过名字查找 -->
    <select id="findByName" resultType="com.qcby.entity.User" parameterType="java.lang.String">
        select * from user where username=#{username};
    </select>

  对应的Dao方法区域所编写:

 List<Teacher> findByName(String name);
//不做过多赘述,和前面原理相同

 对应Test测试编写:

@Test
    public void findByName(){
        List<Teacher> teachers=mapper.findByName("老王");
        for(Teacher teacher:teachers){
            System.out.println(teacher.toString());
        }
    }

和上面解释大差不差,不再过多赘述。 

分页

 <!--   当数据量比较大,用分页查询-->
    <select id="findPage" resultType="com.qcby.entity.User" parameterType="int">
        select* from user limit #{pageSize} offset #{pageStart};
    </select>

   对应的Dao方法区域所编写:

List<Teacher> findPage(@Param("pageSize") int pageSize,@Param("pageStart") int pageStart);
//注意:pageSize和pageStart都不是Teacher类型中的一项(即不对应数据库的任意一项)
//所以在Dao区域()里面要用“@Param("name") name的类型 name”来获取

 对应的Test编写:

@Test
    public void findPage(){
        int pageSize=2;//和前端分页大差不差
        int pageIndex=1;
        int pageStart=pageSize*(pageIndex-1);
        List<Teacher> teachers=mapper.findPage(pageSize,pageStart);
        for(Teacher teacher:teachers){
            System.out.println(teacher.toString());
        }
    }

通过name和Id查找

<select id="findByNameAndId" resultType="com.qcby.entity.Teacher" parameterType="com.qcby.entity.Teacher">
        select * from teacher where name=#{name} and id=#{id};
    </select>

 【注意:当传参超过两个且类型相同时,那么在parameterType中只写一个就行;但是如果超过两个且类型不同,就要用上面那种方法parameterType="com.qcby.entity.Teacher"】

对应的Dao编写:

List<Teacher> findByNameAndId(Teacher teacher);
因为传参是Teacher类,所以这里也写入实例

对应Test编写:

@Test
    public void findByNameAndId(){
        Teacher teacher=new Teacher();
        //可以用set方法填入,也可以直接写在new Teacher()中--有构造方法
        teacher.setName("teacher10");
        teacher.setId(1);
        List<Teacher> teachers=mapper.findByNameAndId(teacher);
        for(Teacher t:teachers){
            System.out.println(t.toString());
        }
    }

查询数量

<!-- 查询数据  -->
    <select id="getCount" resultType="int">
        select count(*) from teacher;
    </select>

对应Dao编写:

int getCount();
返回是int类型的,所以用int,没有传参,所以括号里是空

对应Test编写:

 @Test
    public void getCount(){
        System.out.println(mapper.getCount());
    }

模糊查找

 <!-- 模糊查找-->
    <select id="findLike" resultType="com.qcby.entity.Teacher" parameterType="java.lang.String">
        select *from teacher where name like #{likename};
    </select>

对应Dao编写:

List<Teacher> findLike(@Param("likename") String likename);
//同样,异参要用@Param

Test编写:

 @Test
    public void findLike(){
        List<Teacher> teachers=mapper.findLike("%teacher%");
        for(Teacher teacher:teachers){
            System.out.println(teacher.toString());
        }
    }

添加

<!--  添加  -->
    <insert id="insert" parameterType="com.qcby.entity.Teacher">
        insert into teacher(sex,name,phone,email) value(#{sex},#{name},#{phone},#{email})
    </insert>

对应Dao编写;

int insert(Teacher teacher);
//删除,修改,添加的返回值都是int类型的,即对几行做了处理

Test:

 @Test
    public void Insert(){
        Teacher teacher=new Teacher("teacher11","女","124353","@3488");
        mapper.insert(teacher);
        session.commit();//事务提交
    }

删除

<!-- 删除   -->
    <delete id="delete" parameterType="int">
        delete from teacher where id=#{id};
    </delete>

Dao:

int delete(int id);

Test:

@Test
    public void Delete(){
        mapper.delete(5);
        session.commit();
    }

修改

 <!--  修改  -->
    <update id="update" parameterType="com.qcby.entity.Teacher">
        update teacher set sex=#{sex},name=#{name},phone=#{phone},email=#{email} where id=#{id};
    </update>

Dao:

int update(Teacher teacher);

Test:

@Test
    public void Update() {
        Teacher teacher = new Teacher(5,"teacher7","男","12445","@473f");
        mapper.update(teacher);
        session.commit();
    }

【注意:在删除、修改、添加的Test中都要添加“session.commit()”,因为这三种都对数据库的数据做出了操作,而查询则没有】

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值