认识Mybatis并实现增删查改

目录

一.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;
//    设置身份idprivate 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;}@Overridepublic 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 mapperPUBLIC "-//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 {@Testpublic 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);
//        通过代理对象调用方法insertUserint 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 mapperPUBLIC "-//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 {@Testpublic 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 {@Testpublic 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 mapperPUBLIC "-//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 {@Testpublic 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();}
}


深度了解Mybatis的核心配置

Mybatis的核心配置_Alphamilk的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 热题 100(五):54. 螺旋矩阵、234. 回文链表、21. 合并两个有序链表

题目一&#xff1a; 54. 螺旋矩阵https://leetcode.cn/problems/spiral-matrix/ 题目要求&#xff1a; 思路&#xff1a;一定要先找好边界。如下图 &#xff0c;上边界是1234&#xff0c;右边界是8、12&#xff0c;下边界是9、10、11&#xff0c;左边界是5&#xff0c;所以可…

Unity如何控制声音大小(包括静音功能)

一&#xff1a;UGUI制作 1. 首先在【层级】下面创建UI里面的Slider组件。设置好它对应的宽度和高度。 2.调整Slider滑动条的填充颜色。一般声音颜色我黄色&#xff0c;所以我们也调成黄色。 我们尝试滑动Slider里面的value。 a.滑动前。 b.滑动一半。 c.滑动完。 从以上滑动va…

LeetCode235. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 文章目录 [235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)一、题目二、题解方法一&#xff1a;递归方法二&#xff1a;迭代 一、题目 给定一个二叉搜索树, 找到该树中两个指定…

恢复NuGet包_解决:System.BadImageFormatException:无法加载文件或程序集

C#工程 主要是开发了一个 web api接口&#xff0c;这个工程源码去年还可以的&#xff0c;今年换了一个电脑打开工程就报错。 错误提示如下&#xff1a; 在 Microsoft.CodeAnalysis.CSharp.CommandLine.Program.Main(String[] args) Test1 System.BadImageFormatEx…

【腾讯云 TDSQL-C Serverless 产品体验】基于腾讯云轻量服务器以及 TDSQL-C 搭建 LNMP WordPress 博客系统

文章目录 一、前言二、数据库发展与云原生数据库2.1 数据库发展简介2.2 云原生数据库简介2.2.1 云数据库与云原生数据库区别 三、腾讯云 TDSQL-C 数据库3.1 什么是腾讯云 TDSQL-C 数据库3.2 为什么推出 TDSQL-C 数据库&#xff1f;传统 MySQL 架构存在较多痛点3.2.1 传统 MySQL…

Spring讲解和ioc用途及Web容器的整合

目录 一、Spring概述 ( 1 ) 背景 ( 2 ) 是什么 ( 3 ) 核心特性 二、Spring中的ioc 2.1 讲解 2.2 主要功能 2.3 实例演示 三、注入方式 3.1 set注入 3.2 构造注入 3.3 接口注入 四、Web容器整合 4.1 思考 4.2 实操 对我们的收获 一、Spring概述 ( 1 ) 背景 Spr…

EasyExcel工具 Java导出Excel表数据

EasyExcel 优点坐标依赖读Excel最简单的读的对象写Excel最简单的写的对象最简单的读的监听器填充Excel简单填充(对象)复杂填充(对象和列表)官网:https://easyexcel.opensource.alibaba.com/ EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。…

aosp-刷入Magisk面具获取root权限

作者&#xff1a;上山打鼠 一、简介 话说上次root手机都已经是初中的时候了&#xff0c;那时候捣鼓手机不亦乐乎&#xff0c;Android4.4的系统先解锁&#xff0c;再刷入第三方Recovery&#xff0c;然后再刷入Root包去获取Root权限 想学点逆向的知识&#xff0c;所以要root一下…

Redis中的有序集合及其底层跳表

前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合&#xff0c;他底层是使用压缩列表和跳表实现的&#xff0c;和Java中的HashMap底层数据结构&#xff08;1.8&#xff09;链表红黑树异曲同工之妙…

微服务概述-7

Shiro 框架 Shiro 是一个用于 Java 应用程序的安全框架。它提供了身份验证、授权、加密和会话管理等功能&#xff0c;可以帮助开发人员构建安全可靠的应用程序。 Java 中针对权限管理常见的有 2 个著名的框架&#xff1a;spring security 和 shiro shiro 基本概念 credentia…

我的创作纪念日(C++修仙练气期总结)

分享自己最喜欢的一首歌&#xff1a;空想フォレスト—伊東歌詞太郎 机缘 现在想想自己在CSDN创作的原因&#xff0c;一开始其实就是想着拿着博客当做自己的学习笔记&#xff0c;笔记嘛&#xff0c;随便写写&#xff0c;自己看得懂就ok了的态度凸(艹皿艹 )。也是用来作为自己学习…

iOS 17 正式版预计 9 月中下旬发布,部分新功能延后推出

苹果公司预计将在 9 月中下旬推出 iOS 17 正式版&#xff0c;iPhone XS 及更新的机型可免费更新。这次更新包含了许多新功能&#xff0c;但是根据苹果公司的网站显示&#xff0c;并不是所有的功能都会立即可用。苹果表示有一些功能“将在今年晚些时候推出”&#xff0c;比如&am…