MyBatis注解开发---实现增删查改和动态SQL

news2024/10/6 20:36:02

目录

1. 环境搭建

(1)创建持久层接口,并在接口方法上定义Sql语句  

(2)测试方法 

(3)运行结果

2. 注解实现增删查改

(1)增加用户

(2)删除用户

(3)模糊查询用户

(4)更新用户信息

3. 注解实现动态sql

(1)使用脚本标签实现动态Sql

(2)在方法中构建动态Sql


1. 环境搭建

        MyBatis可以使用注解替代映射文件。映射文件的作用就是定义Sql语句,可以在持久层接口上使用

@Select/@Delete/@Insert/@Update定义Sql语句,这样就不需要使用映射文件了。

1

创建maven工程,引入依赖(可以直接复制之前maven工程的pom.xml文件)

2

创建mybatis核心配置文件SqlMapConfig.xml

3

log4j.properties文件放入resources中,让控制台打印SQL语句。

4

创建实体类(直接吧之前的实体类cv过来即可)

  (1)创建持久层接口,并在接口方法上定义Sql语句  

package com.example.mapper;

import com.example.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {

    // 查询所有用户
    @Select("select * from user")
    List<User> findAll();
}

        由于注解在方法上方,而方法中就有参数类型和返回值类型,所以使用注解开发不需要定义参数类型和返回值类型

        在核心配置文件注册持久层接口,由于没有映射文件,所以只能采用注册接口或注册包的方法。(如下代码段所示)

    <mappers>
        <package name="com.example.mapper"/>
    </mappers>

(2)测试方法 

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class testUserMapper {
    InputStream is = null;
    SqlSession session = null;
    UserMapper userMapper = null;

    @Before
    public void before() throws Exception{
        is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        session = factory.openSession();
        userMapper = session.getMapper(UserMapper.class);
    }

    @After
    public void after() throws Exception{
        session.close();
        is.close();
    }

    @Test
    public void testFindAll(){
        List<User> all = userMapper.findAll();
        all.forEach(System.out::println);
    }
}

(3)运行结果

        实现的效果也是和使用映射文件一样的。 

2. 注解实现增删查改

(1)增加用户

添加方法和对应的注解

// 添加用户
    @SelectKey(keyColumn = "id",keyProperty = "id",resultType = int.class,before = false,statement = "SELECT LAST_INSERT_ID()")
    @Insert("insert into user(username,sex,address) values(#{username},#{sex},#{address})")
    void add(User user);

        其实这里已经使用了主键回填功能,新增用户的时候无需设置用户id 

测试方法

// 测试增删查改方法
    @Test
    public void testADSU(){
        // 新增一个用户
        User user = new User("凉哥","男","北京");
        userMapper.add(user);
        session.commit();
}

运行结果

        OK,观察我们确实是添加了凉哥 

(2)删除用户

添加方法和对应的注解

// 删除用户
    @Delete("delete from user where id = #{id}")
    void delete(int id);

测试方法

@Test
    public void testADSU(){
        /*// 新增一个用户
        User user = new User("凉哥","男","北京");
        userMapper.add(user);
        session.commit();*/
        // 删除用户
        userMapper.delete(27);
        session.commit();
}

运行结果

        OK,观察运行结果我们也得知确实是将凉哥给删掉了 

(3)模糊查询用户

添加方法和对应的注解

// 根据用户名模糊查询
    @Select("select * from user where username like #{username}")
    List<User> findByUsernameLike(String username);

测试方法

        我们查询一下姓名带有man的看看

// 测试增删查改方法
    @Test
    public void testADSU(){
        /*// 新增一个用户
        User user = new User("凉哥","男","北京");
        userMapper.add(user);
        session.commit();
        // 删除用户
        userMapper.delete(27);
        session.commit();*/
        // 根据用户名模糊查询
        List<User> users = userMapper.findByUsernameLike("%man%");
        users.forEach(System.out::println);
}

运行结果

 

        OK,通过与数据库表进行对比,确实是查询出来了 

(4)更新用户信息

添加方法和对应的注解

// 更新用户
    @Update("update user set username = #{username},sex=#{sex},address=#{address} where id = #{id}")
    void update(User user);

测试方法

// 测试增删查改方法
    @Test
    public void testADSU(){
        /*// 新增一个用户
        User user = new User("凉哥","男","北京");
        userMapper.add(user);
        session.commit();
        // 删除用户
        userMapper.delete(27);
        session.commit();*/
        // 根据用户名模糊查询
        /*List<User> users = userMapper.findByUsernameLike("%man%");
        users.forEach(System.out::println);*/
        // 更新用户
        User user1 = new User(24,"哈士奇","女","上海外滩");
        userMapper.update(user1);
        session.commit();
    }

         我们将哈哥的数据修改一下,看看是否能够成功修改

运行结果

        OK,确实是成功进行了修改了 

3. 注解实现动态sql

        前言,不过有一说一,这个注解开发动态Sql实现要比映射文件要难,符号要找对。

        MyBatis注解开发中有两种方式构建动态Sql

