MyBatis第三课 MyBatis映射文件的CRUD操作<方式二>

Posted 笔触狂放

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis第三课 MyBatis映射文件的CRUD操作<方式二>相关的知识,希望对你有一定的参考价值。

概念

本文在上篇文章的学习之上,展开新的学习。【MyBatis】第二课 MyBatis映射文件的CRUD操作<方式一>_笔触狂放的博客-CSDN博客

通过前面的学习,大家会发现框架的使用比原生java操作数据来的更简便。但在操作调用sql语句的时候还是显得有些笨拙,对于初学者在使用命名空间+id属性值的过程中出错性比较大,对于sql语句所执行的结果进行分析的能力比较差。那么本文使用创建接口的方式与映射文件进行对应,那么我们在执行的时候,只需要和接口对象进行对接即可。具体操作看一下篇幅。

1.搭建MyBatis环境

对于MyBatis的搭建过程,本文不再赘述,初学者还未掌握的,可查阅【MyBatis】第一课 MyBatis的框架的搭建和使用_笔触狂放的博客-CSDN博客

接着,我们需要在dao层中创建接口文件,选中dao--》右键--》new--》java class

输入接口名称,按照我们对MVC+三层架构的项目搭建方式中,我们对于接口的命名为I+要操作的表名+当前包的名称,例如 IBookDao 作为接口名称

 

将接口文件和映射文件放置同一个包中,并在映射文件中的mapper标签的命名空间名称需要指向于接口

 

而创建的接口中,定义的方法的返回值类型需要和映射文件中要执行的sql语句的resultType属性中的数据类型一致,方法名要和id属性中的值一致,方法中的形式参数要和parameterType属性中的值保持一致

 

 以上是需要注意的地方。

2.查询操作

在映射文件中定义sql语句的方式与上篇文章中类似

<?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.book.dao.IBookDao">
    <!--查询book表总共有多少本书-->
    <select id="getCount" resultType="int">
        select count(*) from book
    </select>

    <!--查询书籍编号为1的书名-->
    <select id="getNameById" resultType="String" parameterType="int" >
        select name from book where id=#id
    </select>

    <!--传入单个条件,查询多个字段-->
    <!--查询书籍编号为1的书名,作者,价格,数量-->
    <select id="getBookById" resultType="Map" parameterType="int" >
        select name,author,price,count from book where id=#id
    </select>

    <!--传入多个条件,查询多个字段-->
    <!--查询作者为罗贯中,价格为98的书籍编号,书名和数量-->
    <select id="getBookInfo" parameterType="Map" resultType="Map">
        select id,name,count from book where author=#author and price=#price
    </select>

    <!--不传参数,查询多条数据-->
    <!--查询所有图书信息-->
    <select id="selectAll" resultType="Map">
        select * from book
    </select>

    <!--查询所有图书信息并按书籍编号进行降序排列   降序是DESC    升序是ASC  默认为升序-->
    <select id="selectOrder" resultType="Map">
        select * from book ORDER BY id DESC
    </select>

    


</mapper>

 那么所有要执行的sql语句都需要与接口文件中对应不同的方法

package com.book.dao;

import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2022/3/14.
 */
public interface IBookDao 

    //接口中定义的方法一定好和映射文件中要执行的sql语句的id保持一致
    int getCount();

    String getNameById(int id);

    Map<String,Object> getBookById(int id);

    Map<String,Object> getBookInfo(Map<String, Object> map);
    //查询多条数据的时候,接口中定义的方法的返回值类型一定是使用List里面套Map或者自定义实体类
    List<Map<String,Object>> selectAll();

    List<Map<String,Object>> selectOrder();

  


 建立测试类,在测试类中,只需要通过SqlSession对象调用getMapper方法传入接口类名即可,不再需要通过命名空间+id属性值进行调用执行的sql语句。

package com.book.test;

import com.book.dao.IBookDao;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2022/3/14.
 */
