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

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;//编写方法完成初始化@Beforepublic void init() {//获取到sqlSessionsqlSession = MyBatisUtils.getSqlSession();//sqlSession 返回的对象是 DefaultSqlSessionSystem.out.println("sqlSession--" + sqlSession.getClass());}//使用sqlSession原生的API调用我们编写的方法[了解]@Testpublic 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. 使用注解方式配置接口方法addMonster2. 回顾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;@Beforepublic void init() {//获取到sqlSessionsqlSession = MyBatisUtils.getSqlSession();monsterAnnotation = sqlSession.getMapper(MonsterAnnotation.class);//返回的依然是一个接口的代理对象System.out.println("monsterAnnotation--" + monsterAnnotation.getClass());}@Testpublic 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("保存成功...");}@Testpublic void findAllMonster() {//使用接口配置注解的方式操作DBList<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.mzph.cn/diannao/43216.shtml

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

相关文章

uni-app 封装http请求

1.引言 前面一篇文章写了使用Pinia进行全局状态管理。 这篇文章主要介绍一下封装http请求&#xff0c;发送数据请求到服务端进行数据的获取。 感谢&#xff1a; 1.yudao-mall-uniapp: 芋道商城&#xff0c;基于 Vue Uniapp 实现&#xff0c;支持分销、拼团、砍价、秒杀、优…

实用性提升百分之一百!!!【ONLYOFFICE 8.1版本】全方位深度性能测评

目录 【ONLYOFFICE 8.1 版本】全方位深度性能测评 一、界面与用户体验 二、文字处理功能 表格处理功能 演示文稿功能 协作与共享功能 性能与稳定性 总结 【ONLYOFFICE 8.1 版本】全方位深度性能测评 在当今数字化办公的时代&#xff0c;办公软件的选择对于提高工作效率和…

selenium处理cookie问题实战

1. cookie获取不完整 需要进入的资损平台(web)首页&#xff0c;才会出现有效的ctoken等信息 1.1. 原因说明 未进入指定页面而获取的 cookie 与进入页面后获取的 cookie 可能会有一些差异&#xff0c;这取决于网站的具体实现和 cookie 的设置方式。 通常情况下&#xff0c;一些…

【解决Windows11系统Windows Hello不能使用的问题】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Windows Hello是什么&#xff1f;二、使用步骤1.购买一个摄像头2.开始配置 三、异常解决1.内置管理员不能使用2.没找到合适的摄像头3.摄像头需要专用驱动4.…

原创作品——教育课程界面设计

教育行业UI界面设计需直观易懂&#xff0c;确保学习者能迅速上手&#xff0c;减少认知负担。布局清晰&#xff0c;导航便捷&#xff0c;功能按钮和图标设计应符合教育场景&#xff0c;直接支持学习目标的达成&#xff0c;促进高效学习体验。 通过丰富的互动元素&#xff08;如拖…

博途通讯笔记1:1200与1200之间S7通讯

目录 一、添加子网连接二、创建PUT GET三、各个参数的意义 一、添加子网连接 二、创建PUT GET 三、各个参数的意义

代码随想录(day1)二分法

if语句的基本语法 if 要判断的条件: 条件成立的时候&#xff0c;要做的事举例&#xff1a; if nums[middle]<target:leftmiddle1 while语句的基本语法&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)举例&#xff1a; while left<right:midd…

2通道音频ADC解码芯片ES7243L、ES7243E、ES7243,用于低成本实现模拟麦克风转换为IIS数字话筒

前言&#xff1a; 音频解码芯片某创参考价格&#xff1a; ES7243L 500&#xff1a;&#xffe5;1.36 / 个 ES7243E 500&#xff1a;&#xffe5;1.66 / 个 ES7243 500&#xff1a; &#xffe5;1.91 / 个 其中ES7243L工作电压为1.8V&#xff0c;与其他两款的3.3V工作电压不同&…

日本IT-SIER/SES的区别详情、契约形态等

一、SLER 主要的服务内容就是“帮客人开发系统或是各种APP&#xff0c;并在指定期间内交货&#xff0c;交货后也会持续进行运维等售后服务”。 客人很广泛&#xff0c;小到普通的服务业商家&#xff08;餐饮店/服饰店/美容业/电商&#xff09;大到各种公共/政府机关&#xff…