(1)使用脚本标签实现动态Sql

        将Sql 嵌套在 <script> 内即可使用动态 Sql 标签:

新增注解方法

// 根据任意条件查询--使用脚本标签
    @Select("<script>"+
        "select * from user \n" +
        "   <where>\n"+
        "       <if test=\"" +
        "            username != null and username.length() !=0 \">\n" +
        "            username like '%${username}%'\n" +
        "       </if>\n" +
        "       <if test=\"sex != null and sex.length() != 0\">\n" +
        "           and sex = #{sex}\n" +
        "       </if>\n" +
        "       <if test=\"address != null and address.length() != 0\">\n" +
        "           and address = #{address}\n" +
        "       </if>\n" +
        "   </where>" +
        "</script>")
    List<User> findByCondition(User user);

        这个是实现对用户名进行模糊查询,性别和地址进行精确查询 

新增测试方法

// 测试任意条件查询--使用脚本标签
    @Test
    public void testFindByCondition(){
        User user = new User("an","man","Beijing");
        List<User> all = userMapper.findByCondition(user);
        all.forEach(System.out::println);
    }

         查询名字带有an,并且性别是man,地址是Beijing的User.

运行结果

         OK,确实是将符合要求的用户都查询出来了

(2)在方法中构建动态Sql

        在MyBatis中有 @SelectProvider @UpdateProvider @DeleteProvider

@InsertProvider 注解。当使用这些注解时将不在注解中直接编写SQL, 而是调用某个类的方法来生成SQL

新增注解方法

// 根据任意条件查询--在方法中构建动态sql
    @SelectProvider
    default String findByConditionSql(User user){
        StringBuffer sb = new StringBuffer("select * from user where 1 = 1");
        if(user.getUsername()!=null && user.getUsername().length()!=0){
            sb.append("and username like '%${username}%'");
        }
        if(user.getSex()!=null && user.getSex().length()!=0){
            sb.append("and sex = #{sex}");
        }
        if(user.getAddress()!=null && user.getAddress().length()!=0){
            sb.append("and address = #{address}");
        }
        return sb.toString();
    }

新增测试方法

// 测试任意条件查询--方法标签动态生成Sql
    @Test
    public void testFindByConditionSql(){
        User user = new User("an","man","Beijing");
        List<User> all = userMapper.findByCondition(user);
        all.forEach(System.out::println);
    }

运行结果

        OK,确实同样也查询出来了 。

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

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

相关文章

【4.17】贪心算法入门

什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 刷题或者面试的时候&#xff0c;手动模拟一下感觉可以局部最优推出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。 贪心的解题步骤&#xff1f; 贪心算法一…

《人体地图》笔记

《人体地图》 坂井建雄 著 孙浩 译 腹部通向大腿的隧道 腹部与大腿的分界点是大腿根部&#xff0c;即是腹股沟。 腹壁肌肉连结在腹股沟韧带上&#xff0c;腹壁肌肉包括三层&#xff0c;分别为腹外斜肌、腹内斜肌和腹横肌&#xff0c;每块肌肉都有一个张开的小孔&#xff0c;…

【靶场设计和渗透】

目录 一、前言 二、靶场设计 1、局域网 2、说明 三、渗透测试 1、信息收集 2、漏洞利用 四、后渗透利用 1、提权 2、权限维持 一、前言 为了深入贯彻学习网络安全法律法规&#xff0c;深入学习渗透测试知识&#xff0c;强化实战技能............ 编不出来了&#xff…

The Sandbox 的 OliveX Fitness 之城来啦!

4 月 11 日至 17 日&#xff0c;亲自来体验一下吧&#xff01; 这种独特的体验将有趣和故事驱动的游戏与健身以及奖励结合起来。玩家可以探索隐藏的角落&#xff0c;逃出迷宫&#xff0c;爬上梯子&#xff0c;清除障碍&#xff0c;完成相互关联的任务&#xff0c;所以战略规划是…

Avue dynamic表单实现form单选,修改及新增项

Avue dynamic表单实现form单选&#xff0c;修改及新增项 AvueDialogFormTableViewOption.js /** Description:银行账号* Version: 1.0* Autor: Tj* Date: 2023-03-21 11:02:42*/ export const BankAccountOption (vueObj, formData) > {return {labelWidth: 100, //整体列…

【华为OD机试】1046 - 计算字符串的编辑距离

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1二、思路解析三、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f…

GDPU C语言 天码行空8

1. 求序列和 ⭐ 输出没有小数的浮点数 #include <stdio.h>double fun(int a, int n) {double res 0;int aa a,i;//aa 记录每一项for(i 1; i < n; i){res aa;aa aa * 10 a;}return res; }int main(){int a,n;scanf("%d %d", &a,&n);printf(&q…

Linux学习笔记——HTTPS协议

文章目录HTTPS是什么什么是加密为什么要进行加密常见的加密方式数据摘要与数据指纹数字签名HTTPS的工作过程探究方案1—只使对称加密方案2—只使非对称加密方案3—双方都是用非对称加密方案4—非对称加密对称加密中间人攻击证书方案5—非对称加密对称加密证书认证HTTPS是什么 H…

