【Spring集成MyBatis】MyBatis注解开发

文章目录

  • 1. MyBatis的常用注解
  • 2. 基于注解的MyBatis增删改查
    • 完整代码
    • 加载映射关系
    • 测试代码
  • 3. MyBatis的注解实现复杂映射开发
    • 一对一操作的实现
    • 一对一操作实现的第二种方式
    • 一对多操作的实现
    • 多对多操作实现

1. MyBatis的常用注解

在这里插入图片描述

2. 基于注解的MyBatis增删改查

使用注解开发,就可以删掉原本写MyBatis语句的xml文件了,注解只要在UserMapper.java接口上进行实现即可

@Insert("insert into user values(#{id}, #{username}, #{password}, #{birthday})")
void save(User user);

@Delete("delete from user where id=#{id}")
void delete(int id);

@Update("update user set username=#{username}, password=#{password}, birthday=#{birthday} where id=#{id}")
void update(User user);

@Select("select * from user where id=#{id}")
User findById(int id);

@Select("select * from user")
List<User> findAll();

完整代码

package com.example.demo.mapper;

import com.example.demo.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserMapper {


    @Insert("insert into user values(#{id}, #{username}, #{password}, #{birthday})")
    void save(User user);

    @Delete("delete from user where id=#{id}")
    void delete(int id);

    @Update("update user set username=#{username}, password=#{password}, birthday=#{birthday} where id=#{id}")
    void update(User user);

    @Select("select * from user where id=#{id}")
    User findById(int id);

    @Select("select * from user")
    List<User> findAll();
}

加载映射关系

原本在sqlMapConfig.xml文件中的加载映射文件修改为加载映射关系:

<!-- 加载映射关系 -->
<mappers>
    <package name="com.example.demo.mapper"/>
</mappers>

测试代码

原本数据库中的内容:
在这里插入图片描述

package com.example.demo;

import com.example.demo.domain.User;
import com.example.demo.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 java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class DemoApplication {

    public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        增加User信息
        User saveUser = new User();
        saveUser.setUsername("newUser");
        saveUser.setPassword("aaaaaa");
        saveUser.setBirthday(new Date());
        mapper.save(saveUser);
//        删除User信息
        int deleteUserId = 3;
        mapper.delete(deleteUserId);
//        修改User信息
        User updateUser = new User();
        updateUser.setId(2);
        updateUser.setUsername("ccc");
        updateUser.setPassword("1234567update");
        mapper.update(updateUser);
//        根据Id查询User
        User user = mapper.findById(1);
        System.out.println(user);
//        查询所有user
        List<User> userList = mapper.findAll();
        System.out.println(userList);

        sqlSession.commit();

//        6. 释放资源
        sqlSession.close();

    }
}

打印的信息:
在这里插入图片描述

更新后的内容:
在这里插入图片描述

3. MyBatis的注解实现复杂映射开发

在这里插入图片描述
此处对应于【Spring集成MyBatis】MyBatis的多表查询的内容,来写一下对应的注解实现。

一对一操作的实现

原本基于配置是这么写的

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.OrderMapper">
    
    <resultMap id="orderMap" type="com.example.demo.domain.Order">
<!--        手动指定字段与实体属性的映射关系-->
<!--        column:数据表的字段名称-->
<!--        property:实体的属性名称-->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="orderTime"></result>
        <result column="total" property="total"></result>
        <result column="uid" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="password" property="user.password"></result>
        <result column="birthday" property="user.birthday"></result>
    </resultMap>

    <select id="findAll" resultMap="orderMap">
        SELECT *, o.id `orderid`, u.id `userid` FROM `order` o, `user` u WHERE o.uid=u.id
    </select>

</mapper>

使用注解后如下修改

package com.example.demo.mapper;

