认识Mybatis并实现增删查改

news2024/11/18 8:27:27

目录

一.Mybatis特性

二.常见持久层技术的比较

三.搭建Mybaits环境

四.使用Mybatis

 五.通过Mybatis实现增删改

 六.实现数据库的查询操作


一.Mybatis特性

  1. 定制化SQL:MyBatis允许开发人员编写、优化和管理自定义的SQL语句,可以满足复杂查询和存储过程等高级操作的需求。

  2. 避免JDBC代码:MyBatis抽象了JDBC底层的繁琐操作,开发人员无需手动设置参数和获取结果集,通过配置文件或注解即可完成数据库操作。

  3. 灵活的映射配置:MyBatis通过简单的XML配置文件或者注解来实现对象与数据库记录之间的映射关系,将接口和Java的POJO对象映射到数据库表中的记录。

  4. 高度可定制:MyBatis提供了丰富的配置选项和插件机制,可以按照项目需求进行灵活的定制和扩展。开发人员可以根据具体情况选择合适的配置方式。

二.常见持久层技术的比较

JDBC:

  • 优点:JDBC是Java连接数据库的标准接口,具有广泛的适应性和灵活性。可以直接编写SQL语句,对数据库操作更为直观。
  • 缺点:需要在代码中编写和管理SQL语句,导致代码与SQL耦合度高,难以维护和修改。开发效率较低,代码冗长。

Hibernate和JPA:

  • 优点:操作简便,开发效率高。通过对象关系映射(ORM)实现数据库操作,屏蔽了底层SQL细节,减少了手动编写SQL的工作量。
  • 缺点:对于复杂的SQL查询,可能需要绕过框架,使用特定的查询语言。自动生成的SQL语句可能不容易进行特殊优化。在处理大量字段的POJO进行部分映射时会比较困难。反射操作较多可能导致数据库性能下降。

MyBatis:

  • 优点:轻量级且性能出色,具有很高的执行效率。SQL和Java代码相分离,功能边界清晰,Java代码专注于业务逻辑,SQL语句专注于数据操作。可以灵活地编写和优化SQL语句。
  • 缺点:相对于Hibernate,开发效率稍逊一些,需要手动编写和管理SQL语句。

三.搭建Mybaits环境

使用工具Maven idea Mysql

1.配置

在maven的pom.xml中需要配置三个模块,mysql-connect-java、mabatis、junit

配置如下:

<!--    mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.33</version>
    </dependency>
      
<!--      mybatis核心-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>

      <!--    junit测试-->
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>RELEASE</version>
          <scope>test</scope>
      </dependency>

2.构建连接数据库的xml

 在resources中(如果没有resource则创建一个)创建名称为mybatis-config.xml的配置文件

配置内容如下

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

<configuration><!-- 配置 -->
<!--    配置连接数据库的环境-->
    <environments default="development">
<!--        设置环境id-->
        <environment id="development">
<!--            事务管理模式-->
            <transactionManager type="JDBC"/>
<!--            数据源类型-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--                配置url时候记得jdbc:mysql://localhost:3306后面加上的是选择的具体数据库-->
<!--                我这里选择我创建的mysqltest数据库-->
                <property name="url" value="jdbc:mysql://localhost:3306/mysqltest"/>
<!--                输入连接你的数据库的名称和密码-->
                <property name="username" value="mysql"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
<!--    配置映射文件-->
    <mappers>
<!--        这个暂时不需要设置默认为空就行,在后面具体操作的时候再进行配置-->
        <mapper resource=""/>
    </mappers>
</configuration>


四.使用Mybatis

1.创建实体类

 在完成了搭建环境后,在Java下的com下创建目录pojo,创建一个需要与数据库映射对应的类,比如创建一个用户类

 创建好后设置好构造函数、getter、toString,如下

package com.alphamilk.mybatis.pojo;

public class User {
//    设置名字
    private String name;
//    设置年龄
    private int age;
//    设置邮箱地址
    private String email;
//    设置身份id
    private int  id;

