MyBatis 前言

愚迷:住法 着相 念境


前言

maven中需要mybatis的知识
shit!


一、代理模式

1.1 概念

目标对象不可访问,通过代理对象增强功能访问

生活中:
房东(目标对象)
房屋中介(代理对象)
你,我(客户端对象)

厂商(目标对象)
门店(代理对象)
你,我(客户端对象)

1.2 作用

  • 控制目标对象的访问
  • 增强功能

1.3 分类

1.3.1静态代理

它是代理模式的一种,具备以下特点:

  • 目标对象和代理对象实现同一个业务接口
  • 目标对象必须实现接口
  • 代理对象在程序运行前就已经存在
  • 能够灵活的进行目标对象的切换,却无法进行功能的灵活处理(使用动态代理解决此问题)

1.3.2动态代理(分为JDK动态代理和CGLib动态代理)

代理对象在程序运行的过程中动态在内存构建,可以灵活的进行业务功能的切换

二、面向接口编程

类中的成员变量设计为接口,方法的形参设计为接口,方法的返回值设计为接口,调用时接口指向实现类

三、动态代理

3.1jdk动态代理

  1. 目标对象必须实现业务接口
  2. JDK代理对象不需要实现业务接口
  3. JDK动态代理的对象在程序运行时动态的在内存中构建
  4. JDK动态代理灵活的进行业务功能的切换
  5. 本类中的方法(非接口中的方法)不能被代理

3.2jdk动态代理用到的类和接口

它是使用现在的工具类完成JDK动态实现

  1. Proxy类
    java.long.reflect.Proxy包下的类,有一个方法 Proxy.newProxyInstance(…);专门用来生成动态代理对象
    @CallerSensitive
    public static Object newProxyInstance(ClassLoader loader,//类加载器
    Class<?>[] interfaces, //目标对象实现的所有接口
    InvocationHandler h //它就类似于Agent的功能,代理的功能和目标对象的业务功能调用在这
    )
    throws IllegalArgumentException
    {…}

  2. Method类
    反射用的类,用来进行目标对象的方法的反射调用
    method对象接住我们正在调用的方法sing(),show()
    method就等同于sing(),show()
    method.invoke() ==》 手工调用目标方法

  3. InvocationHandler接口
    它是实现代理和业务功能的,我们在调用时,使用匿名内部类实现

动态代理实例(增加功能更灵活,只需在接口和实现类中增加功能,代理中不用管):


public class ProxyFactory {
    //类中的成员变量设计为接口,目标对象
    Service target;

    //传入目标对象
    public ProxyFactory(Service target){
        this.target=target;
    }

    //返回动态代理对象
    public Object getAgent(){
        return Proxy.newProxyInstance(
                //ClassLoader loader,       类加载器,完成目标对象的加载
                target.getClass().getClassLoader(),
                //Class<?>[] interfaces,    目标对象实现的所有接口
                target.getClass().getInterfaces(),
                //InvocationHandler h       实现代理功能的接口,我们传入的匿名内部实现
                new InvocationHandler() {
                    @Override
                    public Object invoke(
                            //创建代理对象
                            Object proxy,
                            //method就是目标方法sing()或者show()
                            Method method,
                            //目标方法的参数
                            Object[] args) throws Throwable {

                        //代理功能
                        System.out.println("预定时间....");
                        //代理功能
                        System.out.println("预定场地....");
                        //主业务功能实现
                        //target.sing();  还是写死了方法的调用,不成
                        Object obj = method.invoke(target, args);
                        //代理功能
                        System.out.println("预定结算费用....");

                        return obj;//切记:这个是目标方法的返回值
                    }
                }
        );
    }
}

只有实现类中实现的接口中的方法可以被动态代理,在实现类中本地书写的方法不能被动态代理

3.3CGLib动态代理

又称为子类代理,通过动态的在内存中构建子类对象,重写父类的方法,进行代理功能的增强
如果目标对象没有实现接口,则只能通过CGLib子类代理来进行功能增强
子类代理是通过字节码框架ASM来实现的

CGLib实现的步骤

  1. 需要spring-core-5.2.5 依赖
  2. 引入功能包后,就可以在内存中动态构建子类
  3. 被代理的类不能为final,否则报错(final即不可变(重写),自然不能被代理)
  4. 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法(静态没有多态)

总结

看javase
反射
注解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一篇简单的 Mybatis-Plus 技术博客,仅供参考。 Mybatis-Plus 技术博客 前言 Mybatis-Plus 是一个基于 Mybatis 的增强工具,简化了 Mybatis 的使用,提供了许多实用的功能,如自动生成代码、分页、多租户、乐观锁等,并且完全兼容 Mybatis。 本文将介绍 Mybatis-Plus 的基本使用和一些高级功能,希望对使用 Mybatis-Plus 的开发者有所帮助。 正文 一、基本使用 1.引入依赖 在 pom.xml 文件中引入 Mybatis-Plus 的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency> ``` 2.配置数据源 在 application.yml 文件中配置数据源信息: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver ``` 3.配置 Mybatis-Plus 在 Mybatis 的配置文件中使用 Mybatis-Plus 的插件: ```xml <configuration> <plugins> <!-- Mybatis-Plus 插件 --> <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/> </plugins> </configuration> ``` 4.创建实体类 创建一个 User 实体类,使用注解标注数据库表名和字段名: ```java @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; } ``` 5.创建 Mapper 创建一个 UserMapper 接口,继承 Mybatis-Plus 的 BaseMapper 接口: ```java public interface UserMapper extends BaseMapper<User> { } ``` 6.使用 Mapper 在 Service 中使用 UserMapper 的方法: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User getById(Long id) { return userMapper.selectById(id); } @Override public List<User> list() { return userMapper.selectList(null); } @Override public boolean save(User user) { return userMapper.insert(user) > 0; } @Override public boolean update(User user) { return userMapper.updateById(user) > 0; } @Override public boolean delete(Long id) { return userMapper.deleteById(id) > 0; } } ``` 二、高级功能 1.分页查询 使用 Mybatis-Plus 的 Page 类进行分页查询: ```java @Override public IPage<User> page(Integer pageNum, Integer pageSize) { Page<User> page = new Page<>(pageNum, pageSize); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().gt(User::getAge, 18); return userMapper.selectPage(page, queryWrapper); } ``` 2.多租户 使用 Mybatis-Plus 的 MultiTenantType 接口和 MultiTenantLineHandler 类实现多租户: ```java public class MybatisPlusTenantLineHandler implements TenantLineHandler { @Override public Expression getTenantId() { // 返回当前租户 ID return new LongValue(1L); } @Override public String getTenantIdColumn() { // 返回租户 ID 的字段名 return "tenant_id"; } @Override public boolean ignoreTable(String tableName) { // 返回是否忽略该表 return "user".equalsIgnoreCase(tableName); } } @Configuration public class MybatisPlusConfig { @Bean public TenantLineInnerInterceptor tenantLineInnerInterceptor() { return new TenantLineInnerInterceptor(new MybatisPlusTenantLineHandler()); } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(tenantLineInnerInterceptor()); return interceptor; } } ``` 3.乐观锁 使用 Mybatis-Plus 的 @Version 注解实现乐观锁: ```java @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @Version private Integer version; } @Override public boolean update(User user) { return userMapper.updateById(user) > 0; } ``` 结论 Mybatis-Plus 是一个非常实用的工具,可以显著提高开发效率和代码质量。本文介绍了 Mybatis-Plus 的基本使用和一些高级功能,希望对大家有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值