动态实现类(对数据库的增删改查)

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

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

实现步骤:

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<Users> findAll();
    /**
     * 统计查询
     */
    int userCount();
    /**
     * 模糊查询
     */
    List<Users> likeUsers(String name);
    /**
     * 查询所有的用户信息
     */
    List<Users> findAll2();
    /**
     * 查询单条的用户信息
     */
    Map<String ,Object> findUserMap(String uid);
    /**
     * 查询多条的用户信息
     */
    List<Map<String,Object>> 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> T createProxy(Class<T> 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<Users> list = dao.findAll();
        for (Users users : list) {
            System.out.println(users.getUid());
        }
    }

}

5.效果图

原文地址:https://www.cnblogs.com/gepuginy/p/9800515.html

时间: 2024-08-04 18:31:15

动态实现类(对数据库的增删改查)的相关文章

【Mysql】Java中对Mysql数据库的增删改查、Java的System类

这部分也是所谓JDBC.网站数据源的内容,把名字弄得很高深似得,实际上只是Java中对Mysql数据库的增删改查的内容.非常简单,之前写了这么多Mysql的内容,没好好总结一下,实在是不应该.今天就实现一个Java中对Mysql数据库的增删改查,随便带点Java取出当前系统的系统名与系统时间的知识,完成一个还算有点意思的小例子. 一.基本目标 首先,在Mysql数据库中有一张名为testtable的空表,id为自增列,username,class都是文本列,但是class里面都存放数字,也就是整

【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查

这篇文章有很多槽点,在Hibernate4.x上面用着Hibernate3.x的写法去写.而且程序中放到Eclipse中会有一大堆警告,但是这好歹也在一定程度上完成了Hibernate的入门.毕竟现在很多介绍Hibernate的书籍都是用Hibernate3.x的写法去写.上次那篇<[Hibernate]最简单的Hibernate工程--账号注册系统>(点击打开链接)杂糅Struts的技术其实是不对的.因为Hibernate完成的是,从Java到数据库,从数据库到Java的任务.之后Java与

java:JSP(JSPWeb.xml的配置,动态和静态导入JSP文件,重定项和请求转发,使用JSP实现数据库的增删改查实例)

1.JSP的配置: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":&qu

Java操作数据库实现&quot;增删改查&quot;

本文主要讲解JDBC操作数据库    主要实现对MySql数据库的"增删改查" 综合概述: JDBC的常用类和接口 一   DriverManager类 DriverManage类用来管理数据库中的所有驱动程序,是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动之间建立连接,DriverManager类中的方法都是静态方法,下列是DriverManager的常用方法: getConnection(String URL,String user,String

MyBatis框架入门小案例(关于用mybatis框架对数据库的增删改查)

1.新建一个maven项目,建好相对应的包,在https://mvnrepository.com中导入MyBatis需要的依赖,复制到配置文件中 2.在resources文件下添加mybatis-config.xml文件和mapper文件夹,mybatis-config.xml是连接mysql的主要配置,mapper文件夹存放的是对数据库增删改查的映射 mybatis-config.xml配置如下: <?xml version="1.0" encoding="utf-8

android中SQLite数据库的增删改查

1.数据库帮助类PersonSQLiteOpenHelper package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper

TP框架中 数据库的增删改查

框架会用到数据库的内容,这一篇就是关于数据库的增删改查. 数据库的操作,无疑就是连接数据库,然后对数据库中的表进行各种查询,然后就是对数据的增删改的操作, 想要操作数据库,第一步必然是要:链接数据库 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件 我这里是这样的文件路径 (2)打开这个config.php文件,然后找到父类配置文件convention.php文件,将关于"数据库"的部分复制粘贴到config.php配置文件中(父类的conv

java jdbc 连接mysql数据库 实现增删改查

好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的

Android学习---SQLite数据库的增删改查和事务(transaction)调用

上一篇文章中介绍了手工拼写sql语句进行数据库的CRUD操作,本文将介绍调用sqlite内置的方法实现CRUD操作,其实质也是通过拼写sql语句. 首先,创建一个新的android项目: 其次,查看代码实现增删查改: 1.创建DB工具类 MyDBHelper.java(创建数据库的操作) package com.amos.android_db; import android.content.Context; import android.database.sqlite.SQLiteDatabas

ADO.NET实现对SQL Server数据库的增删改查

了解了上一篇的ADO.NET简介,我们就可以来对数据库进行增删改查等基本操作了!下面是每种操作的具体实现. 先在自定义类的头部定义好数据库连接对象和连接字符串: 1 string connectionString = "Data Source=SC-201607131829;Initial Catalog=Animal;Integrated Security=True"; 2 3 SqlConnection conn; 1.数据库的查询操作,返回一个DataSet 1 public D