mybatis04--使用注解开发

本文介绍MyBatis框架中的接口编程理念及其优势,包括解耦与提高复用性等,并详细讲解如何使用注解进行增删改查操作。

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

1回顾----面向接口编程

根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好。各个对象之间的协作关系则成为系统设计的关键。

关于接口的理解

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

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

  • 接口应有两类:

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

    三个面向区别

    • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 .
    • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 .
    • 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构

2使用注解开发

利用注解开发就不需要mapper.xml映射文件了 .(这种做法有局限性,复杂的还是需要xml文件映射)

按照原来的做法这里写了方法就要在mapper.xml中去配置。然后去核心配置文件中绑定mappers

现在不用了,在他的上面用注解,括号里面写sql语句,然后去核心配置文件绑定接口仍使用mappers,mappers的绑定有好几种方式,只不过采用接口方式。

所以mapper.xml就可以去掉了,它在核心配置文件中的mappers也应该重新绑定。

步骤

  1. 在接口中添加注解

    public interface UserMapper {
        @Select("select id,mname,pwd password from mybatis.user")
         List<User> getUsers();
    
    }
    
  2. 核心配置文件中绑定mappers,用接口

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

    本质采用反射,得到类UserMapper.class,就可以得到里面的信息

    底层:jvm的动态代理机制

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CaRqwjcB-1620701125627)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210510211651671.png)]

    @Test
    public void getUsers(){
        SqlSession sqlsession = MybatisUtils.getSqlsession();
        UserMapper mapper = sqlsession.getMapper(UserMapper.class);
        List<User> userList = mapper. getUsers();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlsession.close();
    }
    

3Mybatis详细的执行流程

图片

SqlSessionFactoryBuilder底层的build就是解析配置文件信息。build中new了XMLConfiguration对象,参数为,inputstream,environment,properties.这一步是看不到的,源码写了。

4注解实现增删改

方法传入多个参数时,所有的参数前面一定要用注解@Param(),就好像起了个名字一样,有种key的意味,所以写sql语句的时候以

@Param()里面的为主,而不是以形参的参数名为主。同样的,如果方法的参数用了注解,那么不使用注解开发时在mapper.xml中,#{key}就是**@Param()括号里面的,要对应。如果传入的参数是引用对象,不需要加@Param()

增删改需要提交事务,所以可以在工具类中设置自动提交

public static SqlSession getSqlsession(){
return sqlSessionFactory.openSession(true);//自动提交
}

4.1增加

由于mapper映射用的class,在同一个接口里面写方法,所以配置一次即可,这里只写3步:接口里面写方法;方法上面加注解,注解里面写sql语句;测试

step1,2

@Insert("insert into mybatis.user(id,mname,pwd) values (#{id},#{mname},#{pwd})")
int addUser(User user);

step3

@Test
public void addUser(){
    SqlSession sqlsession = MybatisUtils.getSqlsession();
    UserMapper mapper = sqlsession.getMapper(UserMapper.class);
    mapper.addUser(new User(6,"zjy","475869"));
    sqlsession.close();
}

4.2删除

step1,2

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

step3

@Test
public void deleteUser(){
    SqlSession sqlsession = MybatisUtils.getSqlsession();
    UserMapper mapper = sqlsession.getMapper(UserMapper.class);
    mapper.deleteUser(6);
    sqlsession.close();
}

4.3更新

step1,2

@Update("update mybatis.user set mname=#{mname},pwd=#{pwd} where id=#{id}")
int updateUser(User user);

step3

@Test
public void updateUser(){
    SqlSession sqlsession = MybatisUtils.getSqlsession();
    UserMapper mapper = sqlsession.getMapper(UserMapper.class);
    mapper.updateUser(new User(2,"zjjy","47582369"));
    sqlsession.close();
}

4.4@Param

@Param注解用于给方法参数起一个名字。以下是总结的使用原则:

  • 在方法只接受一个参数的情况下,可以不使用@Param,建议加上。
  • 基本类型的参数或者String类型的,需要加上
  • 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
  • 如果参数是 JavaBean , 则不能使用@Param。引用数据类型不需要加
  • 不使用@Param注解时,参数只能有一个,并且是Javabean。
  • sql语句中引用的就是@Param括号里面设定的属性名

其他注意的点

#与$的区别

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

    INSERT INTO user (name) VALUES (#{name});
    INSERT INTO user (name) VALUES (?);
    
  • ${} 的作用是直接进行字符串替换

    INSERT INTO user (name) VALUES ('${name}');
    INSERT INTO user (name) VALUES ('kuangshen');
    

其实就是预编译,sql注入,占位符那一堆

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值