import com.example.demo.domain.Order;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface OrderMapper {

    @Select("select *, o.id oid from `order` o, user u where o.uid=u.id")
    @Results({
            @Result(column = "oid", property = "id"),
            @Result(column = "ordertime", property = "orderTime"),
            @Result(column = "total", property = "total"),
            @Result(column = "uid", property = "user.id"),
            @Result(column = "username", property = "user.username"),
            @Result(column = "password", property = "user.password")
    })
    List<Order> findAll();

}

一对一操作实现的第二种方式

其中,在要封装的User对象中,我们可以在@Result注解中写明属性名称、数据库查询到的值、要封装的实体类型等等等,有点类似于之前的注解中的那些属性,不同的事这里通过一个@One来指定通过哪个接口的方法来获得对应的数据,这时候会将column的值注入到这个方法中来获得具体的结果
也就是,首先使用

select * from `order`

来查询出order下的所有信息,包括id、ordertime、total、uid,接着,我们需要根据里面的uid可以查出对应的User信息并封装到Order实体类下的user属性中

select * from `user` where id=(上面查询结果的所有uid)

这里就需要在@Result注解中进一步指定property、column、javaType、one(由于是一对一所以使用one,一对多使用many)

package com.example.demo.mapper;

import com.example.demo.domain.Order;
import com.example.demo.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface OrderMapper {

    @Select("select * from `order`")
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "ordertime", property = "orderTime"),
            @Result(column = "total", property = "total"),
            @Result(
                    property = "user", // 要封装的属性名称
                    column = "uid", // 根据哪个字段去查询user表的数值
                    javaType = User.class, // 要封装的实体类型
                    // select属性 代表查询哪个接口的方法获得数据
                    one = @One(select = "com.example.demo.mapper.UserMapper.findById")
            )
    })
    List<Order> findAll();

}

以上两种一对一操作的测试代码:

package com.example.demo;

import com.example.demo.domain.Order;
import com.example.demo.domain.User;
import com.example.demo.mapper.OrderMapper;
import com.example.demo.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 java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class DemoApplication {

    public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        List<Order> orderList = orderMapper.findAll();
        for (Order order : orderList) {
            System.out.println(order);
        }

//        6. 释放资源
        sqlSession.close();

    }
}

结果:
在这里插入图片描述

一对多操作的实现

查询User对应的订单,和【Spring集成MyBatis】MyBatis的多表查询中一样,首先需要再User里面加上一个orderList属性,用于封装所有的订单,并写好对应的set、get方法以及对应的toString方法。
类似于一对一操作的第二种实现方式,我们需要在@Result里面指定property、column、javaType,由于返回的是List,就不用one而用many
首先查询出所有的用户,并在用户下面封装其订单列表。
通过

select * from user

查出了用户的id,username,password,birthday的信息,我们需要根据里面的id到order表里查询对应的订单

select * from `order` where uid=(上面user查询出来的所有id)

即再通过一个@Result注解指定根据uid查询订单的方法。目前Order类里还没有根据uid查询订单的方法,所以我们需要再去实现一下根据uid查询订单的方法
在OrderMapper里写:

@Select("select * from `order` where uid=#{id}")
List<Order> findByUid(int id);

在UserMapper里写根据userid查询指定订单

@Select("select * from user")
@Results({
        @Result(column = "id", property = "id"),
        @Result(column = "username", property = "username"),
        @Result(column = "password", property = "password"),
        @Result(column = "birthday", property = "birthday"),
        @Result(
                property = "orderList",
                column = "id",
                javaType = List.class,
                many = @Many(select = "com.example.demo.OrderMapper.findByUid")
        )
})
List<User> findUserAndOrderAll();

测试:

package com.example.demo;

import com.example.demo.domain.User;
import com.example.demo.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class DemoApplication {

    public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.findUserAndOrderAll();
        for (User user : userList) {
            System.out.println(user);
        }

//        6. 释放资源
        sqlSession.close();

    }
}

查询出来的结果如下:
在这里插入图片描述

多对多操作实现