【面试题】串联探针和旁挂探针有什么区别?

在网络安全领域中&#xff0c;串联探针和旁挂探针&#xff08;通常也被称为旁路探针&#xff09;是两种不同部署方式的监控设备&#xff0c;它们各自具有独特的特性和应用场景。以下是它们之间的主要区别&#xff1a; 部署方式 串联探针&#xff1a;串联探针一般通过网关或者…

第一百四十九节 Java数据类型教程 - Java子字符串、字符串转换

Java数据类型教程 - Java子字符串 获取子字符串 我们可以使用substring()方法来获取字符串的子部分。 我们可以将开始索引作为参数&#xff0c;并返回一个从开始索引开始到字符串结尾的子串。 我们还可以将开始索引和结束索引作为参数。 它返回从开始索引开始的子字符串和小…

Windows右键没有新建Word、PPT与Excel的解决方法

本文介绍在Windows电脑中&#xff0c;右键与资源管理器的“新建”选项中&#xff0c;都没有新建Word、PPT或Excel文件的解决方法。 最近&#xff0c;发现一台重装了系统与Office的电脑中&#xff0c;无论是桌面上与资源管理器中的右键&#xff0c;还是资源管理器左侧顶部的“新…

手写简单模拟mvc

目录结构&#xff1a; 两个注解类&#xff1a; Controller&#xff1a; package com.heaboy.annotation;import java.lang.annotation.*;/*** 注解没有功能只是简单标记* .RUNTIME 运行时还能看到* .CLASS 类里面还有&#xff0c;构建对象久没来了&#xff0c;这个说明…

C++编译链接原理

从底层剖析程序从编译到运行的整个过程 三个阶段 一、编译阶段二、链接阶段三、运行阶段 为了方便解释&#xff0c;给出两端示例代码&#xff0c;下面围绕代码进行实验&#xff1a; //sum.cpp int gdata 10; int sum(int a,int b) {return ab; }//main.cpp extern int gdata…

初始redis:在Ubuntu上安装redis

1.先切换到root用户 使用su命令切换到root 2.使用apt命令来搜索redis相关的软件包 命令&#xff1a;apt search redis 3.下载redis 命令&#xff1a; apt install redis 在Ubuntu 20.04中 &#xff0c;下载的redis版本是redis5 4.查看redis状态 命令&#xff1a; netst…

Python自动化测试系列[v1.0.0][高效自动化设计]

Python多线程应用于自动化测试 将多线程在测试巧妙地应用&#xff0c;确实会带来很多好处&#xff0c;并且这是充分利用机器资源执行高效率测试很好的方式 # -*- coding: utf-8 -*- import threading from time import ctime import time from selenium import webdriverdef …

LLM 入门与实践(四) Yi 部署与分析

本文截取自20万字的《PyTorch实用教程》&#xff08;第二版&#xff09;&#xff0c;敬请关注&#xff1a;《Pytorch实用教程》&#xff08;第二版&#xff09;无论是零基础入门&#xff0c;还是CV、NLP、LLM项目应用&#xff0c;或是进阶工程化部署落地&#xff0c;在这里都有…

python对象

类 我们目前所学习的对象都是Python内置的对象但是内置对象并不能满足所有的需求&#xff0c;所以我们在开发中经常需要自定义一些对象类&#xff0c;简单理解它就相当于一个图纸。在程序中我们需要根据类来创建对象类就是对象的图纸&#xff01;我们也称对象是类的实例&#…

JAVA--IO流

一、IO流什么&#xff1f; I/O是Input/output的缩写&#xff0c;用于处理设备之间的数据传输。如读/写文件、网络通讯。 java程序中&#xff0c;对于数据的输入、输出是以流&#xff08;Stream)的方式进行。 Java.io包下提供了各种流类和接口&#xff0c;用以获取不同种类的数…

ELfK logstash filter模块常用的插件 和ELFK部署

ELK之filter模块常用插件 logstash filter模块常用的插件&#xff1a; filter&#xff1a;表示数据处理层&#xff0c;包括对数据进行格式化处理、数据类型转换、数据过滤等&#xff0c;支持正则表达式 grok 对若干个大文本字段进行再分割成一些小字段 (?<字段名…