简单学会MyBatis原生API注解

news2024/9/27 19:23:28

😀前言
本篇博文是关于MyBatis原生API&注解的使用,希望能够帮助到你😊

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

文章目录

  • 原生的API&注解的方式
    • MyBatis-原生的API 调用
      • 应用实例
        • 需求
        • 代码实现
    • MyBatis-注解的方式操作
      • 需求
      • 代码实现
      • 注意事项和说明
    • 😄总结

原生的API&注解的方式

MyBatis-原生的API 调用

应用实例

需求

感兴趣的可以看一下博主前面的项目----自己实现MyBatis 底层机制–抽丝剥茧(上).
在前面项目的基础上,将增删改查,使用MyBatis 原生的API 完成,就是直接通过SqlSession 接口的方法来完成。

1.增加 2. 删除

3.修改 4. 查询

代码实现

  1. 创建src\test\java\com\nlc\mapper\MyBatisNativeTest.java, 完成添加数据
public class MyBatisNativeTest {
    //这个是Sql 会话,通过它可以发出sql 语句
    private SqlSession sqlSession;
    private MonsterMapper monsterMapper;
 
    @Before
    public void init() throws Exception {
        //通过SqlSessionFactory 对象获取一个SqlSession 会话
        sqlSession = MyBatisUtils.getSqlSession();
        //获取MonsterMapper 接口对象, 该对象实现了MonsterMapper
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        System.out.println(monsterMapper.getClass());
    }
    //使用sqlSession 原生的API 调用我们编写的方法
    @Test
    public void myBatisNativeCrud() {
        //=============add start==================
        Monster monster = new Monster();
        monster.setAge(200);
        monster.setBirthday(new Date());
        monster.setEmail("nlc100@sohu.com");
        monster.setGender(2);
        monster.setName("白骨精");
        monster.setSalary(9234.89);
     
        sqlSession.insert("com.nlc.mapper.MonsterMapper.addMonster", monster);
        //=============add end===================
        if (sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }
        System.out.println("操作成功!");
    }
}
  1. 修改src\test\java\com\nlc\mapper\MyBatisNativeTest.java, 完成删除/修改/查询数据.
//使用sqlSession 原生的API 调用我们编写的方法
@Test
public void myBatisNativeCrud() {
    //===========删除start======================
    sqlSession.delete("com.nlc.mapper.MonsterMapper.delMonster", 3);
    //===========删除end======================
    
    //===========update start======================
    Monster monster = new Monster();
    monster.setAge(300);
    monster.setBirthday(new Date());
    monster.setEmail("tn100@sohu.com");
 
    monster.setGender(2);
    monster.setName("狮驼国妖精");
    monster.setSalary(9234.89);
    monster.setId(7);
    sqlSession.update("com.nlc.mapper.MonsterMapper.updateMonster",
    monster);
    //===========update end======================
    
    //=========select start=================
    List<Monster> monsterList =  sqlSession.selectList ("com.nlc.mapper.MonsterMapper.findAllMonster");
    for (Monster monster : monsterList) {
    	System.out.println(monster);
    }
    //=========select end=================
    
    if (sqlSession != null) {
        sqlSession.commit();
        sqlSession.close();
     
    }
    System.out.println("操作成功!");
}
  1. 完成测试

MyBatis-注解的方式操作

需求

在前面项目的基础上,将增删改查,使用MyBatis 的注解的方式完成
1.增加 2.删除
3.修改 4.查询

代码实现

  1. 创建src\main\java\com\nlc\mapper\MonsterAnnotation.java
public interface MonsterAnnotation {
    //添加方法,将我们的sql 语句直接写在@Insert 注解即可
    @Insert("INSERT INTO monster (age,birthday,email,gender,name,salary) "
    + "VALUES(#{age},#{birthday},#{email},#{gender},#{name},#{salary})")
    public void addMonster(Monster monster);

    //根据id 删除一个Monster
    @Delete("DELETE FROM monster "
    + "WHERE id=#{id}")
    public void delMonster(Integer id);
    
    //修改Monster
    @Update("UPDATE monster SET age=#{age}, birthday=#{birthday}, "
    + "email = #{email},gender= #{gender}, "
    + "name=#{name}, salary=#{salary} "
    + "WHERE id=#{id}")
    public void updateMonster(Monster monster);
    
    //查询-根据id
    @Select("SELECT * FROM monster WHERE "
    + "id = #{id}")
    public Monster getMonsterById(Integer id);
    
    //查询所有的Monster
    @Select("SELECT * FROM monster ")
    public List<Monster> findAllMonster();
}
  1. 修改mybatis-config.xml , 对MonsterAnnotaion 进行注册
<!-- 这里会引入(注册)我们的Mapper.xml 文件-->
<mapper resource="com/nlc/mapper/MonsterMapper.xml"/>
<!--
    1. 如果是通过注解的方式,可不再使用MonsterMapper.xml
    2. 但是需要在mybatis-config.xml 注册含注解的类
