MyBatis框架学习笔记(二):原生API 的调用 和 注解的使用

news2024/9/28 21:22:30

1 MyBatis原生API

1.1 原生API 快速入门需求

在笔记一案例的基础上将增删改查,使用 MyBatis 原生的 API 完成,就是直接通过SqlSession 接口的方法来完成

1.2 原生API 快速入门-代码实现 

src\test\java\com\hspedu\mapper\MyBatisNativeTest.java

package com.mapper;

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

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

/**
 * MyBatisNativeTest: 演示使用MyBatis原生API操作
 */
public class MyBatisNativeTest {

    //属性
    private SqlSession sqlSession;

    //编写方法完成初始化
    @Before
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //sqlSession 返回的对象是 DefaultSqlSession
        System.out.println("sqlSession--" + sqlSession.getClass());

    }

    //使用sqlSession原生的API调用我们编写的方法[了解]
    @Test
    public void myBatisNativeCrud() {

        //添加
        /**
         *
         *  @Override
         *   public int insert(String statement, Object parameter) {
         *     return update(statement, parameter);
         *   }
         *
         *   statement: 就是接口方法-完整声明
         *   parameter: 入参
         */

        //Monster monster = new Monster();
        //monster.setAge(100);
        //monster.setBirthday(new Date());
        //monster.setEmail("kate2@qq.com");
        //monster.setGender(0);
        //monster.setName("大象精-100");
        //monster.setSalary(10000);
        //
        //int insert =
        //        sqlSession.insert("com.mapper.MonsterMapper.addMonster", monster);
        //
        //System.out.println("insert---" + insert);
        //删除

        //int delete = sqlSession.delete("com.mapper.MonsterMapper.delMonster", 11);
        //System.out.println("delete--" + delete);

        //修改

        //Monster monster = new Monster();
        //monster.setAge(20);
        //monster.setBirthday(new Date());
        //monster.setEmail("kate3@qq.com");
        //monster.setGender(1);
        //monster.setName("牛魔王-100");
        //monster.setSalary(1000);
        //monster.setId(10);//这个一定要有,如果没有就不知道修改哪个对象
        //int update =
        //        sqlSession.update("com.mapper.MonsterMapper.updateMonster", monster);
        //System.out.println("update--" + update);

        //查询

        List<Monster> monsters =
                sqlSession.selectList("com.mapper.MonsterMapper.findAllMonster");

        for (Monster monster : monsters) {
            System.out.println("monster--" + monster);
        }

        //如果是增删改, 需要提交事务
        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("操作成功...");
    }
}

2 MyBatis注解的使用

2.1 注解方式快速入门需求 

在前面项目的基础上,将增删改查,使用 MyBatis 的注解的方式完成 

2.2 注解快速入门-代码实现

(1)创 建 src\main\java\com\mapper\MonsterAnnotation.java

package com.mapper;

import com.entity.Monster;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * MonsterAnnotation: 使用注解的方式来配置接口方法
 */
public interface MonsterAnnotation {

    //添加monster
    /*
       1. 使用注解方式配置接口方法addMonster
       2. 回顾xml如何配置
       <insert id="addMonster" parameterType="Monster" useGeneratedKeys="true" keyProperty="id">
            INSERT INTO `monster`
            (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
            VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
        </insert>

        解读
        1. useGeneratedKeys = true 返回自增的值
        2. keyProperty = "id" 自增值对应的对象属性
        3. keyColumn = "id" 自增值对应的表的字段


     */
    @Insert("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);

    //根据id删除一个Monster
    /*
        xml文件中的配置
        <delete id="delMonster" parameterType="Integer">
            DELETE FROM `monster` WHERE id = #{id}
        </delete>
     */
    @Delete("DELETE FROM `monster` WHERE id = #{id}")
    public void delMonster(Integer id);

    //修改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>
     */
    @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
    /*
        xml配置
        <select id="getMonsterById" resultType="Monster">
            SELECT * FROM `monster` WHERE id = #{id}
        </select>
     */
    @Select("SELECT * FROM `monster` WHERE id = #{id}")
    public Monster getMonsterById(Integer id);

    //查询所有的Monster
    /*
        xml配置
        <select id="findAllMonster" resultType="Monster">
            SELECT * FROM `monster`
        </select>
     */
    @Select("SELECT * FROM `monster`")
    public List<Monster> findAllMonster();
}

(2)修改 mybatis-config.xml , MonsterAnnotaion 进行注册

<mappers>
    <mapper class="com.mapper.MonsterAnnotation"/>
</mappers>

