博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态实现类(对数据库的增删改查)
阅读量:5840 次
发布时间:2019-06-18

本文共 3157 字,大约阅读时间需要 10 分钟。

当我们对数据库进行操作时,通常会定义一个接口类,然后定义很多的实现类来实现这个接口的所有方法,这样就会产生很多的实现类出来,增加了代码的冗余度,所以我们可以通过

动态代理模式来动态生成实现类来代替所有的实现类,再通过一个工厂来生成实现类,这样就大大减小的代码的重复性了,增强了灵活性!

实现步骤:

1.数据库接口类

package mybatis.dao;import mybatis.entity.Users;import java.util.List;import java.util.Map;/** * @Author lance * */public interface UserDaoInf {    /**     * 添加用户     */     void saveUser(Users users);    /**     * 修改用户     */     void updateUser(Users users);    /**     * 删除用户     */    void deleteUser(String uid);    /**     * 根据ID查询某条用户数据     */    Users findUsersById(String uid);    /**     * 查询所有的用户信息,保存在一个集合中     */    List
findAll(); /** * 统计查询 */ int userCount(); /** * 模糊查询 */ List
likeUsers(String name); /** * 查询所有的用户信息 */ List
findAll2(); /** * 查询单条的用户信息 */ Map
findUserMap(String uid); /** * 查询多条的用户信息 */ List
> findUserListMap();}

2.动态代理实现类

package mybatis.dao.proxy;import mybatis.tools.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 描述: * 动态代理实现类 * * @author lance * @create 2018-10-15 9:33 */public class MethodProxy implements InvocationHandler{    private Class
infClass; public MethodProxy(Class
infClass){ this.infClass = infClass; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { SqlSession session = MyBatisUtil.getSqlSession(); try{ Object mapper = session.getMapper(infClass); Object returnValue = method.invoke(mapper,args); session.commit(); return returnValue; }catch (Exception e){ session.rollback(); throw new RuntimeException(e.getMessage()); }finally { session.close(); } }}

3.代理工厂

package mybatis.dao.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;/** * 描述: * 代理对象工厂 * @author lance * @create 2018-10-15 11:42 */public class MethodProxyFactory {    public static 
T createProxy(Class
infClass){ //调用回调处理器 InvocationHandler handler = new MethodProxy(infClass); return (T)Proxy.newProxyInstance(infClass.getClassLoader(),new Class[]{infClass},handler); }}

4.测试

import mybatis.dao.UserDaoInf;import mybatis.dao.proxy.MethodProxyFactory;import mybatis.entity.Users;import org.junit.Test;import java.util.List;/** * 描述: * * @author lance * @create 2018-09-10 15:15 */public class UserDaoImplTest {    @Test    public void testFindUserById2(){        //动态生成代理对象        UserDaoInf dao = MethodProxyFactory.createProxy(UserDaoInf.class);        Users user = dao.findUsersById("1001");        System.out.println(user.getUid());        System.out.println(user.getUserName());        List
list = dao.findAll(); for (Users users : list) { System.out.println(users.getUid()); } }}

5.效果图

 

转载于:https://www.cnblogs.com/gepuginy/p/9800515.html

你可能感兴趣的文章
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
求两个集合的交集,并集,差集
查看>>
Kotlin的语法糖(一)基础篇
查看>>
OkHttp源码分析
查看>>
让你的app体验更丝滑的11种方法!冲击手机应用榜单Top3指日可待
查看>>
windows kernel exploitation基础教程
查看>>
NS_OPTIONS枚举的用法
查看>>
java9系列(九)Make G1 the Default Garbage Collector
查看>>
QAQ高精度模板笔记√
查看>>
Jmeter计数器的使用-转载
查看>>
【Android笔记】入门篇02:全屏设置和禁止横屏竖屏切换
查看>>
4. Median of Two Sorted Arrays
查看>>
Kubernetes的本质
查看>>
PL/SQL developer 管理多套数据库
查看>>
黑马程序员-分类(category)
查看>>
新建PCH文件以及常用宏定义
查看>>
vue-cli多页面
查看>>
进程和线程
查看>>
iOS Foundation框架简介 -1.常用结构体的用法和输出
查看>>
libevent reference Mannual I
查看>>