Mybatis方式完成CRUD操作

news2024/11/20 10:36:30

Mybatis方式完成CRUD操作

文章目录

  • Mybatis方式完成CRUD操作
    • 1、java以Mybatis方式操作DB
      • 1.1、配置数据源-创建 resources/mybatis-config.xml
      • 1.2、创建java bean-Monster
      • 1.3、配置Mapper接口声明方法
      • 1.4、配置xxMapper,完成SQL配置,实现CRUD操作
      • 1.5、Test测试
    • 2、需要的Utils工具类
    • 3、pom基础依赖
    • 4、数据库建表操作

Java开发在以前做数据库连接的时候通过JDBC来完成,非常麻烦。

现在引入了MyBatis这个框架,Mybatis是简化数据库操作的持久层框架。

使用Mybatis的好处:

  • mybatis 可以将对数据表的操作(sql,方法)等等直接剥离,写到 xml 配置文件,实现和 java 代码的解耦
  • MyBatis 在 java 和 sql 之间提供更灵活的映射

1、java以Mybatis方式操作DB

在这里插入图片描述

1.1、配置数据源-创建 resources/mybatis-config.xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--    配置mybatis自带的日志输出-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--    配置类型别名-->
    <typeAliases>
        <typeAlias type="com.linghu.entity.Monster" alias="Monster"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <!--            配置事务管理器-->
            <transactionManager type="JDBC"/>
            <!--            配置数据源-->
            <dataSource type="POOLED">
                <!--                配置驱动-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--                配置数据库的链接-->
                <property name="url"
                          value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <!--               数据库的用户名和密码-->
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--    这里设置我们需要管理的mapper.xml文件-->
    <!--    可以通过快捷键copy这个地址-->
    <mappers>
        <mapper resource="com/linghu/mapper/MonsterMapper.xml"/>
    </mappers>


</configuration>

1.2、创建java bean-Monster

创建bean的时候要对照自己设计的数据库表字段进行设计,要一一对应!

package com.linghu.entity;

import java.util.Date;

/**
 * @author 令狐荣豪
 * @version 1.0
 * Monster类和monster表有对应关系,字段要对应
 * 体现oop
 */
public class Monster {
    private Integer id;
    private Integer age;
    private String name;
    private String email;
    private Date birthday;
    private double salary;
    private Integer gender;

    public Monster() {
    }

    public Monster(Integer id, Integer age, String name, String email, Date birthday, double salary, Integer gender) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.email = email;
        this.birthday = birthday;
        this.salary = salary;
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                ", salary=" + salary +
                ", gender=" + gender +
                '}';
    }

    public Integer getId() {
        return id;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }
}

1.3、配置Mapper接口声明方法

package com.linghu.mapper;

import com.linghu.entity.Monster;

import java.util.List;

/**
 * @author 令狐荣豪
 * @version 1.0
 * 定义增删改查的接口方法
 */
public interface MonsterMapper {
//    添加monster
    public void addMonster(Monster monster);

    //根据id删除一个Monster
    public void delMonster(Integer id);
    //修改 Monster
    public void updateMonster(Monster monster);
    //查询-根据 id
    public Monster getMonsterById(Integer id);

    //查询所有的 Monster
    public List<Monster> findAllMonster();
}

1.4、配置xxMapper,完成SQL配置,实现CRUD操作

Monstermapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.linghu.mapper.MonsterMapper">

<!--    <select id="selectBlog" resultType="Blog">-->
<!--        select * from Blog where id = #{id}-->
<!--    </select>-->
<!--    private Integer id;
    private Integer age;
    private String name;
    private String email;
    private Date birthday;
    private double salary;
    private Integer gender;-->
        <insert id="addMonster" parameterType="com.linghu.entity.Monster">
            insert into `monster`
            (`age`,`birthday`,`email`,`gender`,`name`,`salary`)
