4、如何利用注解进行 MyBatis 开发

简介: 4、如何利用注解进行 MyBatis 开发

1. MyBatis 注解

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


注解 功能

@Select() 查询

@Update() 更新

@Insert() 插入

@Delete() 删除

2. 基于注解开发

2.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();
}

然后在 MyBatis 的核心配置文件 mybatis-config.xml 中进行类注入,要注意 resource 属性和 class 属性的区别;

resource:指定的是 mapper.xml 的路径;

class:指定的是类的全限名;

<mappers>

   <mapper class="com.cunyu.dao.UserDao"/>

</mappers>


不同于基于 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 新增

接口中声明方法并注解;

@Insert("insert into user (id, name, password) values (#{id},#{name},#{password})")

boolean addUser(User user);

1

2

在 MyBatis 的核心配置中进行注入,由于已经在查询操作时注入过,所以不需要再次注入;

直接进行测试;


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

image.png

2.3 更新

  1. 接口中声明方法并注解;
@Update("update user set password=#{password},name=#{name} where id=#{id}")
boolean updateUserById(User user);
• 1
• 2
  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();
}

image.png

2.4 删除

  1. 接口中声明方法并注解;
@Delete("delete from user where id=#{id}")
boolean deleteUser(int id);
• 1
• 2
  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();
}

image.png3. 注意事项

3.1 @Param

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


当方法只接收一个参数时,可以不用该注解,如下两种方式等价:

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

boolean deleteUser(int id);

1

2

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

boolean deleteUser(@Param("id")int id);

1

2

当方法接收多个参数时,建议使用该注解;

@Delete("delete from user where id=#{id},name=#{name}")

boolean deleteUser(@Param("id")int id, @Param(name)String name);

1

2

若方法接收的参数是 JavaBean 时,不可以使用该注解;

3.2 #{} 和 ${} 对比

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


#{} 传入的参数,MyBatis 默认会将其解析为 字符串,而 ${} 传入的参数,MyBatis 不会对其做任何特殊处理。假如我们传入数据库表名 test:

对比项目 传参语句 解析后的语句

#{} select * from #{table}; select * from "test";

${} select * from #{table}; select * from test;

#{} 和 ${} 在预编译处理时不一样,#{} 类似于 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;

#{} 能够有效防止 SQL 注入,而 ${} 则可能导致 SQL 注入;



目录
相关文章
|
4月前
|
存储 Java 数据库连接
Mybatisplus中的主要使用注解
3.有些注解需要配合其他配置使用。例如,@Version需要配合乐观锁插件使用,@EnumValue需要配合对应的TypeHandler使用。
251 11
|
5月前
|
SQL XML Java
MyBatis——选择混合模式还是全注解模式?
在MyBatis开发中,Mapper接口的实现方式有两种:全注解模式和混合模式。全注解模式直接将SQL嵌入代码,适合小规模、简单逻辑项目,优点是直观简洁,但复杂查询时代码臃肿、扩展性差。混合模式采用接口+XML配置分离的方式,适合大规模、复杂查询场景,具备更高灵活性与可维护性,但学习成本较高且调试不便。根据项目需求与团队协作情况选择合适模式至关重要。
94 4
|
6月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
528 0
|
8月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
314 2
|
9月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
566 13
|
10月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
1654 5
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
10月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
383 5
|
10月前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
209 3
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
10月前
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
785 3