动态数据库增删改查增强版

实体类

package com.phone.entity;

import lombok.Data;
import lombok.ToString;

@Data
public class MyDatasource {

	private String driverClassName;
	
	private String db;
	
	private String username;
	
	private String password;
	
	private String ip;
	
	private String port;
	
	private String sql;
	
	private String dbType;
	
	private String url;
	
	private org.springframework.jdbc.datasource.DriverManagerDataSource driverManagerDataSource;

	@Override
	public String toString() {
		return "MyDatasource [driverClassName=" + driverClassName + ", db=" + db + ", username=" + username
				+ ", password=" + password + ", ip=" + ip + ", port=" + port + ", sql=" + sql + ", dbType=" + dbType
				+ ", url=" + url + ", driverManagerDataSource=" + driverManagerDataSource + "]";
	}
}

缓存机制

package com.phone.jdbc;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;

import com.phone.entity.MyDatasource;

@Aspect
@Component
public class AdviceTest {
	private static Map<String,DriverManagerDataSource> map=new HashMap<>();
	
	// 表达式需要根据实际情况修改
	//@Around("execution(* com.phone.jdbc.*.testConnection*(..))")
	@Around("execution(* com.phone.jdbc.*.*(..))")
    public Object process(ProceedingJoinPoint point) throws Throwable {
		System.out.println(map);
        System.out.println("@Around:执行目标方法之前...");
        //访问目标方法的参数:
        Object[] args = point.getArgs();
        if (args != null && args.length > 0 && args[0].getClass() == MyDatasource.class) {
        	MyDatasource myDatasource= (MyDatasource) args[0];
        	String url = "jdbc:DBTYPE://IP:PORT/DB?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT";
    		url=url.replace("DBTYPE", myDatasource.getDbType()).replace("IP", myDatasource.getIp()).replace("PORT", myDatasource.getPort()).replace("DB", myDatasource.getDb());
    		myDatasource.setUrl(url);
    		DriverManagerDataSource myDatasource2 = map.get(url);
        	if(myDatasource2==null) {
        		System.out.println("没用缓存");
        			DriverManagerDataSource dataSource=new DriverManagerDataSource();        		
        		dataSource.setUsername(myDatasource.getUsername());
        		dataSource.setPassword(myDatasource.getPassword());
        		dataSource.setDriverClassName(myDatasource.getDriverClassName());
        		dataSource.setUrl(url);
        		myDatasource.setDriverManagerDataSource(dataSource);
        		args[0]=myDatasource;
               	Object proceed = point.proceed(args);
               	if(proceed !=null) {
               		map.put(url, dataSource);
               	}
               	return (List<Map<String,Object>>)proceed;
                //return Collections.EMPTY_LIST; 
        	}else {
        		System.out.println("使用缓存");
        		myDatasource.setDriverManagerDataSource(myDatasource2);
        		Object proceed = point.proceed(args);
        		return (List<Map<String,Object>>)proceed;
                //return Collections.EMPTY_LIST; 
        	}
        }
        //用改变后的参数执行目标方法
        System.out.println("@Around:执行目标方法之后...");
        System.out.println("@Around:被织入的目标对象为:" + point.getTarget());
		return args;
       
    }
}

查询的一个demo

package com.phone.jdbc;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.phone.entity.MyDatasource;

@RestController
public class QueryDa {