-->
<mapper class="com.nlc.mapper.MonsterAnnotation"/>
  1. 创建com\nlc\mapper\MonsterAnnotationTest.java , 完成测试
public class MonsterAnnotationTest {
    //这个是Sql 会话,通过它可以发出sql 语句
    private SqlSession sqlSession;
    @Before
    public void init() throws Exception {
        //通过SqlSessionFactory 对象获取一个SqlSession 会话
        sqlSession = MyBatisUtils.getSqlSession();
    }
    //测试通过注解的方式来完成接口中方法的实现
    //其它的删除,修改,查询是一样一样,自己测试即可
    @Test
    public void addMonster() {
        Monster monster = new Monster();
        monster.setAge(500);
        monster.setBirthday(new Date());
        monster.setEmail("nlc@sohu.com");
        monster.setGender(2);
        monster.setName("白虎精");
        monster.setSalary(9234.89);
        MonsterAnnotation monsterAnnotation =
        sqlSession.getMapper(MonsterAnnotation.class);
        monsterAnnotation.addMonster(monster);
        //增删改,需要提交事务
        if (sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }
        System.out.println("操作成功");
    }
}

注意事项和说明

  1. 如果是通过注解的方式, 就不再使用MonsterMapper.xml 文件, 但是需要在mybatis-config.xml 文件中注册含注解的类/接口。
  2. 使用注解方式,添加时, 如果要返回自增长id 值, 可以使用@Option 注解, 组合使用