<!--            values(10,null,'linghu@qq.com',1,'kate',1000),修改成活数据-->
<!--            下面的名称对应的Monster对象的属性名-->
            values(#{age},#{birthday},#{email},#{gender},#{name},#{salary})
        </insert>

    <delete id="delMonster" parameterType="Integer">
        delete from `monster` where id=#{id};
    </delete>

<!--    这里的入参类型最好不要简写!-->
<!--    配置类型别名后这里可以简写Monster-->
<!--    <update id="updateMonster" parameterType="com.linghu.entity.Monster">-->
    <update id="updateMonster" parameterType="Monster">
        update `monster` set `age`=#{age},`birthday`=#{birthday},`email`=#{email},
        `gender`=#{gender},`name`=#{name},`salary`=#{salary}
        where id=#{id}
    </update>

<!--     resultType是个别名-->
    <select id="getMonsterById" parameterType="Integer" resultType="Monster">
        select * from `monster` where id=#{id};
    </select>

<!--    查询全部结果-->
    <select id="findAllMonster" resultType="Monster">
        select * from `monster`;
    </select>

</mapper>

1.5、Test测试

package com.linghu.mapper;

import com.linghu.entity.Monster;
import com.linghu.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

import java.util.Date;
import java.util.List;

/**
 * @author 令狐荣豪
 * @version 1.0
 */
public class MonsterMapperTest {
    private SqlSession sqlSession;
    private MonsterMapper monsterMapper;

    @Before
    public void init(){
        //通过SqlSessionFactory获取一个SqlSession会话
        sqlSession= MyBatisUtils.getSqlSession();
        //获取MonsterMapper接口对象,该对象实现了MonsterMapper
        monsterMapper=sqlSession.getMapper(MonsterMapper.class);
        System.out.println(monsterMapper.getClass());
    }

//    @Test
//    public void t1(){
//        System.out.println("t1()。。。");
//    }

    @Test
    public void addMonster(){
        for (int i=0;i<3;i++){
            Monster monster = new Monster();
            monster.setAge(10+i);
            monster.setBirthday(new Date());
            monster.setEmail("lignhu@qq.com");
            monster.setGender(1);
            monster.setName("松鼠精"+i);
            monster.setSalary(1000+i*10);
//            id不用设置
            monsterMapper.addMonster(monster);
            System.out.println("添加对象-"+monster);
        }
        //如果是增删改,需要提交事务
        if (sqlSession!=null){
            sqlSession.commit();
            sqlSession.close();
        }
        System.out.println("保存成功···");
    }

    @Test
    public void delMonster(){
        monsterMapper.delMonster(2);

        //如果是增删改,需要提交事务
        if (sqlSession!=null){
            sqlSession.commit();
            sqlSession.close();
        }
        System.out.println("删除成功···");
    }

    @Test
    public void updateMonster(){
        Monster monster = new Monster();
        monster.setAge(200);
        monster.setBirthday(new Date());
        monster.setEmail("hspedu@sohu.com");
        monster.setGender(2);
        monster.setName("狐狸精");
        monster.setSalary(9234.89);
        monster.setId(4);
        monsterMapper.updateMonster(monster);
        if (sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }
        System.out.println("修改 ok");
    }

    @Test
    public void getMonsterById(){
//        Monster monster = new Monster();
        Monster monster=monsterMapper.getMonsterById(6);
        System.out.println("monster="+monster);


        if (sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }
        System.out.println("查询 ok");
    }

    @Test
    public void findAllMonster(){ //查询全部结果
        List<Monster> allMonster = monsterMapper.findAllMonster();
        for (Monster monster :allMonster) {
            System.out.println(monster);
        }

        if (sqlSession != null) {
            sqlSession.close();
        }
        System.out.println("查询 ok");

    }
}

2、需要的Utils工具类

工具类MyBatisUtils.java

package com.linghu.util;

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 javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author 令狐荣豪
 * @version 1.0
 * 这是一个工具类,可以得到Sqlsession会话,这个会话提供了执行SQL命令的方法CRUD
 */
public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {//静态代码块-初始化sqlSessionFactory对象
        try {
            /**
             * 指定资源文件
             */
            String resource="mybatis-config.xml";
            //指定资源文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //获取SqlSession实例
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 返回一个SQLSession会话,这个会话提供了执行SQL命令的方法CRUD
     * @return
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

3、pom基础依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.linghu</groupId>
    <artifactId>Linghu_Mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
<!--        这里可以看到父项目下有哪些子项目-->
        <module>mybatisqucikstart</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <!-- 导入依赖 -->
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

<!--    配置resources-->
<!--    配置目的:将src/main/java目录和子目录和src/main/resources目录和子目录的
资源文件xml和properties在build项目时,导出到对应的target目录下
-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>

4、数据库建表操作

CREATE DATABASE `mybatis`
CREATE TABLE `monster` (
	`id` INT NOT NULL AUTO_INCREMENT, 
    `age` INT NOT NULL, 
    `birthday` DATE DEFAULT NULL, 
    `email` VARCHAR(255) NOT NULL , 
    `gender` TINYINT NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    `salary` DOUBLE NOT NULL,
	PRIMARY KEY (`id`)
) CHARSET=utf8

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI生成天空盒!泰裤辣!

我经常做一些奇奇怪怪的梦&#xff0c;醒来的时候特别想把这些NB的场景给画下来分享给别人。 我尝试过AI绘画&#xff0c;但是还没达到我想要的那种沉浸的效果。如果能通过我的描述生成3D场景就好了。 直到我发现了它&#xff01; 先来欣赏一下它的杰作&#xff1a; 这个工具通…

微信公众号扫码登录(一)—— 获取微信公众号二维码

引言 这几天在研究微信登录&#xff0c;今天解决了获取微信二维码问题&#xff1b;在这里总结一下 关于微信登录想说的话 第一次接触微信登录&#xff0c;开始就弄混了登录方式&#xff1b;简单来说&#xff0c;微信扫码登录分为两种&#xff0c;一种是微信公众平台&#xf…

SAP 从入门到放弃系列之工作中心(workcenter)

目录 概念 数据收集 主要配置点&#xff1a; 工作中心类别 工作中心字段选择 工作中心公式 标准值码 工作中心位置 工序控制码 概念 工作中心是为制造过程增加价值的一台机器或一组机器、一个人或一组人&#xff0c;或一组人和机器。 数据收集 在 实施项目期间&#x…

汉诺塔问题(解出来了带你看洛丽塔)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…

[230508]托福听力真题TPO66|词汇总结| 精听|19:30~20:10 20:50~23:00 8:30~9:40

TPO66 L1&#xff1a; 3/6 TPO66 L2&#xff1a; TPO66 L3&#xff1a; 目录 TPO66 C1 一、要点 二、文本 三、文本注释 四、复听笔记 TPO66 C2 一、要点 二、文本 三、文本注释 四、复听笔记 TPO66 L1 重点词汇 TPO66 L2 重点词汇 TPO66 L3 重点词汇 TPO66 C1 一、要点 …

大家都去荷兰注册公司到底是为了什么?

荷兰位于欧洲大陆西北部&#xff0c;北濒北海&#xff0c;与德国和比利时接壤。国土总面积为41528平方公里&#xff0c; 2020年2月人口达1741万人。荷兰是中国企业海外投资的重要目的地国之一。目前&#xff0c;中国是荷兰至二大外资项目来源国。据荷方统计&#xff0c;目前&am…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好&#xff0c;但还不能取代专家导师&#xff0c;有时还会犯错&#xff01; ChatGPT 教小狗编程&#xff08; Midjourney 创作&#xff09; GPT-4刚刚发布&#xff0c;相较于GPT-3.5&#xff0c;它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下&#xff0c;…

Java程序设计入门教程--数组

目录 一、一维数组创建 1. 定义数组 &#xff08;1&#xff09;声明 &#xff08;2&#xff09;分配数组内存空间 2. 数组初始化 &#xff08;1&#xff09;静态初始化 &#xff08;2&#xff09;动态初始化 3. 一维数组的拷贝 &#xff08;1&#xff09;数组元素的拷…

家用洗地机哪种好?怎么选购家用洗地机

在这个高度关注环境、健康和安全的时代&#xff0c;洗地机已成为多种设施不可或缺的清洁工具。它不仅可以提高清洁速度和质量&#xff0c;还可以协助您提高生产效率和管理流程。洗地机的优点在于它易于使用&#xff0c;具有多种高效能力和灵活性&#xff0c;是一个为现代清洁服…

(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析

链表面试题 203. 移除链表元素题目解法一&#xff1a;递归解法二&#xff1a;迭代 206. 反转链表题目解法一&#xff1a;递归解法二&#xff1a;迭代 876. 链表的中间结点题目解法一&#xff1a;快慢指针法解法二&#xff1a;单指针法 链表中倒数第k个结点题目解法 21. 合并两个…

22.碳交易机制下考虑需求响应的综合能源系统优化运行

说明书 MATLAB代码&#xff1a;碳交易机制下考虑需求响应的综合能源系统优化运行 注意&#xff1a;另外还有含义柔性负荷、蓄冷式空调、共享储能以及碳捕集的综合能源系统优化运行代码&#xff0c;欢迎咨询 关键词&#xff1a;需求响应 碳交易机制 日前优化调度 综合能源系统…

pdf怎么分割成一页一页的文件?

pdf怎么分割成一页一页的文件&#xff1f;相信很多使用电脑办公的小伙伴们都知道&#xff0c;无论是pdf文件还是ppt文件其都是由很多页组成的。一般当我们需要其中的部分内容时候&#xff0c;可以通过手动的方式将ppt文件来拆分成一页一页的来使用。但是这种手动的方法对于pdf文…

数据库中数据的操作(进阶)

数据库中数据的约束 键值约束 primary key唯一性约束 unique key非空约束 not null默认值 default val扩展属性&#xff08;auto_increment&#xff09;外键约束 foreign keycheck 子句约束 键值约束 primary key 主键约束&#xff1a;primary key 约束指定字段中的值&#xff…

虹科干货 | 零售业数智升级不掉队,get数据,get未来!

电商崛起&#xff0c;传统零售行业危机四伏&#xff0c;全渠道盈利与可持续化成为难点&#xff0c;库存管理这块难啃的“硬骨头”也同样让零售商倍感压力… 背腹受敌的零售商&#xff0c;如何才能在数字化转型道路上避免利润缩水&#xff0c;与供应商协作共赢&#xff0c;摆脱困…

【Mac教学】如何打开macOS 的最大权限

相信有不少用户都知道&#xff0c;目前苹果的Mac 电脑中&#xff0c;有不少功能为了安全问题&#xff0c;设立了多项安全措施&#xff0c;当中有一些需要安装第三方的软件&#xff0c;但因为缺少了苹果认证&#xff0c;而无法使用或安装&#xff0c;因此为各位讲解一个设定&…

汇编语言-复习自用

本文用于自我复习汇编语言&#xff0c;参考b站一位老师的讲解整理而成&#xff0c;感谢老师的无私付出视频链接链接 文章目录 1.第一章1.1计算机组成1.2读取1.3 寄存器及数据存储1.4 mov和and指令1.5 确定物理地址1.6 内存分段表示法1.7debug使用1.8CS:IP1.9jmp指令改变csip1.1…

Git教程(一)

1、Git概述 1.1 、Git历史 同生活中的许多伟大事件一样&#xff0c;Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上&#xff08;1991&#xff0d;2002年间&#xff09;…

ThingsBoard使用jar包进行初始化数据库

1、概述 ThingsBoard的官方虽然提供了直接使用他们的官方镜像来部署,但是根据我了解到的一些信息,目前国内几乎都是基于ThingsBoard进行二开,都需要拉取ThingsBoard的源代码,然后自己进行修改,然后部署自己修改后的代码,在这里我就不说如何进行本地编译了,目前网上有很…

SpringBoot的依赖管理和自动配置

目录 依赖管理自动配置 依赖管理 1.父项目做依赖管理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> </parent>他的父项目 &…

如何远程访问本地jupyter notebook服务器,实现无公网IP端口映射

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 转载自远控源码文章&#xff1a;公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&am…