【Java】基于【Mybatis】框架学习系列——Mybatis增删改查(CURD)

🚀个人主页:Ali,S

📆 最近更新:2022年7月2日

⛽ Java框架学习系列:Mybatis框架

⛳ Java基础学习系列:面向对象飞机大战

🏆 通信仿真学习系列:【硬件】【通信】【MATLAB】

🍄 个人简介:通信工程本硕🌈、Java程序员🚴。目前只会CURD😂

💌 点赞 👍 收藏 💗留言 💬 都是我最大的动力💯

在这里插入图片描述


前言

在前面数据库连接成功和配置良好的情况下,今天使用Mybatis对数据库进行CURD操作。

一、准备数据和实体类

1.创建数据表

在连接的数据库下创建学生表,为其添加id,name,address字段信息,具体的我是在Navicat数据库可视化工具中进行字段数据的添加,当然也可以使用SQL语句进行操作。
在这里插入图片描述

2.创建实体类

在实体类包下创建实体类Student类,对学生类进行属性的封装,并提供访问的方法以及构建实体类构造器。这里的实例类属性要与数据库的字段保持一致。后面会有一个数据库字段带下划线的属性,使用别的别的方法解决,尽量保持字段名一致。

public class Student {
    private Integer id;
    private String name;
    private String address;

    public Student() {
    }