@Insert(value = "INSERT INTO `monster` (`age`, `birthday`, `email`, `gender`, `name`,`salary`) " +
"VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public void addMonster(Monster monster);
  1. 在Junit 进行添加/查询测试即可。

😄总结

  1. 原生API的使用方法有很多,我们在使用时要弄清楚自己需要使用的是哪一个。
  2. 不清楚用哪一个的时候可以尝试去猜一下,猜它的参数、猜它的类型,看看哪个符合条件。
  3. 使用注解时需要在mybatis-config.xml 注册含注解的类,否则无法使用。
  4. SQL语句最好先在Navicat上测试一下,否则SQL语句不正确。

😁热门专栏推荐
手写底层机制篇–
自己实现MyBatis 底层机制–抽丝剥茧(上).
揭开神秘的面纱–自己实现MyBatis 底层机制[下]

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

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

相关文章

2023深圳杯数学建模B题

B题 电子资源版权保护问题 版权又称著作权&#xff0c;包括发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及应当由著作权人享有的其他权利。 在计算机网络广泛应用的今…

39.手机导航

手机导航 html部分 <div class"phone"><div class"content"><img class"active" src"./static/20180529205331_yhGyf.jpeg" alt"" srcset""><img src"./static/20190214214253_hsjqw…

基于 ThinkPHP 5.1(稳定版本) 开发wms 进销存系统源码

基于ThinkPHP 5.1&#xff08;LTS版本&#xff09;开发的WMS进销存系统源码 管理员账号密码&#xff1a;admin 一、项目简介 这个系统是一个基于ThinkPHP框架的WMS进销存系统。 二、实现功能 控制台 – 权限管理&#xff08;用户管理、角色管理、节点管理&#xff09; – 订…

BUUCTF——reverse3 适合新手的关于base64加密算法代码的分析

作为一个逆向小白&#xff0c;学了点加密算法就来BUU找点乐子&#xff0c;前7题蛮简单的&#xff0c;然后做到了reverse3&#xff0c;典型的base64加密算法&#xff0c;让我折腾了好久&#xff0c;写篇博客记录一下 顺便说下很多博客并没有对这里的加密算法进行代码上的分析&a…

秋招备战笔试Day1

目录 单选 1. 在 Java 中&#xff0c;存放字符串常量的对象属于&#xff08; &#xff09;类对象。 2.已知如下类定义&#xff1a; 如下哪句可以正确地加入子类中&#xff1f; 3. 下列选项中属于面向对象编程主要特征的是&#xff08;&#xff09; 4.关于下列程序段的输出结…

并发编程可能出现的核心问题

2.1非可见性 如果主内存里有个静态变量flagfalse&#xff0c;然后线程A和B在工作内存都需要操作flag&#xff0c;线程A是while(!false){}&#xff0c;而线程B将flag改为true&#xff0c;但是由于线程A和线程B之间工作内存互相不可见&#xff0c;线程A就会陷入死循环。 2.2指令…

排序链表——力扣148

文章目录 题目描述法一 自顶向下归并排序法二&#xff09;自底向上归并排序 题目描述 题目的进阶问题要求达到 O(nlogn) 的时间复杂度和 O(1) 的空间复杂度&#xff0c;时间复杂度是 O(nlogn) 的排序算法包括归并排序、堆排序和快速排序&#xff08;快速排序的最差时间复杂度是…

【RabbitMQ(day2)】默认(直连)交换机的应用

文章目录 一、第一种模型&#xff08;Hello World&#xff09;二、第二种模型&#xff08;work queue&#xff09;自动确认机制的后果和公平分配 三、阐述默认交换机 这篇博客是以下资料学后的总结&#xff1a; 不良人的RabbitMQ的教学视频 官方启动教程 RabbitMQ中文文档 一、…

php 生成连续递增的Excel列索引 可以控制多少列

今天遇到需要生成对应的下拉&#xff0c;下拉的类 需要PHP 输出一个数组 如 A、B、C、D 到Z 列后 Excel 的列就变成 AA 、AB、 AC 依次类推 查询得知 Excel 最大列数 16384 最大行数 1048576 下面演示3000列或行 <?php$idx [idx > 0];for ($i …

WIZnet W6100-EVB-Pico 静态IP配置教程(二)

W6100是全球第一款支持IPv4/IPv6双核的新一代全硬件以太网TCP/IP协议栈控制器。W6100在WIZnet核心专利技术——全硬件TCP/IP协议栈IPv4的基础上增加了IPv6&#xff0c;解决了嵌入式以太网的接入问题&#xff0c;简单易用&#xff0c;安全稳定&#xff0c;是物联网设备的首选解决…

某文化馆三维建模模型-glb格式-三维漫游-室内导航测试

资源描述 某文化馆某个楼层的三维建模模型&#xff0c;glb格式&#xff0c;适用于three.js开发&#xff0c;可用来做一些三维室内漫游测试和室内导航测试 资源下载地址

Java框架学习(三)spring5高级49讲

文章目录 1、BeanFactory与ApplicationContext2、BeanFactory与ApplicationContext的容器实现BeanFactory的容器实现后处理器排序 ApplicationContext的容器实现 3、Bean的生命周期Bean后处理器 4、常见的Bean后处理器5、常见BeanFactory后处理器6、Aware和InitializingBean接口…

移动零——力扣283

题目描述 双指针 class Solution{ public:void moveZeroes(vector<int>& nums){int n nums.size(), left0, right0;while(right<n){if(nums[right]){swap(nums[right], nums[left]);left;}right;}} };

Golang之路---02 基础语法——常量 (包括特殊常量iota)

常量 //显式类型定义const a string "test" //隐式类型定义const b 20 //多个常量定义 const(c "test2"d 2.3e 27)iota iota是Golang语言的常量计数器&#xff0c;只能在常量表达式中使用 iota在const关键字出现时将被重置为0&#xff0c;const中每新…

Flowable-任务-接受任务

定义 接收任务是一种简单任务&#xff0c;它会等待对应消息的到达。当流程执行到达接收任务时&#xff0c;流程状态会持 久化到数据库中&#xff0c;这意味着该流程将一直处于等待状态&#xff0c;直到引擎接收到一个特定的消息为止&#xff0c;该消息 将触发离开接收任务继续…

Echarts 文字太长用省略号代替

xAxis: [{type: category,data: [materialUserEchartsDate.value[0] ? materialUserEchartsDate.value[0].name : ,materialUserEchartsDate.value[1] ? materialUserEchartsDate.value[1].name : ,materialUserEchartsDate.value[2] ? materialUserEchartsDate.value[2].na…

JAVASE---数据类型与变量

1. 字面常量 常量即程序运行期间&#xff0c;固定不变的量称为常量&#xff0c;比如&#xff1a;一个礼拜七天&#xff0c;一年12个月等。 public class Demo{ public static void main(String[] args){ System.Out.println("hello world!"); System.Out.println(…

HDFS中数据迁移的使用场景和考量因素

HDFS中数据迁移的使用场景和考量因素 数据迁移使用场景数据迁移要素考量HDFS分布式拷贝工具-DistCpdistcp的优势性能命令 数据迁移使用场景 冷热集群数据同步、分类存储集群数据整体搬迁 当公司业务迅速的发展&#xff0c;导致的当前的服务器数量资源出现临时紧张的时候&#…

2,继承、内联函数、虚继承、友元、构造析构函数、初始化列表

继承 2.1结构体成员权限2.1.1访问权限2.1.2类与结构体 2.2类的成员函数2.2.1类内规则2.2.2类成员内联函数inline 2.3类的继承2.3.1类的继承与成员函数2.3.2类的多继承2.3.2.1类的多继承&#xff1a;菱形问题提出 2.3.3类的虚继承&#xff08;关键字virtual&#xff09; 2.4友元…

Zookeeper入门介绍

Zookeeper在我本次系统的学习之前是已经开始使用了&#xff0c;但是并不理解Zookeeper到底是什么&#xff0c;有什么作用&#xff0c;你或许跟我有一样的疑惑&#xff0c;本专栏将会解决这些疑惑。 目录 Zookeeper介绍&#xff1a; zookeeper特点&#xff1a; 数据结构&#x…