查询User对应的角色,和【Spring集成MyBatis】MyBatis的多表查询中一样,首先需要再User里面加上一个roleList属性,用于封装所有的角色,并写好对应的set、get方法以及对应的toString方法。
实现过程如下:
先查询所有的User信息

select * from USER

根据userid查询所有的对应的role及其信息

select * from user_role ur, role r where ur.roleId=r.id and userid=(上面查出来的所有id)

那么首先我们需要建立roleMapper,并在RoleMapper中写上对应的查询语句:

package com.example.demo.mapper;

import com.example.demo.domain.Role;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface RoleMapper {

    @Select("select * from user_role ur, role r where ur.roleId=r.id and userid=#{id}")
    List<Role> findByUid(int id);
}

接着,在UserMapper中类似一对多一样补充如下方法:

@Select("select * from User")
@Results({
        @Result(column = "id", property = "id"),
        @Result(column = "username", property = "username"),
        @Result(column = "password", property = "password"),
        @Result(column = "birthday", property = "birthday"),
        @Result(
                property = "roleList",
                column = "id",
                javaType = List.class,
                many = @Many(select = "com.example.demo.mapper.RoleMapper.findByUid")
        )
})
List<User> findUserAndRoleAll();

最后测试:

package com.example.demo;

import com.example.demo.domain.User;
import com.example.demo.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class DemoApplication {

    public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.findUserAndRoleAll();
        for (User user : userList) {
            System.out.println(user);
        }

//        6. 释放资源
        sqlSession.close();

    }
}

结果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Kotlin】引入与基础语法

文章目录 Kotlin的特性Kotlin优势Kotlin的安卓项目变量变量保存了指向对象的引用优先使用val来避免副作用 后端变量Backing Fields延迟初始化 Kotlin的特性 它更加易表现&#xff1a;这是它最重要的优点之一。你可以编写少得多的代码。Kotlin是一种兼容Java的语言Kotlin比Java…

针对哈希冲突的解决方法

了解哈希表和哈希冲突是什么 哈希表&#xff1a;是一种实现关联数组抽象数据类型的数据结构&#xff0c;这种结构可以将关键码映射到给定值。简单来说哈希表&#xff08;key-value&#xff09;之间存在一个映射关系&#xff0c;是键值对的关系&#xff0c;一个键对应一个值。 …

顶级安卓数据恢复工具—— 15 个 Android 数据恢复程序榜单

探索并比较顶级 Android 数据恢复软件&#xff0c;并选择最好的 Android 恢复应用程序来恢复您的宝贵数据&#xff1a; 特别是您的智能手机或 Android 设备可以完成许多繁重的工作&#xff0c;其中最有用的是存储数据。Android 设备可以伪装成照片、视频、电子邮件甚至敏感商业…

MVCC多版本并发控制相关面试题整理

多版本并发控制是一种用于支持并发事务的数据库管理系统技术&#xff0c;它允许多个事务同时访问数据库&#xff0c;而不会相互干扰或导致数据不一致。MVCC通过在数据库中维护不同版本的数据来实现这一目标&#xff0c;从而允许每个事务看到一致的数据库快照。 并发导致的问题…

vue实现海康H5视频插件播放视频的实例,实现取流失败了之后重新获取新的流播放视频

vue实现海康H5视频插件播放视频的实例&#xff0c;实现取流失败了之后重新获取新的流播放视频 h5player是一个基于HTML5的流式网络视频播放器&#xff0c;无需安装浏览器插件即可通过websocket协议向媒体服务取流播放多种格式的音视频流。 首先去海康开发平台&#xff0c;把插…

iar如何全擦芯片内存

Project ->Download -> Erase memory

什么是零拷贝 、零拷贝优化方案 - 真正的零拷贝,哪些地方会用到零拷贝技术

文章目录 什么是零拷贝3、零拷贝优化方案 - 真正的零拷贝哪些地方会用到零拷贝技术 现在来谈谈零拷贝&#xff0c;以及在开发中哪些地方使用到零拷贝。 开干… 什么是零拷贝 零拷贝指的是&#xff0c;从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底…

