5.mybatis注解

本文探讨了面向接口编程的概念与优势,详细介绍了如何在MyBatis中使用注解进行数据库操作,包括增删改查,并讨论了注解与XML映射的适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注解

1.面向接口编程

我们在一般实现一个系统的时候,通常是将定义与实现合为一体,不加分离的,我认为最为理想的系统设计规范应是所有的定义与实现分离,尽管这可能对系统中的某些情况有点麻烦。

  • 根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好.

什么叫面向接口编程

  • 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
  • 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

1.关于接口的理解。

  • 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。

  • 接口的本身反映了系统设计人员对系统的抽象理解。

  • 接口应有两类:

    • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
    • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
  • 一个体有可能有多个抽象面。

  • 抽象体与抽象面是有区别的。

2.设计接口的另一个不可忽视的因素是接口所处的环境(context,environment),系统论的观点:

  • 环境是系统要素所处的空间与外部影响因素的总和。
  • 任何接口都是在一定的环境中产生的。
  • 因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。

3**.三个面向的区别**

  • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法

  • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现

  • 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题

2.使用注解开发

  1. 在接口中添加注解

    //查询全部用户
    @Select("select * from user")
    List<User> getAllUserList();
    
  2. 在核心配置文件中绑定接口

    <mappers>
        <mapper class="com.mapper.UserMapper"/>
    </mappers>
    
  3. 测试

      @Test
        public void getUserList(){
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = mapper.getUserList();
            for (User user : userList) {
                System.out.println(user);
            }
            sqlSession.close();
        }
    
  4. 注意:

    • 使用了注解就不用写UserMapper.xml文件了

    • 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。

    • 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

  5. 本质:反射加载实现

在这里插入图片描述
6. 底层:动态代理
在这里插入图片描述

  1. 执行流程

    img

3.注解实现增删改查

3.1、改造MybatisUtil的getSqlsession方法

   //获取SqlSession连接
   public static SqlSession getSession(){
       return getSession(true); //事务自动提交
   }
  
   public static SqlSession getSession(boolean flag){
       return sqlSessionFactory.openSession(flag);

3.2、查询

  1. 接口

    @Select("select * from user where id=#{id}")
    User getById(@Param("id") int id);
    
  2. 测试

     	@Test
        public void getById(){
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User byId = mapper.getById(1);
            System.out.println(byId);
            sqlSession.close();
        }
    

3.3、增加

  1. 接口

    @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);
    
  2. 测试

       	@Test
        public void addUser(){
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.addUser(new User(5,"wuming","158486"));
            sqlSession.close();
        }
    

3.4、修改

  1. 接口

    @Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
    int updataUser(User user);
    
  2. 测试

      	@Test
        public void updateUser(){
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.updataUser(new User(3,"liwu","159888"));
            sqlSession.close();
        }
    

3.5、删除

  1. 接口

    @Delete("delete from user where id=#{id}")
    int deleteUser(@Param("id") int id);
    
  2. 测试

     	@Test
        public void deleteUser(){
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.deleteUser(5);
            sqlSession.close();
        }
    

4.关于@Param()注解

  • 基本类型的参数或者String类型,需要加上
  • 引用类型不需要加
  • 如果只有一个基本类型,可以忽略,但是建议加上!
  • 我们在SQL中引用的就是我们这里的@Param()中设定的属性名!

5.#与$的区别

  • #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
  • ${} 的作用是直接进行字符串替换

6.LOMbok

6.1下载lombok插件

6.2导入jar包

		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

6.3注解示例

@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows
@val
@var
experimental @var
@UtilityClass

6.4说明

  1. @Data:无参构造、get、set、tostring、hashcode、equals

  2. @NoArgsConstructor:无参构造

  3. @AllArgsConstructor:有参构造

  4. @Getter and @Setter

  5. @ToString

  6. 示例

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private int id;
        private String name;
        private String pwd;
    }
    

6.5 lombok优点和缺点

优点:

  1. 能通过注解自动生成构造器、getter/setter、equals、hashcode、tostring等方法,提高了开发效率
  2. 让代码变得简洁,不用过多的去关注相应的方法
  3. 属性做修改时,也简化了维护这些属性所生成的get/set方法等

缺点:

  1. 不支持多种参数构造器的重载
  2. 虽然省去了手动创建get/set方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。

name;
private String pwd;
}


### 6.5 lombok优点和缺点

优点:

1. 能通过注解自动生成构造器、getter/setter、equals、hashcode、tostring等方法,提高了开发效率
2. 让代码变得简洁,不用过多的去关注相应的方法
3. 属性做修改时,也简化了维护这些属性所生成的get/set方法等

缺点:

1. 不支持多种参数构造器的重载
2. 虽然省去了手动创建get/set方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值