 (3)src\test\java\com\hspedu\mapper\MonsterAnnotationTest.java , 完成测试

package com.mapper;

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

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

public class MonsterAnnotationTest {

    //属性
    private SqlSession sqlSession;
    private MonsterAnnotation monsterAnnotation;

    @Before
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        monsterAnnotation = sqlSession.getMapper(MonsterAnnotation.class);
        //返回的依然是一个接口的代理对象
        System.out.println("monsterAnnotation--" + monsterAnnotation.getClass());
    }

    @Test
    public void addMonster() {

        Monster monster = new Monster();
        monster.setAge(30);
        monster.setBirthday(new Date());
        monster.setEmail("kate6@qq.com");
        monster.setGender(1);
        monster.setName("狐狸精-100");
        monster.setSalary(1000);
        //使用在接口方法配置注解方式完成对DB操作
        monsterAnnotation.addMonster(monster);
        System.out.println("添加后monster-id-" + monster.getId());

        //如果是增删改, 需要提交事务
        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("保存成功...");

    }

    @Test
    public void findAllMonster() {

        //使用接口配置注解的方式操作DB
        List<Monster> allMonster = monsterAnnotation.findAllMonster();
        for (Monster monster : allMonster) {
            System.out.println("monster--" + monster);
        }


        if(sqlSession != null) {
            sqlSession.close();
        }

        System.out.println("查询成功...");
    }
}

 测试结果如下

2.3 注意事项和说明 

(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);

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

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

相关文章

BUG: npm error `electron_mirror` is not a valid npm option

npm error electron_mirror is not a valid npm option 环境 windows 11 node v20.15.0 npm v10.7.0详情 在运行 npm run mirror 命令时出现错误。这是一个设置镜像的命令。 我是没事干了&#xff0c;运行这个命令&#xff0c;这个命令在我这里根本就是运行不了。这个命令一…

完美解决AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘的正确解决方法,亲测有效!!!

完美解决AttributeError: ‘DataFrame’ object has no attribute ix’的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决AttributeError: DataFrame object has no attribute ix的正确解决方法&#xff0c;亲测有效&#xff01;&…

服务器数据恢复—同品牌不同系列服务器raid5阵列数据恢复方案分析

RAID5磁盘阵列数据恢复案例一&#xff1a; 服务器数据恢复环境&#xff1a; 一台某品牌LH6000系列服务器&#xff0c;通过NetRaid阵列卡将4块硬盘组建为一组RAID5磁盘阵列。操作系统都为Window server&#xff0c;数据库是SQLServer。 服务器故障&#xff1a; LH6000系列服务器…

并发编程工具集——StampedLock-比ReadWriteLock更快的锁(上篇)(十八)

StampedLock 支持的三种锁模式 写锁、悲观读锁和乐观读 StampedLock与ReadWriteLock的异同 ReadWriteLock支持两种&#xff1a;读锁、写锁相同点&#xff1a;其中&#xff0c;写锁、悲观读锁的语义和 ReadWriteLock 的写锁、读锁的语义非常类似&#xff0c;允许多个线程同时获取…

tessy 单元测试:小白入门指导手册

目录 1,创建单元测试工程目录 2,导入单元测试源文件 一:创建测试文件夹(最好和代码目录一一对应,方便查找) 二:选择测试环境 三:添加源文件 四:分析源文件 3,编写单元测试用例 一:设置函数参数的传输方向 二:添加单元测试用例 三:编辑单元测试用例数据 …

MATLAB中d2c函数用法

目录 语法 说明 示例 将离散时间传递函数转换为连续时间 将识别出的离散时间传递函数转换为连续时间 在将已识别的离散时间传递函数模型转换为连续时间模型后&#xff0c;重新生成协方差信息 d2c函数的功能是将模型从离散时间转换为连续时间。 语法 sysc d2c(sysd) sy…

atcoder 357 F Two Sequence Queries (线段树板子)

题目&#xff1a; 分析&#xff1a; 线段树 代码&#xff1a; // Problem: F - Two Sequence Queries // Contest: AtCoder - SuntoryProgrammingContest2024&#xff08;AtCoder Beginner Contest 357&#xff09; // URL: https://atcoder.jp/contests/abc357/tasks/abc357_…