基于springboot实现应急救援物资管理系统项目【项目源码】

基于springboot实现应急救援物资管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&a…

python游戏开发pygame初步

文章目录 安装和示例移动物体优化 安装和示例 顾名思义&#xff0c;PyGame就是用来做游戏的Python库&#xff0c;提供了许多游戏开发功能&#xff0c;如图像处理、音频播放、事件处理、碰撞检测等等。从这个角度来说&#xff0c;pygame不仅是一个游戏库&#xff0c;同时也是一…

【教3妹学编程-算法题】统计子串中的唯一字符

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开发。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&#x…

【brpc学习实践八】bvar及其应用

什么是bvar bvar是多线程环境下的计数器类库&#xff0c;支持单维度bvar和多维度mbvar&#xff0c;方便记录和查看用户程序中的各类数值&#xff0c;它利用了thread local存储减少了cache bouncing&#xff0c;相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销&a…

4、浏览器插件配置使用

文章目录 一、Hackbar1. Load和Execute功能的使用2. Split功能的使用3. Post功能的使用4. 编码功能的使用 二、FoxyProxy1、设置Burpsuite的代理服务端口2、FoxyProxy插件的简单使用 三、User-Agent Switcher 一、Hackbar 火狐浏览器中按下F12键启用hackbar。 1. Load和Execut…

springboot宠物店管理系统-计算机毕设 附源码 32041

SpringBoot宠物店管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;宠物行业当然也不例外。宠物店管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理…

leetcode算法之链表

目录 1.两数相加2.两两交换链表中的节点3.重排链表4.合并K个升序链表5.K个一组翻转链表 1.两数相加 两数相加 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

鸿蒙开发-ArkTS 语言-基础语法

1. 初识 ArkTS 语言 ArkTS 是 HarmonyOS 优选主力开发语言。ArkTS 是基于 TypeScript (TS) 扩展的一门语言&#xff0c;继承了 TS 的所有特性&#xff0c;是TS的超集。 主要是扩展了以下几个方面&#xff1a; 声明式UI描述和自定义组件&#xff1a; ArkTS使用声明式的方式描述用…

存算一体还是存算分离?谈谈数据库基础设施的架构选择

从一则用户案例说起 某金融用户问&#xff0c;数据库用服务器本地盘性能好还是外置存储好&#xff1f;直觉上&#xff0c;本地盘路径短性能应该更好。然而测试结果却出乎意料&#xff1a;同等中等并发压力&#xff0c;混合随机读写模型&#xff0c;服务器本地SSD盘合计4万 IOPS…

提示工程-Prompt Engineering

提示工程 提示工程 1、概述 Prompt Engineering&#xff1a; 提示工程 通过自然语言&#xff08;英语、汉语等&#xff09;来给AI下达指示&#xff0c;从而让AI完成你指定给他的工作的过程都可以称之为提示工程。&#xff08;面向自然语言编程&#xff09; 提示词要素 指令&…

C语言公交车之谜(ZZULIOJ1232:公交车之谜)

题目描述 听说郑州紫荆山公园有英语口语角&#xff0c;还有很多外国人呢。为了和老外对上几句&#xff0c;这周六早晨birdfly拉上同伴早早的就坐上了72路公交从学校向紫荆山进发。一路上没事干&#xff0c;birdfly开始思考一个问题。 从学校到紫荆山公园共有n(1<n<20)站路…

Day02嵌入式---按键控灯

一、简单介绍 按键控制灯开关是一种常见的嵌入式系统示例项目&#xff0c;它通常用于演示嵌入式系统的基本控制能力。该项目由一个或多个LED和一个按键组成。通过按下按键&#xff0c;可以控制LED的开关状态&#xff0c;从而实现灯的亮灭控制。 二、查看功能手册 2.1 查看硬件…