IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【MyBatis】第三课 MyBatis映射文件的CRUD操作<方式二> -> 正文阅读

[Java知识库]【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框架是一款比较优秀的持久层框架。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:07:36  更:2022-03-16 22:09:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:51:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码