    public Student(Integer id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    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 getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

3.创建工具类

这里创建自己的包装类,用于保证SqlSeesionFactory的全局唯一性,功能层次更加清晰,封装工具方法,分工明确。基本步骤为:创建全局唯一的SqlSessionFactory对象、创建SqlSession、使用SqlSession、关闭SqlSession。

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class MybatisUtil {
    //1、创建全局唯一的SqlSessionFactory对象
    private static SqlSessionFactory sqlSessionFactory=null;
    //使用静态代码块
    static{
        try {
            //加载配置文件
            String resource = "mybatis-config.xml";
            //转换成输入流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //拿到sqlSessionFactory
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch (Exception e) {
            throw  new ExceptionInInitializerError(e);
        }
    }
    //创建SqlSession
    public static SqlSession createSqlSession(){
        return sqlSessionFactory.openSession();
    }
    //关闭SqlSession
    public static void closeSqlSession(SqlSession sqlSession){
        if (null!=sqlSession){
            sqlSession.close();
        }
    }
}

4.对工具类进行测试

对工具类进行测试,这里与连接数据测试基本一样,可以直接仿照连接数据库的部分来写。

 @Test
    public void testUtil(){
        SqlSession sqlSession=null;
        try {
            sqlSession=MybatisUtil.createSqlSession();
            System.out.println(sqlSession.getConnection());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
         MybatisUtil.closeSqlSession(sqlSession);
        }
    }

当运行测试后,在控制台得到下面的信息,表示工具类成功连接到数据库。保证后续对数据库内的数据进行操作。
在这里插入图片描述

二、创建映射与注册映射

1.创建映射

对实体类对象创建映射,为避免有多个实体类,影响项目结构,这里在resource包下专门创建一个映射的mappers包,然后在mappers包下创建不同实例对应的映射文件,后续所有的SQL操作都在映射文件中来编写。需要注意的是mapper的URL地址最后是mybatis-3-mapper.dtd这里与Mybatis的映射文件很像,注意细微区别是它以mapper.dtd结尾的。

<?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">
<mapper namespace="com.dao.StudentDao">
</mapper>

2.注册映射

很多初学者在创建完映射文件后,就觉得可以直接去写SQL语句,对数据库中的数据进行操作了,其实这时候你去写CURD必然使IDEA报缺失mapeer的错误,相当于就是你没有把数据请求操作交给Mybatis来处理。所以应该在Mybatis.xml文件中进行映射文件注册。

<!--    注册映射文件-->
    <mappers>
        <mapper resource="mappers/StudentDao.xml"/>
    </mappers>

三、增删改查操作(CURD)

完成上面的所有准备工作后,就是万事具备,只欠代码了,下面就对数据库的数据进行具体操作了,特别需要注意查询操作,对单条数据的查询和多条数据的查询是有区别的。

1.单条数据的查询

在映射文件中,写查询的SQL语句,由于是进行单条数据的查询,所以这里id的名字可以随便给,都可以绑定到参数,但是一般还是做到见名知意。

    <select id="selectById" resultType="com.entity.Student">
        select * from Student where id = #{id}
    </select>

然后在测试类中写测试就可以了对数据进行查询,调用selectOne()方法,该方法第一个参数为String类型,来定位映射文件的路径。第二个参数为绑定的id参数。

 @Test
    public void testSelectById(){
        SqlSession sqlSession=null;
        try {
            sqlSession=MybatisUtil.createSqlSession();
            System.out.println(sqlSession.getConnection());
            Student student = sqlSession.selectOne("com.dao.StudentDao.selectById", 1);
            System.out.println(student);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            MybatisUtil.closeSqlSession(sqlSession);
        }
    }

运行测试代码,在控制台得到的查询数据为下图,与数据库中的信息一致,说明查询单条数据操作完成。
在这里插入图片描述

2.多条数据的查询

在进行多条数据查询时,写查询的SQL一般的参数绑定会是一个范围,不像单条数据一样可以随便进行绑定,下面对数据库中id为min到max的数据进行查询。

    <select id="selectByRange" resultType="com.entity.Student">
        select * from Student where id between #{min} and #{max}
    </select>

接着创建StudentDao接口,由于是多条数据,所以返回的应该是一个集合,创建接口实方便其他的多数据的查询。@Param("min")和@Param("max")使用注解是为了与多数据匹配对应参数绑定。

  List<Student> selectByRange(@Param("min") Integer min, @Param("max") Integer max);

然后在测试类中写测试就可以了对数据进行查询,调用selectList()方法,创建Map集合对min和max进行绑定,这里与单条数据有本质上的区别。这里也可以使用JDK的动态代理模式,进行多数据查询。

 @Test
    public void testSelectByRange(){
        SqlSession sqlSession=null;
        try {
            sqlSession=MybatisUtil.createSqlSession();
            System.out.println(sqlSession.getConnection());
            HashMap<String, Object> params = new HashMap<>();
            params.put("min",1);
            params.put("max",2);
            List<Student> student = sqlSession.selectList("com.dao.StudentDao.selectByRange",params);
            for (Student student1 : student) {
                System.out.println(student1);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            MybatisUtil.closeSqlSession(sqlSession);
        }
    }

运行测试代码,在控制台得到的查询数据为下图,与数据库中的信息一致,说明查询多条数据操作完成。
在这里插入图片描述

3.数据的增加

在映射文件中,写插入的SQL语句,与单数据查询大同小异。字段的属性值要与数据库保持一致values(#{id},#{name},#{address})

 <insert id="insertStudent" parameterType="com.entity.Student">
        insert into student values(#{id},#{name},#{address})
    </insert>

然后在测试类中写测试就可以了对数据进行添加,调用insert()方法,在数据进行插入之后,一定要记得使用sqlSession.commit();对数据进行提交操作,不然控制台提示你插入了数据,但是数据进行了rollback回滚操作,数据库信息不会更新。如果出现异常我们应当在catch语块中利用sqlSession.rollback();进行事务的回滚操作,防止脏数据的产生。

 //新增测试
    @Test
    public void testInsertStudent(){
        SqlSession sqlSession=null;
        try {
            sqlSession=MybatisUtil.createSqlSession();
            Student student = new Student();
            student.setId(3);
            student.setName("阿水");
            student.setAddress("安徽阜阳");
            int insertNum = sqlSession.insert("com.dao.StudentDao.insertStudent", student);
            sqlSession.commit();
            System.out.println("新增了"+insertNum+"条数据");
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            MybatisUtil.closeSqlSession(sqlSession);
        }
    }

运行测试代码,在控制台得到的新增数据为下图,并查看数据中的信息,发现与数据库中的信息一致,说明添加数据操作完成。
在这里插入图片描述
添加后的数据库中表的数据:
在这里插入图片描述

4.数据的更新

在映射文件中,写更新的SQL语句,与数据插入大同小异。字段的属性值要与数据库保持一致name=#{name},address=#{address}并使用id来做限定。

 <update id="updateStudent" parameterType="com..entity.Student">
        update student set name=#{name},address=#{address} where id=#{id}
    </update>

然后在测试类中写测试就可以了对数据进行更新,调用update()方法,同样需要对数据进行提交操作。

//更新测试
    @Test
    public void testUpdateStudent(){
        SqlSession sqlSession=null;
        try {
            sqlSession=MybatisUtil.createSqlSession();
            Student student = new Student();
            student.setId(1);
            student.setName("武哥NB");
            student.setAddress("湖北荆州");
            int updateNum = sqlSession.update("com.dao.StudentDao.updateStudent", student);
            sqlSession.commit();
            System.out.println("更新了"+updateNum+"条数据");
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            MybatisUtil.closeSqlSession(sqlSession);
        }
    }

运行测试代码,在控制台得到的更新数据为下图,并查看数据中的信息,发现数据库中的信息一致,说明更新数据操作完成。
在这里插入图片描述
更新后的数据库中表的数据:
在这里插入图片描述

5.数据的删除

在映射文件中,写删除的SQL语句,与前面的数据添加和更新是一样的。由于是进行删除操作,所以直接将id作为参数,直接将对象信息删除。

<delete id="deleteStudent" parameterType="com.softeem.entity.Student">
        delete from student where id=#{id}
    </delete>

然后在测试类中写测试就可以了对数据进行删除,调用delete()方法,同样需要对数据进行提交操作。

 @Test
    public void testDeleteStudent(){
        SqlSession sqlSession=null;
        try {
            sqlSession=MybatisUtil.createSqlSession();
            Student student = new Student();
            student.setId(3);
            int deleteNum = sqlSession.delete("com.dao.StudentDao.deleteStudent", student);
            sqlSession.commit();
            System.out.println("删除了"+deleteNum+"条数据");
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            MybatisUtil.closeSqlSession(sqlSession);
        }
    }

运行测试代码,在控制台得到的删除数据为下图,并查看数据中的信息,发现数据库中的信息一致,说明删除数据操作完成。
在这里插入图片描述
删除后的数据库中表的数据:
在这里插入图片描述
在这里插入图片描述


总结

以上就是今天要讲的内容,本文完整的介绍了Mybatis的具体的增删改查(CURD)操作。使用ORM框架,更快的完成数据的一系列操作。

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ali.s

你的鼓励将是我前进的最好动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值