    public User(String name, int age, String email, int id) {
        this.name = name;
        this.age = age;
        this.email = email;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getEmail() {
        return email;
    }

    public int getId() {
        return id;
    }

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

 2.在数据库中创建同样创建一样的表

Sql语言如下:

create table table_user
(
	name varchar(10) null,
	age int null,
	email varchar(20) null,
	id int null
);

 3.创建业务接口类

首先在com下创建一个mapper包,里面再创建一个接口 创建映射接口(User对应的就是UserMapper)

 4.创建接口实现映射

创建接口后,为了实现接口的功能,又需要实现java与sql的分离,则需要用xml配置实现,在resource包下创建一个mappers包,写一个对应的xml

<?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">

<!--此处的namespace修改为对应的接口-->
<mapper namespace="com.alphamilk.mybatis.mapper.UserMapper">
    <!--    配置实体类映射接口-->


<!--    通过标签的设置就可以实现对应的操作,insert标签对应插入操作-->
<!--    注意id需要与其作用的方法名称对应,该方法在接口中名称为public int insertUser();-->
<!--    内部写对应的sql语句-->
    <insert id="insertUser">
        insert into table_user value ('何生',20,'915@qq.com',001)
    </insert>
</mapper>

5.实现接口映射后,就需要将映射的xml导入到mybatis-config.xml中

    <mappers>
        <!--        这个暂时不需要设置默认为空就行,在后面具体操作的时候再进行配置-->
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>

5.最后创建测试类,测试Mybatis是否能够正常运行

创建MybatisTest类

 内容如下:

package com.alphamilk.mybatis;

import com.alphamilk.mybatis.mapper.UserMapper;
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;

public class MybatisTest {
    @Test
    public void  Test() throws IOException {
//       创建核心输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//        创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//      获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//        获取Session会话对象,会话对象用以提供
        SqlSession sqlSession = sqlSessionFactory.openSession();
//        创建动态代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        通过代理对象调用方法insertUser
        int result =  mapper.insertUser();
//        执行完后需要记得提交事务,才会保留内容到数据库
        sqlSession.commit();
//      执行完后关闭会话对象
        System.out.println(result);
        sqlSession.close();

    }
}

注意用的Resource是包org.aphache.ibatis.io

 执行后可以在数据库中查看表

可以看到正常插入进去了


 五.通过Mybatis实现增删改

增删查改,除了查,其他操作跟上述一样。

这里展示其源码

由于Test测试类中有太复杂的操作,所以在com目录下创建了一个util工具类,类中实现一个方法就是给我们返回SqlSession操作数据库对象。

代码如下

package com.alphamilk.mybatis.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 java.io.InputStream;

public class MybatisUtil {

    public static SqlSession getSession(){
        SqlSession sqlSession =null;
        try {
//            配置核心配置输入流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//           获取SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//            获取sqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//            获取sqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            return sqlSession;
        }catch (Exception e){
            e.printStackTrace();
        }
        return sqlSession;
    }
}

由于需要实现删该的方法,所以在接口中需要实现方法增加

package com.alphamilk.mybatis.mapper;

public interface UserMapper {
//    实现用户插入
    public int insertUser();

//   实现用户信息修改
    public int UpdateUser();

//    实现用户信息消除
    public int DeleteUser();

}

对应的映射也需要增加

<?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">

<!--此处的namespace修改为对应的接口-->
<mapper namespace="com.alphamilk.mybatis.mapper.UserMapper">
    <!--    配置实体类映射接口-->

<!--   方法insertUser() -->
    <insert id="insertUser">
        insert into table_user value ('何生',20,'915@qq.com',001)
    </insert>

<!--    方法UpdateUser()-->
    <update id="UpdateUser">
        update table_user set name ='黄小龙'where id=1
    </update>

<!--    方法DeleteUser()-->
    <delete id="DeleteUser">
        delete from table_user where name='黄小龙'
    </delete>
</mapper>

最后测试类实现

package com.alphamilk.mybatis;

import com.alphamilk.mybatis.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class MybatisTest {
    @Test
    public void Test(){
        SqlSession sqlSession = null;
        sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        执行insert方法
//        mapper.insertUser();
//        执行修改方法
        mapper.UpdateUser();
//        执行删除方法
//        mapper.DeleteUser();
    }
}

实现数据修改效果

 实现数据删除效果


 六.实现数据库的查询操作

由于数据库查询的操作需要返回的是数据的结果

在设置xml时候,需要而外设置参数resultType 或者 resultMap

  •  resultType:设置结果类型,即查询的数据要转换的java类型
  •  resultMap,处理一对一或者一对多的映射关系
<!--    getUserById()-->
<!--    resultType:设置结果类型,即查询的数据要转换的java类型
        resultMap,处理一对一或者一对多的映射关系
        这里使用returnType设置为pojo包内的User类型(注意一定要明确详细的类名),即返回结果是User对象
-->
    <select id="getgetUserById" resultType="com.alphamilk.mybatis.pojo.User" >
        select name from table_user where id =2
    </select>

测试类内容

package com.alphamilk.mybatis;

import com.alphamilk.mybatis.mapper.UserMapper;
import com.alphamilk.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class MybatisTest {
    @Test
    public void Test(){
        SqlSession sqlSession = null;
        sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        执行insert方法
//        mapper.insertUser();
//        执行修改方法
//        mapper.UpdateUser();
//        执行删除方法
//        mapper.DeleteUser();
//        执行通过id查询
        User user =  mapper.getUserById();
        System.out.println(user);
        sqlSession.commit();
        sqlSession.close();

    }
}

 如果有多个结果则返回时候需要用集合接收

当前xml配置

<?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">

<!--此处的namespace修改为对应的接口-->
<mapper namespace="com.alphamilk.mybatis.mapper.UserMapper">
    <!--    配置实体类映射接口-->

<!--   方法insertUser() -->
    <insert id="insertUser">
        insert into table_user value ('何生',20,'915@qq.com',001)
    </insert>

<!--    方法UpdateUser()-->
    <update id="UpdateUser">
        update table_user set name ='黄小龙'where id=1
    </update>

<!--    方法DeleteUser()-->
    <delete id="DeleteUser">
        delete from table_user where name='黄小龙'
    </delete>

<!--    getUserById()-->
<!--    resultType:设置结果类型,即查询的数据要转换的java类型
        resultMap,处理一对一或者一对多的映射关系
        这里使用returnType设置为pojo包内的User类型(注意一定要明确详细的类名),即返回结果是User对象
-->
    <select id="getUserById" resultType="com.alphamilk.mybatis.pojo.User" >
        select * from table_user where id =2
    </select>
    
<!--    对应接口内方法public  User getUserAll();-->
    <select id="getUserAll">
        select * from table_user
    </select>
</mapper>

 测试类内容

package com.alphamilk.mybatis;

import com.alphamilk.mybatis.mapper.UserMapper;
import com.alphamilk.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.Iterator;
import java.util.List;

public class MybatisTest {
    @Test
    public void Test(){
        SqlSession sqlSession = null;
        sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        执行insert方法
//        mapper.insertUser();
//        执行修改方法
//        mapper.UpdateUser();
//        执行删除方法
//        mapper.DeleteUser();
//        执行通过id查询
//        User user =  mapper.getUserById();
//        System.out.println(user);
//        查询所有用户的信息
        List<User> list = mapper.getUserAll();
        Iterator<User> iterator = list.listIterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        sqlSession.commit();
        sqlSession.close();

    }
}


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

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

相关文章

Vitepress

Vitepress 版本&#xff1a;1.0.0-rc.1 这里使用在Vue3组件库中作为项目文档说明使用&#xff0c;另外版本见差异有点大&#xff0c;如版本不一致请参照官方文档 1、安装&初始化 1.1、安装 yarn add vitepress1.0.0-rc.11.2、初始化 PS D:\WebstromProject\chenxing>…

CloudQuery实战 | 谁说没有一款一体化数据库操作管控云平台了?

文章目录 CloudQuery询盾的地址CloudQuery主页统一入口数据库归纳SQL编辑器权限管控审计中心数据保护数据变更 CloudQuery文档中心了解CloudQuery快速入门安装步骤社区版v2.1.0操作手册1数据查询更新日志 CloudQuery社区和活动 CloudQuery线上实战线上实战主页面展示及数据操作…

CAD哪个版本最好用?学习一下CAD版本转换方法

CAD即计算机辅助设计&#xff0c;是一个制图软件&#xff0c;用于绘制建筑、机械、电子等领域的图纸。CAD文件通常被称为“图纸”或“工程图”。 CAD文件通常在以下方面使用&#xff1a; 1. 建筑&#xff1a;建筑师使用CAD文件来创建建筑物的平面图、立体图和剖面图。 2. 机…

Docker部署LNMP

Docker部署LNMP 一、安装docker1.安装docker2.镜像下载 二、部署MySQL1.获取镜像2.创建启动容器创建启动容器 huahua_mysql 三、部署PHP1.获取镜像2.创建容器3.查看信息 四、安装nginx1.获取镜像2.创建运行容器3.修改nginx配置文件 五、总结1. 安装Docker和Docker Compose&…

IO模型(阻塞IO、非阻塞IO、IO多路复用)

1.阻塞IO&#xff1a;最常用&#xff0c;最简单&#xff0c;效率最低 2.非阻塞 IO--->fcntl&#xff1a;获取或设置fd所指定的文件描述符的属性 箭头地方二选一 3.IO多路复用&#xff1a;允许同时对多个IO进行控制 select&#xff1a;内核同时检测多个IO&#xff0c;一…

金额千位符自定义指令

自定义指令文件 moneyFormat.js /*** v-money 金额千分位转换*/export default {inserted: inputFormatter({// 格式化函数formatter(num, util) {if(num null || num || num undefined || typeof(num) undefined){return }if(util 万元 || util 万){return formatMone…

SHELL 基础 显示字符颜色, 修改历史命令,Linux里的命令 执行顺序

echo 打印命令 &#xff1a; 显示字符串 &#xff1a; [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo "this is SHELL language" this is SH…

vue 使用nvm控制node 版本,随意切换 node 版本

1.nvm 下载安装 https://github.com/coreybutler/nvm-windows/releases 找自己版本 1.安装版本 nvm list available // 查看所有node 版本 nvm install 版本号 // 安装指定版本号2.nvm 列表展示 nvm list //展示所有版本号3.nvm 切换环境 nvm use 版本号 // 切换版本4.…

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

目录 前言 一、监听按键并作出判断 二、持续移动 三、左右移动 总结&#xff1a; 前言 今天开始正式操控我们的小蜜蜂了&#xff0c;之前学java的时候是有一个函数监听鼠标和键盘的操作&#xff0c;我们通过传过来不同的值进行判断&#xff0c;现在来看看python是否一样的实现…

框架分析(1)-IT人必须会

框架分析&#xff08;1&#xff09;-IT人必须会 专栏介绍当今主流框架前端框架后端框架移动应用框架数据库框架测试框架 Angular关键特点和功能&#xff1a;组件化架构双向数据绑定依赖注入路由功能强大的模板语法测试友好 优缺点分析优点缺点 总结 专栏介绍 link 主要对目前市…

计算机竞赛 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

Datawhale 北邮分部成立了!

Datawhale分部 联合发起&#xff1a;陈玉立、陈逸涵、夏镇、李泽钜、邢植尧 蓟门以南&#xff0c;明光之北。杏坛向西&#xff0c;城垣东望。厚德博学&#xff0c;敬业乐群。 BYR&#xff0c;Datawhale北京邮电大学分部&#xff08;北邮AI俱乐部&#xff09;来啦&#xff01; …

微信好友恢复大师两招教你找回微信好友

在使用微信的时候&#xff0c;一些小伙伴可能没有给好友备注的习惯&#xff0c;所以很容易在清理“僵尸好友”时会不小心误删。如果您没有保存对方的联系方式&#xff0c;并且你们之间也没有共同好友&#xff0c;那么该如何重新加回好友呢&#xff1f;今天&#xff0c;小编就要…

Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

前言 ps&#xff1a;最近在参与3100保卫战&#xff0c;战况很激烈&#xff0c;刚刚打完仗&#xff0c;来更新一下之前写了一半的博客。 该篇针对日常写查询的时候&#xff0c;那些动态条件sql 做个简单的封装&#xff0c;自动生成&#xff08;抛砖引玉&#xff0c;搞个小玩具&a…

【已解决】Please install Node.js and npm before continuing installation.

给juopyter lab安装插件时报这个错 原因是&#xff0c;conda本身有nodejs&#xff0c;但是版本很低&#xff0c;只有0.几 所以需要卸载掉原来的nodejs&#xff0c;重新安装10版本以上的nodejs # 卸载命令 pip uninstall nodejs # 安装命令 conda install nodejs14.7.0 -c cond…

从入门到精通:微信小程序跳转页面的实用指南

前言 微信小程序中页面跳转方法的灵活运用不仅可以提升用户体验&#xff0c;还能为应用增添更多创意和吸引力。本文将为大家详细介绍微信小程序跳转页面的方法&#xff0c;让你的应用与众不同&#xff0c;为用户带来全新的体验。 方式一&#xff1a;wx.navigateTo 保留当前页面…

第1步---MySQL安装和配置

第1步---MySQL安装和配置 1.下载地址 MySQL :: Download MySQL Community Server (Archived Versions) 直接下载zip形式的就可以。 2.在bin的同级目录下常见my.ini文件。 输入下面的内容 my.ini中的文本&#xff1a; [mysqld] #设置3306端口 port3306 character-set-server…

DELL R740 R750服务器安装Windows 11

正常安装出现如下 2、同时按下ShiftF10组合键调出管理员命令提示符窗口&#xff0c;依次执行下面命令&#xff0c;输入命令&#xff0c;按Enter键执行&#xff0c;提示操作成功完成&#xff0c;才可以。这些命令可以添加注册表项&#xff0c;绕过TPM、安全启动、CPU、内存和硬盘…

Linux常用命令——diffstat命令

在线Linux命令查询工具 diffstat 显示diff命令输出信息的柱状图 补充说明 diffstat命令用来显示diff命令输出信息的柱状图&#xff0c;用以显示diff命令比较两个文件的不同统计信息。用户也可以直接使用|将diff命令所输出的结果直接送给diffstat命令进行统计结果的显示。使…

如何编写一个通用的函数?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 金句分享:…