	/**
	 * 动态使用任意数据库查询数据
	 * @param myDatasource
	 */
	@PostMapping("testConnection")
	public List<Map<String,Object>> testConnection(@RequestBody MyDatasource myDatasource) {
		JdbcTemplate jdbcTemplate=new JdbcTemplate();
		jdbcTemplate.setDataSource(myDatasource.getDriverManagerDataSource());
		String sql=myDatasource.getSql();
		List<Map<String,Object>> queryForList = jdbcTemplate.queryForList(sql);
		if(queryForList==null) {
			return Collections.EMPTY_LIST;
		}
		for (Map<String, Object> map : queryForList) {
			System.out.println("-------------------");
			for (String key : map.keySet()) {
				Object object = map.get(key);
				System.out.println("key:"+key+"|value:"+object);
			}
		}
		return queryForList;
	}
	
	
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
若依是一套基于 Spring Boot 和 Vue.js 的开源管理系统快速开发框架。下面是使用若依框架开发管理后台的方法: **前端技术** 若依框架前端采用的是 Vue.js,使用了 Element UI 组件库和 Vue-Router 路由框架。在前端开发中,主要涉及到的技术包括: - Vue.js:Vue.js 是一个渐进式 JavaScript 框架,可以用于构建用户界面和单页应用程序(SPA)。 - Element UI:Element UI 是一套基于 Vue.js 的组件库,提供了丰富的 UI 组件和交互效果。 - Vue-Router:Vue-Router 是 Vue.js 官方的路由框架,用于管理单页应用的路由。 **后端技术** 若依框架后端采用的是 Spring Boot,使用了 MyBatis-Plus 增强版和 Shiro 安全框架。在后端开发中,主要涉及到的技术包括: - Spring Boot:Spring Boot 是一个基于 Spring 框架的快速开发框架,用于构建独立的、可执行的 Spring 应用程序。 - MyBatis-Plus:MyBatis-Plus 是 MyBatis 的增强版,提供了更加便捷的操作数据库的方式。 - Shiro:Shiro 是一个强大且易于使用的 Java 安全框架,提供了身份验证、授权、加密等功能。 **数据库增删改查** 若依框架使用的是 MyBatis-Plus 操作数据库,MyBatis-Plus 提供了丰富的 API,可以简化数据库增删改查操作。以用户管理为例,以下是一个简单的操作示例: 1. 定义实体类 ```java @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class SysUser extends BaseEntity { private static final long serialVersionUID = 1L; /** * 用户ID */ @TableId(value = "user_id", type = IdType.AUTO) private Long userId; /** * 用户账号 */ @TableField(value = "user_name") private String userName; /** * 用户昵称 */ @TableField(value = "nick_name") private String nickName; /** * 用户邮箱 */ @TableField(value = "email") private String email; /** * 手机号码 */ @TableField(value = "phonenumber") private String phonenumber; /** * 用户性别(0男 1女 2未知) */ @TableField(value = "sex") private String sex; /** * 头像地址 */ @TableField(value = "avatar") private String avatar; /** * 密码 */ @TableField(value = "password") private String password; /** * 帐号状态(0正常 1停用) */ @TableField(value = "status") private String status; /** * 删除标志(0代表存在 2代表删除) */ @TableField(value = "del_flag") private String delFlag; /** * 最后登录IP */ @TableField(value = "login_ip") private String loginIp; /** * 最后登录时间 */ @TableField(value = "login_date") private Date loginDate; /** * 部门对象 */ @TableField(exist = false) private SysDept dept; /** * 角色对象 */ @TableField(exist = false) private List<SysRole> roles; /** * 角色组 */ @TableField(exist = false) private Long[] roleIds; } ``` 2. 定义 Mapper 接口 ```java public interface SysUserMapper extends BaseMapper<SysUser> { /** * 根据条件分页查询用户列表 * * @param page 分页对象 * @param user 用户信息 * @return 用户信息集合信息 */ List<SysUser> selectUserList(@Param("page") Page<SysUser> page, @Param("user") SysUser user); /** * 根据用户名查询用户 * * @param userName 用户名 * @return 用户对象信息 */ SysUser selectUserByUserName(String userName); /** * 根据用户ID查询用户所属角色组 * * @param userId 用户ID * @return 结果 */ List<Integer> selectUserRoleListByUserId(Long userId); } ``` 3. 在 Service 中调用 Mapper ```java @Service public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService { /** * 查询用户列表 * * @param user 用户信息 * @return 用户信息集合 */ @Override public List<SysUser> selectUserList(SysUser user) { return baseMapper.selectUserList(user); } /** * 根据用户名查询用户 * * @param userName 用户名 * @return 用户对象信息 */ @Override public SysUser selectUserByUserName(String userName) { return baseMapper.selectUserByUserName(userName); } /** * 根据用户ID查询用户所属角色组 * * @param userId 用户ID * @return 结果 */ @Override public List<Integer> selectUserRoleListByUserId(Long userId) { return baseMapper.selectUserRoleListByUserId(userId); } } ``` 4. 在 Controller 中调用 Service ```java @RestController @RequestMapping("/system/user") public class SysUserController extends BaseController { @Autowired private ISysUserService userService; /** * 查询用户列表 */ @PreAuthorize("@ss.hasPermi('system:user:list')") @GetMapping("/list") public TableDataInfo list(SysUser user) { startPage(); List<SysUser> list = userService.selectUserList(user); return getDataTable(list); } /** * 根据用户编号获取详细信息 */ @PreAuthorize("@ss.hasPermi('system:user:query')") @GetMapping(value = "/{userId}") public AjaxResult getInfo(@PathVariable Long userId) { return AjaxResult.success(userService.getById(userId)); } /** * 新增用户 */ @PreAuthorize("@ss.hasPermi('system:user:add')") @Log(title = "用户管理", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@Validated @RequestBody SysUser user) { user.setSalt(ShiroUtils.randomSalt()); user.setPassword(ShiroUtils.encryptPassword(user.getPassword(), user.getUserName(), user.getSalt())); return toAjax(userService.save(user)); } /** * 修改用户 */ @PreAuthorize("@ss.hasPermi('system:user:edit')") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@Validated @RequestBody SysUser user) { return toAjax(userService.updateById(user)); } /** * 删除用户 */ @PreAuthorize("@ss.hasPermi('system:user:remove')") @Log(title = "用户管理", businessType = BusinessType.DELETE) @DeleteMapping("/{userIds}") public AjaxResult remove(@PathVariable Long[] userIds) { return toAjax(userService.removeByIds(Arrays.asList(userIds))); } } ``` 以上是一个简单的操作示例,若依框架提供了更加便捷的操作数据库的方式,可以参考官方文档进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值