首页 > 其他分享 >MyBatis - 注解开发

MyBatis - 注解开发

时间:2024-07-10 21:28:01浏览次数:12  
标签:mapper UserDao 开发 user MyBatis 注解 id

注解开发

1. MyBatis 注解

之前的实例中,利用 MyBatis 进行开发时,一旦添加新的方法,则每次都需要在 XML 配置文件中进行映射。而现在随着注解开发的大肆流行,MyBatis 3 也提供了基于注解的配置。但是通过注解的方式表达力和灵活性有限,必要时要是需要通过 mapper 配置文件来进行构建,常用的注解主要用如下几个:

注解功能
@Select()查询
@Update()更新
@Insert()插入
@Delete()删除

2. 基于注解开发

2.1 查询

  1. 接口中声明方法同时添加注解;
package com.cunyu.dao;

import com.cunyu.pojo.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @InterfaceName : UserDao
 * @Author : cunyu
 * @Date : 2020/7/15 8:00
 * @Version : 1.0
 * @Description : UserDao 接口
 **/

public interface UserDao {
    @Select("select * from user")
    public List<User> getAllUser();
}
  1. 然后在 MyBatis 的核心配置文件 mybatis-config.xml 中进行类注入,要注意 resource 属性和 class 属性的区别;
  • resource:指定的是 mapper.xml 的路径;
  • class:指定的是类的全限名;
<mappers>
    <mapper class="com.cunyu.dao.UserDao"/>
</mappers>
  1. 不同于基于 XML 配置的方式,此时不需要再去配置 XML,直接进行测试即可;
package com.cunyu.dao;

import com.cunyu.pojo.User;
import com.cunyu.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @author : cunyu
 * @version : 1.0
 * @className : UserDaoTest
 * @date : 2020/7/15 8:07
 * @description : 测试类
 */

public class UserDaoTest {
    @Test
    public void testGetAllUser() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();

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

2.2 新增

  1. 接口中声明方法并注解;
@Insert("insert into user (id, name, password) values (#{id},#{name},#{password})")
boolean addUser(User user);
  1. 在 MyBatis 的核心配置中进行注入,由于已经在查询操作时注入过,所以不需要再次注入;
  2. 直接进行测试;
@Test
public void testAddUser() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();

    UserDao mapper = sqlSession.getMapper(UserDao.class);
    boolean flag = mapper.addUser(new User(5, "小鬼", "09080706"));
    System.out.println("插入成功:" + flag);
    sqlSession.close();
}

在这里插入图片描述

2.3 更新

  1. 接口中声明方法并注解;
@Update("update user set password=#{password},name=#{name} where id=#{id}")
boolean updateUserById(User user);
  1. 测试
@Test
public void testUpdateUser() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();

    UserDao mapper = sqlSession.getMapper(UserDao.class);

    boolean flag = mapper.updateUserById(new User(5, "小猪", "123456"));
    System.out.println("更新成功:" + flag);

    sqlSession.close();
}

在这里插入图片描述

2.4 删除

  1. 接口中声明方法并注解;
@Delete("delete from user where id=#{id}")
boolean deleteUser(int id);
  1. 测试
@Test
public void testDeleteUser() {
    SqlSession sqlsession = MybatisUtil.getSqlSession();

    UserDao mapper = sqlsession.getMapper(UserDao.class);
    boolean flag = mapper.deleteUser(5);
    System.out.println("删除成功:" + flag);
    sqlsession.close();
}

在这里插入图片描述

3. 注意事项

3.1 @Param

在接口中添加方法时,可以利用 @Param 注解给方法的参数进行取名。

  • 当方法只接收一个参数时,可以不用该注解,如下两种方式等价:
@Delete("delete from user where id=#{id}")
boolean deleteUser(int id);
@Delete("delete from user where id=#{id}")
boolean deleteUser(@Param("id")int id);
  • 当方法接收多个参数时,建议使用该注解;
@Delete("delete from user where id=#{id},name=#{name}")
boolean deleteUser(@Param("id")int id, @Param(name)String name);
  • 若方法接收的参数是 JavaBean 时,不可以使用该注解;

3.2 #{} 和 ${} 对比

MyBatis 中可以将参数传到 XML 文件中,然后由 MyBatis 对 SQL 及其语法进行解析,支持 ${}#{} 两种方式,两者的区别如下:

  1. #{} 传入的参数,MyBatis 默认会将其解析为 字符串,而 ${} 传入的参数,MyBatis 不会对其做任何特殊处理。假如我们传入数据库表名 test
