Mybatis方式完成CRUD操作

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.mfbz.cn/a/17084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jvm调优策略

jvm调优主要是内存管理方面的调优&#xff0c;包括各个代的大小&#xff0c;GC策略等。 代大小调优 JVM 中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的可用虚拟内存限制&#xff1b;系统的可用物…

第三十二章 Unity Mecanim动画系统(上)

在上一章节中&#xff0c;我们介绍了Unity的旧版动画系统&#xff0c;本章节来介绍新版的Mecanim动画系统。新版的Mecanim动画系统实际是对旧版动画系统的升级。新版的Mecanim动画系统仍然是建立在动画片段的基础上的&#xff0c;只不过它给我们提供了一个可视化的窗口来编辑动…

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习

详情点击链接&#xff1a;R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习 Meta分析的选题与文献检索 Meta分析Meta分析的选题策略文献检索数据库精确检索策略&#xff0c;如何检索全、检索准文献的管理与清洗&#xff0c;如何制定文献纳入排除标准文献数据获取技…

搭建网站使用轻量云服务器怎么样?

​  搭建网站实际上可以从轻量云服务器租用中受益匪浅。如果您正在为个人网站寻找更多的低成本和轻运维&#xff0c;您可以考虑将轻量云服务器作为一个可行的选择。它提供独享资源、独立的IP地址、专属防火墙以及比传统虚拟主机更好的安全性能。本文将介绍轻量云服务器对建站…

【操作系统OS】学习笔记:第一章 操作系统基础【哈工大李治军老师】

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记&#xff0c;仅进行交流分享。 特此鸣谢李治军老师&#xff0c;操作系统的神作&#xff01; 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0…

Ubuntu磁盘和目录和文件的相关操作

目录 1、目录的切换 2、查看目录及文件 3、目录的常见操作 4、文件的常见操作 5、查看文件及目录大小 6、命令查看硬盘信息 1、目录的切换 打开终端窗口&#xff08;”ctrlaltt“&#xff09; 一般使用&#xff08;”pwd“&#xff09;显示当前所在的目录 比如&#x…

Flutter学习之旅 -网格布局

GridView列表三种形式 可以通过GridView.count实现网格布局 /* 格式: GridView.count(crossAxisCount: 一行显示数量,children: [component(),...],) */ class MyHomePage extends StatelessWidget {const MyHomePage({Key? key}) : super(key: key);overrideWidget build(B…

C++每日一练:小艺照镜子(详解分治法)

文章目录 前言一、题目二、解题1.分析 总结 前言 大过节的&#xff0c;不想去看人后脑勺&#xff0c;就做点题来玩。挑了小艺照镜子&#xff0c;百分通过~ 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 题目名称&#xff1a; 小艺照镜子 …

【Linux】生产者消费者模型

目录 一、生产者消费者模型 1、生产者消费者模型的概念 2、生产者、消费者之间的关系 3、生产者和消费者的特点 二、基于BlockingQueue的生产者消费者模型&#xff08;条件变量控制同步与互斥&#xff09; 1、一个生产线程和一个消费线程完成的计算任务 1.1BlockQueue.h…

Kubernetes服务搭建[配置-部署](Kubeadm)

文章目录 **[1 — 7] ** [ 配置K8S主从集群前置准备操作 ]一&#xff1a;主节点操作 查看主机域名->编辑域名1.1 编辑HOST 从节点也做相应操作1.2 从节点操作 查看从节点102域名->编辑域名1.3 从节点操作 查看从节点103域名->编辑域名 二&#xff1a;安装自动填充&…

进程地址空间与页表方面知识点(缺页中断及写时拷贝部分原理)

谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 目录 谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 抛出总结 开始介绍 发现问题 进程地址空间&#xff08;虚拟地址&#xff09; 页表 物理内存与进程地址空间映射 缺页中断基本…

Spring--AOP详细介绍--和详细代码演示证明理解

目录 Spring--AOP详细介绍 基本介绍 代码演示—入门 需求说明 定义一个接口类Vehicle 定义一个实现接口类的Car类 定义一个实现接口类的Ship类 创建测试类Test.java 来思考一下&#xff0c; 解决方案-动态代理方式-2 修改 Car类 修改 Ship类 创建VehicleProxyProvid…

Stable Diffusion使用方法

SD的本地安装教程有很多我就不重复了&#xff0c;这里主要是记录我在使用SD Webui的过程中遇到的问题&#xff0c;总结的一些提升出图效率&#xff0c;出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 &#xff1f; Ok&#xff0c;以上只是一小部分成品 &#xff0c;属…

PyQt5桌面应用开发(6):文件对话框

本文目录 PyQt5桌面应用系列介绍QFileDialog的静态接口QFileDialog的对象接口 示例结论后记 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 PyQt5桌面应用开发&#xff…

MRI k空间概念整理

以下内容为MRI期末复习笔记&#xff0c;仅供复习参考使用。 K空间概念 K空间为包含MR数据的阵列&#xff0c;也可定义为原始数据阵列相位编码轴和频率编码轴的交叉点 MR扫描得到的数据为谱空间数据&#xff0c;谱空间数据与空间数据位置无直接对应关系 k空间每一数据点或数据…

不能使用chatGPT?这3个平替甚至比chatGPT更强

不能使用chatGPT&#xff1f;这3个平替甚至比chatGPT更强 chatGPT&#xff0c;一款由OpenAI开发的新型AI聊天机器人&#xff0c;正在势如破竹地改变着许多人的工作和生活方式。作为一款基于大语言模型的聊天机器人&#xff0c;chatGPT能够理解自然语言并进行人机对话。与传统的…

用于scATAC-seq有监督分类的Cellcano

细胞类型识别是单细胞数据分析的基本步骤。由于高质量参考数据集的可用性&#xff0c;有监督细胞分类方法在scRNA-seq数据中很受欢迎。染色质可及性分析&#xff08;scATAC-seq&#xff09;的最新技术进步为理解表观遗传异质性带来了新的见解。随着scATAC-seq数据集的不断积累&…

html5地理位置信息介绍, 百度地图使用

文章目录 1. HTML5中地理信息API1.1 Geolocation 接口 2. 在vue中使用百度地图3. 在react中使用百度地图 1. HTML5中地理信息API HTML5 的地理位置 API 可以让你获取用户的地理位置信息&#xff0c;并将其用于许多不同的应用场景&#xff0c;例如&#xff1a; 在地图上显示用…

钴基双金属氧化物储能材料的高效制备和电化学应用

一、引言 钴金属氧化物作为一类典型的储能材料&#xff0c;既可以用于锂离子电池负极材料&#xff0c;又可以用于超级电容器电极材料&#xff0c;因而备受关注 。在作为锂离子电池负极材料时&#xff0c;具有较高的理论比容量&#xff0c;但充放电体积变化较大、材料导电性较差…

爬虫为什么需要ip

爬虫需要使用爬虫ip主要是为了解决以下问题&#xff1a; 1、反爬虫机制&#xff1a;许多网站会设置反爬虫机制来防止爬虫程序的访问&#xff0c;例如限制IP地址的访问频率、检测访问来源等。使用爬虫ip可以绕过这些限制&#xff0c;使得爬虫程序更难被检测到。 2、访问限制&a…