public class BookTest 
    public SqlSession ss=null;
    public IBookDao dao=null;
    public void init()
        //将主配置文件转换成输入流
        try 
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            ss= new SqlSessionFactoryBuilder().build(is).openSession();
            dao=ss.getMapper(IBookDao.class);
         catch (IOException e) 
            e.printStackTrace();
        
    

    @Test
    public void one()
        init();
        //查找sql语句,进行查询书籍的总数量
        //获得映射
        int count = dao.getCount();
        System.out.println("查询的书籍总数量为:"+count+"本");
    

    @Test
    public void two()
        init();
        String name = dao.getNameById(1);
        System.out.println("查询的书籍名称为:"+name);
    

    @Test
    public void three()
        init();
        Map<String, Object> book = dao.getBookById(1);
        System.out.println(book);
    

    @Test
    public void four()
        init();
        Map<String,Object> map=new HashMap<>();
        map.put("author","罗贯中");
        map.put("price",98);
        Map<String, Object> bookInfo = dao.getBookInfo(map);
        System.out.println(bookInfo);
    

    @Test
    public void five()
        init();
        List<Map<String, Object>> books = dao.selectAll();
        books.forEach(map-> System.out.println(map));
    

    @Test
    public void six()
        init();
        List<Map<String, Object>> books = dao.selectOrder();
        books.forEach(map-> System.out.println(map));
    

   



3.添加操作

mapper.xml映射文件中

<!--添加数据-->
    <!--添加数据的时候,表名后面的字段名可以省略,但前提是添加的数据一定是包含所有字段-->
    <insert id="addBook" parameterType="Map">
        insert into book  values(#id,#name,#author,#price,#count)
    </insert>

接口文件中加入方法

int addBook(Map<String, Object> map);

 测试类中进行输入数据进行执行操作

 @Test
    public void seven()
        init();
        Map<String,Object> map=new HashMap<>();
        map.put("id",null);
        map.put("name","水浒传");
        map.put("author","施耐庵");
        map.put("price",135);
        map.put("count",80);
        int i = dao.addBook(map);
        //执行添加,修改,删除操作要进行提交
        ss.commit();
        if (i>0)
            System.out.println("添加成功");
    

然后刷新数据库查看是否添加成功 

4.修改操作

mapper.xml映射文件中

!--修改数据-->
    <!--修改书籍编号为2的图书的价格改为280,数量改为10-->
    <update id="updateBook" parameterType="Map">
        update book set price=#price,count=#count where id=#id
    </update>

接口文件中加入方法

int updateBook(Map<String, Object> map);

 测试类中进行输入数据进行执行操作

@Test
    public void eight()
        init();
        Map<String,Object> map=new HashMap<>();
        map.put("id",2);
        map.put("price",280);
        map.put("count",10);
        int i = dao.updateBook(map);
        //执行添加,修改,删除操作要进行提交
        ss.commit();
        if (i>0)
            System.out.println("修改成功");
    

然后刷新数据库查看是否修改成功 

5.删除操作

mapper.xml映射文件中

<!--删除数据-->
    <!--删除书籍编号大于等于15,小于等于28的所有书籍信息-->
    <delete id="delBook" parameterType="Map">
        delete from book where id BETWEEN #id1 and #id2
    </delete>

接口文件中加入方法

int delBook(Map<String, Object> map);

 测试类中进行输入数据进行执行操作

 @Test
    public void nine()
        init();
        Map<String,Object> map=new HashMap<>();
        map.put("id1",15);
        map.put("id2",28);
        int i = dao.delBook(map);
        //执行添加,修改,删除操作要进行提交
        ss.commit();
        if (i>0)
            System.out.println("删除成功");
    

然后刷新数据库查看是否添加成功 

总结

在本文的学习过程中,初学者可以很清楚的体会到又回到Java代码的感觉,sql和java代码的业务逻辑进行分离,很好的做到了项目的高内聚,低耦合,这就是为什么MyBatis框架是一款比较优秀的持久层框架。

以上是关于MyBatis第三课 MyBatis映射文件的CRUD操作<方式二>的主要内容,如果未能解决你的问题,请参考以下文章

第三节:mybatis之参数处理

MyBatis要点总结

Mybatis-----优化配置文件,基于注解CR

通过mybatis工具generatorConfig.xml自动生成实体,DAO,映射文件

MyBatis 动态Sql

Spring第三课 Spring框架搭建MVC三层架构