对比项目传参语句解析后的语句
#{}select * from #{table};select * from "test";
${}select * from #{table};select * from test;
  1. #{}${} 在预编译处理时不一样,#{} 类似于 JDBC 中的 PreparedStatement,对于传入的参数,会在预处理阶段用 ? 进行替代,然后在真正需要执行语句时才带入参数;而 ${} 则会直接进行简单的替换;
对比项目传参语句解析后的语句
#{}select * from user where id=#{id};select * from user where id=?;
${}select * from user where id=#{id};select * from user where id=2;
  1. #{} 能够有效防止 SQL 注入,而 ${} 则可能导致 SQL 注入;

标签:mapper,UserDao,开发,user,MyBatis,注解,id
From: https://blog.csdn.net/paofuluolijiang/article/details/140279896

相关文章

  • MyBatis - 一二级缓存
    一二级缓存1.前言1.1什么是缓存缓存是存在内存中的临时数据,通过将我们经常查询但不常变的数据放在内存中,当我们查询数据时就不在需要从磁盘读取,而只需要从缓存中查询即可,大大提升了查询的效率,解决了高并发系统的性能问题。1.2为什么需要缓存既然我们可以直接从数......
  • 【粉丝福利社】《AIGC辅助软件开发:ChatGPT 10倍效率编程实战》(文末送书-进行中)
    ......
  • 【舒一笑赠书活动-第1期】-《AIGC辅助软件开发:ChatGPT 10倍效率编程实战》
    ......
  • 无人直播/ai自动直播-APP源码开发
    无人直播APP的源码开发通常涉及到几个关键技术和组件:实时流媒体处理:使用WebRTC(WebReal-TimeCommunication)技术,它允许在浏览器或移动端实现实时音视频通信。开发者需要理解和集成相关的SDK,如Agora、Kurento等。用户认证和权限管理:通过OAuth或其他身份验证机制,确保只有注册......
  • STM32开发实例_基于Zigbee的智能路灯系统(电路图+程序+流程图)24-32-64
    一.系统概述1.智能组网与数据传输:利用Zigbee技术自由灵活地组网小区智能路灯。小区与监控中心通过WiFi实现实时数据传输。2.人工模式下的路灯控制:可手动调节路灯亮度等级(一级、二级、三级)。能切换定时、自动、手动三种控制模式。3.定时模式控制:通过小程序设定路灯的定时......
  • 【MyBatis】xml 大于|小于|等于 写法及介绍
    在 *.xml 中使用常规的 < > = <= >= 会与xml的语法存在冲突方法一:使用xml原生转义的方式进行转义#字符名称sql符号转义字符大于号>>小于号<<不等于<><>大于等于号>=>=小于等于号<=<=与&&amp;单引号'&apos;双引号""......
  • 学习AI大模型,入门小白必看!应用开发极简入门PDF来了!
    人工智能大潮已来,不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样,基本上你见不到。而大模型是人工智能代表,潜力与使用方式有关。使用好大模型可提高效率,让人获得更好的待遇和更多机会。你发现PPT和excel用的好的PPT一看就惊艳,excel用的特别熟练,你这个数据分......
  • 智能小程序 Ray 开发门锁 API ——日志 API 接口汇总
    查询最近一条日志记录getLatestLog引入@ray-js/ray^1.5.0以上版本可使用import{getLatestLog}from'@ray-js/ray'参数LatestLogParams属性类型必填说明devIdstring是设备ID返回LatestLogResponse结构包含日志记录的各种详细信息。函数定义示例/***查询......
  • 记一次【PPT制作、PPT在线编辑预览】功能开发过程
    背景    早上,正愉快写着helloWord(Java)。老大对我来了句,搞个【根据用户输入的markdow文本内容,将数据插入到PPT模板中,生成新的PPT文件。并且要可以在线预览以及编辑】    。(ps:就是直接照着人家的功能抄一个出来,参考网址:https://www.*******.vip)。并且跟我说Apach......
  • 撸包小游戏对接广告联盟APP系统开发源码搭建
    “撸包小游戏广告联盟APP”源码搭建涉及多个关键步骤,以下是一个简化的流程:市场调研与需求分析:对市场进行深入调研,了解目标用户群体和他们的需求。分析竞争对手的小游戏和广告策略,确定自己小游戏的特色和定位。游戏开发:根据市场调研的结果,设计并开发具有吸引力的撸包小......