【最新鸿蒙应用开发】——Navigation路由管理

Navigation路由 1.引言 一多开发的项目适合使用Navigation进行统一的页面路由管理。Navigation还提供统一的标题栏、工具栏、菜单栏&#xff0c;并且自带导航返回功能。另外&#xff0c;Navigation还支持一些Router不支持的功能&#xff0c;比如&#xff1a;自带的路由拦截功…

运行时异常与一般异常的异同

运行时异常与一般异常的异同 1、运行时异常&#xff08;Runtime Exception&#xff09;1.1 特点 2、 一般异常&#xff08;Checked Exception&#xff09;2.1 特点 3、异同点总结3.1 相同点3.2 不同点 4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷…

Transformer构架的优劣及常见问题

Transformer构架的优劣 优点 长距离依赖关系建模&#xff1a;通过自注意力机制&#xff0c;Transformer能够有效捕捉长距离依赖关系&#xff0c;适用于处理长序列和涉及远距离语义关系的任务。并行计算能力&#xff1a;多头注意力机制的并行计算特性极大提高了训练和推理效率…

卫星系统三种编码模式数字、模拟电视的区别

卫星系统三种编码模式 CCM----固定编码模式 ACM----自适应编码模式 VCM----可变编码调制模式 DTV——Digital TV &#xff08;即输入数字信号&#xff09;中文意思是数字电视,是指将活动图像、声音和数据&#xff0c;通过数字技术进行压缩、编码、传输、存储&#xff0c;实时…

图形学各种二维基础变换,原来线性代数还能这么用,太牛了

缩放变换 均匀缩放 若想将一个图形缩小0.5倍 若x乘上缩放值s等于x撇&#xff0c;y同理&#xff0c;则 x ′ s x y ′ s y \begin{aligned} & x^{\prime}s x \\ & y^{\prime}s y \end{aligned} ​x′sxy′sy​&#xff0c;这样就表示了x缩小了s倍&#xff0c;y也是…

UML中用例和用例图的概念

用例 用例模型的基本组成部分有用例、参与者&#xff08;或角色&#xff09;和系统。用例用于描述系统的功能&#xff0c;也就是从用户的角度来说&#xff0c;系统具体应包含哪些功能&#xff0c;从而帮助分析人员理解系统的行为。它是对系统功能的宏观的、整体的描述。一个完…

挑战杯 opencv python 深度学习垃圾图像分类系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; opencv python 深度学习垃圾分类系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这是一个较为新颖的竞…

ubuntu 分区情况

ubuntu系统安装与分区指南 - Philbert - 博客园 (cnblogs.com)https://www.cnblogs.com/liangxuran/p/14872811.html 详解安装Ubuntu Linux系统时硬盘分区最合理的方法-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1711884

VScode免密链接ubuntu

Ubuntu 下载&#xff1a; sudo apt-get install openssh-serverps -e | grep sshd参考IP &#xff1a; ifconfig VScode配置 重新尝试连接&#xff0c;输入的密码是虚拟机用户密码 免密链接 Windows生成公钥 1、打开CMD 2、输入命令ssh-keygen 3、连续回车确认即可生成 …

矩阵式键盘最小需要多少个IO驱动

1. 概述 矩阵式键盘由于有其占用硬件资源少的优点有着极其广泛的应用&#xff0c;如PC键盘、电话按键、家用电器等等这类产品.矩阵键盘的基本原理如下所示&#xff08;仅是原理示例&#xff0c;实际实现上还会为每个按键加上防倒流的二极管解决“鬼影”问题&#xff09;&#x…

B端全局导航:左侧还是顶部?不是随随便便,有依据在。

一、什么是全局导航 B端系统的全局导航是指在B端系统中的主要导航菜单&#xff0c;它通常位于系统的顶部或左侧&#xff0c;提供了系统中各个模块和功能的入口。全局导航菜单可以帮助用户快速找到和访问系统中的各个功能模块&#xff0c;提高系统的可用性和用户体验。 全局导航…

【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

稀疏建模介绍,详解机器学习知识

目录 一、什么是机器学习&#xff1f;二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习&#xff1f; 机器学习是一种人工智能技术&#xff0c;它使计算机系统能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。它涉及到使用算…