hypack单波束采集和处理基本流程

前两天有个读者问是否有单波束测深的操作和处理的步骤&#xff0c;在xiaok海洋测绘网上用关键字“单波束”搜索的结果就是确实没有相关的文章&#xff0c;相关的文章都是外业过程记录。下面以单波束XX&#xff08;可以是任何单波束&#xff09;和采集处理软件Hypack为例说明单波…

树莓派通过网线连接笔记本实现笔记本电脑Wifi的网络共享

基于windows电脑连接树莓派进行设置&#xff1a;通过通过一根网线&#xff0c;连接树莓派和电脑&#xff0c;使电脑和树莓派构成一个局域网&#xff0c;然后树莓派接收来自笔记本电脑wifi网络的共享网络。操作方法类似台式机通过网线共享笔记本电脑无线网络的步骤 1、 保证笔记…

[c++整人代码]超级加倍,让人承认自己是大傻猪

㊀程序介绍 这是本人看到的一个整人小病毒&#xff0c;唯一的杀伤力就是逼着你想坑的人承认他是猪。 本次更新&#xff1a;要求运行程序的人手动输入“我是猪”三个字 ㊁程序截图 1 本程序的窗口会自动保持最前 2 无法关闭本窗口 ㊂代码展示&#xff1a; #include <Wi…

【pinia持久化存储】使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储

简言 使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储。 存储方式 &#xff1a; localStoragesessionStorage pinia-plugin-persistedstate 中文官网 pinia 中文官网 安装 安装和使用 pinia &#xff0c;请参考使用pinia文章。 安装 pinia-plugin-pers…

使用PDF猫怎么将PNG图片转化成JPG格式图片?

如需了解更多办公应用的相关教程&#xff0c;可到赛效官方网站的应用资讯栏目或者应用问答栏目下查看更多。 TXT文本工具是微软操作系统上附带的一种文本格式&#xff0c;打开速度比较快&#xff0c;且记录文字内容时比较便捷且快速&#xff0c;但是很多时候记录成TXT文本的工…

八大排序算法(冒泡排序、快速排序、堆排序.....)

每坚持一天&#xff0c;offer就会离我更近一步&#x1f339; 文章目录冒泡排序选择排序插入排序希尔排序快速排序计数排序堆排序归并排序冒泡排序 算法描述&#xff1a;从第一个元素开始&#xff0c;两两比较&#xff0c;如果前者比后者大&#xff0c;那么就将两者进行交换&am…

[oeasy]python0133_[趣味拓展]颜文字_流石兄弟_表情文字_2ch_kaomoji

颜文字 回忆上次内容 上次我们了解unicode 里面有各种字体 甚至还有emoji emoji 本质上也是文字 按照unicode的方式编码存储时按照utf-8的方式编码显示时按照系统定义的方式进行显示 还有什么好玩的亚文化吗&#xff1f;&#x1f914; emoticon 1982 年 9 月 19 日 诞生了第…

docker安装rabbitmq的延迟队列插件

1.进入rabbitmq镜像 docker exec -it rabbitmq bash2.查看rabbitmq版本号&#xff0c;方便查找对应版本的延迟队列插件 rabbitmqctl version2.查询rabbitmq插件列表 rabbitmq-plugins list若没有rabbitmq_delayed_message_exchange-xxx.ez&#xff0c;则可以去[延迟队列插件…

win11家庭版 使用vm进行虚拟化的设置(此平台不支持虚拟化的 Intel VT-x/EPT。)

一、安装vm,进入BIOS设置虚拟化&#xff08;vm安装16.2以上版本&#xff09; 这个网上很多&#xff0c;就不说了 二、此时安装vm,创建虚拟机就没问题了&#xff0c;但是想继续再虚拟化&#xff0c;将会有一个问题“此平台不支持虚拟化的 Intel VT-x/EPT。” &#xff08;很多…

中移链系统合约管控功能介绍

中移链是在满足我国信息化监管需求、合规可控的前提下&#xff0c;打造的中国移动区块链服务平台。如果把中移链类比为计算机系统&#xff0c;那么系统合约就是中移链中的系统设置部分&#xff0c;用于配置和管理链的资源和行为。在计算机系统中,系统设置提供了对计算机系统的底…

SE11/SM30 维护视图

文章目录创建维护视图偶遇错误创建维护视图 首先我们现在SE11中创建一个透明表,然后点击如下图 需要我们创建一个函数组,他的目的是为了让系统生成相应的代码放在这个函数组中,也可以说是SM30的操作界面;点击上面的保存就可以了 注意在输入屏幕编号的时候切记不要和其他的维护…

ChatGPT背后的逻辑

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl OpenAI与ChatGPT OpenAI是一个美国的人工智能&#xff08;AI&#xff09;研究实验室&#xff0c;由非营利组织OpenAI Incorporated和其盈利子公司OpenAI Limited Partnersh…