diff --git a/module-database-api/src/main/java/ink/wgink/database/api/controller/DemoController.java b/module-database-api/src/main/java/ink/wgink/database/api/controller/DemoController.java deleted file mode 100644 index 16d462b2..00000000 --- a/module-database-api/src/main/java/ink/wgink/database/api/controller/DemoController.java +++ /dev/null @@ -1,11 +0,0 @@ -package ink.wgink.database.api.controller; - -/** - * @ClassName: DemoController - * @Description: - * @Author: wanggeng - * @Date: 2022/1/18 11:08 AM - * @Version: 1.0 - */ -public class DemoController { -} diff --git a/module-database-api/pom.xml b/module-database/pom.xml similarity index 94% rename from module-database-api/pom.xml rename to module-database/pom.xml index 6de8c347..7be806c3 100644 --- a/module-database-api/pom.xml +++ b/module-database/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - module-database-api + module-database diff --git a/module-database/src/main/java/ink/wgink/database/aop/JdbcAop.java b/module-database/src/main/java/ink/wgink/database/aop/JdbcAop.java new file mode 100644 index 00000000..204735bf --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/aop/JdbcAop.java @@ -0,0 +1,34 @@ +package ink.wgink.database.aop; + +import ink.wgink.exceptions.base.SystemException; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + * @ClassName: JdbcAop + * @Description: jdbcAop + * @Author: wanggeng + * @Date: 2021/10/29 11:10 上午 + * @Version: 1.0 + */ +@Aspect +@Component +public class JdbcAop { + + @Around("execution(public * ink.wgink.database.service..*.*(..))") + public Object apiLogAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + try { + return proceedingJoinPoint.proceed(); + } catch (Throwable e) { + if (e instanceof SQLException) { + throw new SystemException(e.getMessage()); + } + throw e; + } + } + +} diff --git a/module-database/src/main/java/ink/wgink/database/controller/api/mysql/MysqlController.java b/module-database/src/main/java/ink/wgink/database/controller/api/mysql/MysqlController.java new file mode 100644 index 00000000..0e201446 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/controller/api/mysql/MysqlController.java @@ -0,0 +1,111 @@ +package ink.wgink.database.controller.api.mysql; + +import ink.wgink.annotation.CheckRequestBodyAnnotation; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.database.pojo.dtos.mysql.MysqlDTO; +import ink.wgink.database.pojo.vos.mysql.MysqlVO; +import ink.wgink.database.service.mysql.IMysqlService; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultData; +import ink.wgink.pojo.result.SuccessResultList; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @ClassName: MysqlController + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "mysql连接接口") +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/mysql") +public class MysqlController extends DefaultBaseController { + + @Autowired + private IMysqlService mysqlService; + + @ApiOperation(value = "新增mysql连接", notes = "新增mysql连接接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("save") + @CheckRequestBodyAnnotation + public SuccessResult save(@RequestBody MysqlVO mysqlVO) { + mysqlService.save(mysqlVO); + return new SuccessResult(); + } + + @ApiOperation(value = "删除mysql连接", notes = "删除mysql连接接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "ids", value = "ID列表,用下划线分隔", paramType = "path", example = "1_2_3") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @DeleteMapping("remove/{ids}") + public SuccessResult remove(@PathVariable("ids") String ids) { + mysqlService.remove(Arrays.asList(ids.split("\\_"))); + return new SuccessResult(); + } + + @ApiOperation(value = "修改mysql连接", notes = "修改mysql连接接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "mysql连接ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update/{mysqlId}") + @CheckRequestBodyAnnotation + public SuccessResult update(@PathVariable("mysqlId") String mysqlId, @RequestBody MysqlVO mysqlVO) { + mysqlService.update(mysqlId, mysqlVO); + return new SuccessResult(); + } + + @ApiOperation(value = "mysql连接详情", notes = "mysql连接详情接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "mysql连接ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("get/{mysqlId}") + public MysqlDTO get(@PathVariable("mysqlId") String mysqlId) { + return mysqlService.get(mysqlId); + } + + @ApiOperation(value = "mysql连接列表", notes = "mysql连接列表接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List list() { + Map params = requestParams(); + return mysqlService.list(params); + } + + @ApiOperation(value = "mysql连接分页列表", notes = "mysql连接分页列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"), + @ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"), + @ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("listpage") + public SuccessResultList> listPage(ListPage page) { + Map params = requestParams(); + page.setParams(params); + return mysqlService.listPage(page); + } + + @ApiOperation(value = "mysql连接统计", notes = "mysql连接统计接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("count") + SuccessResultData count() { + Map params = requestParams(); + return new SuccessResultData<>(mysqlService.count(params)); + } + +} \ No newline at end of file diff --git a/module-database/src/main/java/ink/wgink/database/controller/api/mysql/jdbc/MysqlJdbcController.java b/module-database/src/main/java/ink/wgink/database/controller/api/mysql/jdbc/MysqlJdbcController.java new file mode 100644 index 00000000..c00c8314 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/controller/api/mysql/jdbc/MysqlJdbcController.java @@ -0,0 +1,170 @@ +package ink.wgink.database.controller.api.mysql.jdbc; + +import ink.wgink.annotation.CheckRequestBodyAnnotation; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.database.pojo.vos.sql.SqlVO; +import ink.wgink.database.service.jdbc.IJdbcService; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultData; +import ink.wgink.pojo.result.SuccessResultList; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +/** + * @ClassName: MysqlJdbcController + * @Description: Mysql JDBC + * @Author: wanggeng + * @Date: 2021/10/26 11:41 下午 + * @Version: 1.0 + */ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "mysql jdbc接口") +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/mysql/jdbc") +public class MysqlJdbcController extends DefaultBaseController { + + @Autowired + private IJdbcService jdbcService; + + @ApiOperation(value = "是否已经连接", notes = "是否已经连接接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("is-connected/{mysqlId}") + public SuccessResultData isConnected(@PathVariable("mysqlId") String mysqlId) { + Boolean isConnected = jdbcService.isConnected(mysqlId); + return new SuccessResultData<>(isConnected); + } + + @ApiOperation(value = "打开连接", notes = "打开连接接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("open-connection/{mysqlId}") + public SuccessResult openConnection(@PathVariable("mysqlId") String mysqlId) throws SQLException { + jdbcService.openConnection(mysqlId); + return new SuccessResult(); + } + + @ApiOperation(value = "关闭连接", notes = "关闭连接接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("close-connection/{mysqlId}") + public SuccessResult closeConnection(@PathVariable("mysqlId") String mysqlId) throws SQLException { + jdbcService.closeConnection(mysqlId); + return new SuccessResult(); + } + + @ApiOperation(value = "图示列表", notes = "图示列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "主键", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list-schemata/{mysqlId}") + public List> listSchemata(@PathVariable("mysqlId") String mysqlId) throws SQLException { + return jdbcService.listSchemata(mysqlId); + } + + @ApiOperation(value = "表列表", notes = "表列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "主键", paramType = "path"), + @ApiImplicitParam(name = "schemata", value = "图示", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list-table/{mysqlId}/{schemata}") + public List> listTable(@PathVariable("mysqlId") String mysqlId, + @PathVariable("schemata") String schemata) throws SQLException { + return jdbcService.listTable(mysqlId, schemata); + } + + @ApiOperation(value = "字段列表", notes = "字段列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "主键", paramType = "path"), + @ApiImplicitParam(name = "schemata", value = "图示", paramType = "path"), + @ApiImplicitParam(name = "table", value = "表名", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list-field/{mysqlId}/{schemata}/{table}") + public List> listField(@PathVariable("mysqlId") String mysqlId, + @PathVariable("schemata") String schemata, + @PathVariable("table") String table) throws SQLException { + return jdbcService.listField(mysqlId, schemata, table); + } + + @ApiOperation(value = "数据列表", notes = "数据列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "主键", paramType = "path"), + @ApiImplicitParam(name = "schemata", value = "图示", paramType = "path"), + @ApiImplicitParam(name = "table", value = "表名", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list-data/{mysqlId}/{schemata}/{table}") + public List> listData(@PathVariable("mysqlId") String mysqlId, + @PathVariable("schemata") String schemata, + @PathVariable("table") String table) throws SQLException { + return jdbcService.listData(mysqlId, schemata, table); + } + + @ApiOperation(value = "数据列表", notes = "数据列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "主键", paramType = "path"), + @ApiImplicitParam(name = "schemata", value = "图示", paramType = "path"), + @ApiImplicitParam(name = "table", value = "表名", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("list-data/{mysqlId}/{schemata}/{table}") + public List> listData(@PathVariable("mysqlId") String mysqlId, + @PathVariable("schemata") String schemata, + @PathVariable("table") String table, + @RequestBody SqlVO sqlVO) throws SQLException { + return jdbcService.listData(mysqlId, schemata, table, sqlVO); + } + + @ApiOperation(value = "数据分页列表", notes = "数据分页列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "主键", paramType = "path"), + @ApiImplicitParam(name = "schemata", value = "图示", paramType = "path"), + @ApiImplicitParam(name = "table", value = "表名", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("listpage-data/{mysqlId}/{schemata}/{table}") + public SuccessResultList>> listPageData(@PathVariable("mysqlId") String mysqlId, + @PathVariable("schemata") String schemata, + @PathVariable("table") String table, + @RequestParam(name = "page", defaultValue = "1", required = false) int page, + @RequestParam(name = "size", defaultValue = "20", required = false) int size) throws SQLException { + return jdbcService.listPageData(mysqlId, schemata, table, page, size); + } + + @ApiOperation(value = "执行SQL", notes = "数据分页列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mysqlId", value = "主键", paramType = "path"), + @ApiImplicitParam(name = "schemata", value = "图示", paramType = "path"), + @ApiImplicitParam(name = "table", value = "表名", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("execute-sql/{mysqlId}") + @CheckRequestBodyAnnotation + public SuccessResult executeSql(@PathVariable("mysqlId") String mysqlId, + @RequestParam(name = "page", defaultValue = "1", required = false) int page, + @RequestParam(name = "size", defaultValue = "20", required = false) int size, + @RequestBody SqlVO sqlVO) throws SQLException { + String sql = sqlVO.getSql(); + if (sql.startsWith("select") || sql.startsWith("SELECT")) { + return jdbcService.listPageQuerySql(mysqlId, page, size, sqlVO); + } + jdbcService.updateSql(mysqlId, sqlVO); + return new SuccessResult(); + } + +} diff --git a/module-database/src/main/java/ink/wgink/database/controller/app/api/mysql/MysqlAppController.java b/module-database/src/main/java/ink/wgink/database/controller/app/api/mysql/MysqlAppController.java new file mode 100644 index 00000000..9b1e6739 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/controller/app/api/mysql/MysqlAppController.java @@ -0,0 +1,121 @@ +package ink.wgink.database.controller.app.api.mysql; + +import ink.wgink.annotation.CheckRequestBodyAnnotation; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.database.pojo.dtos.mysql.MysqlDTO; +import ink.wgink.database.pojo.vos.mysql.MysqlVO; +import ink.wgink.database.service.mysql.IMysqlService; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultData; +import ink.wgink.pojo.result.SuccessResultList; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @ClassName: MysqlAppController + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_APP_PREFIX + "mysql连接接口") +@RestController +@RequestMapping(ISystemConstant.APP_PREFIX + "/mysql") +public class MysqlAppController extends DefaultBaseController { + + @Autowired + private IMysqlService mysqlService; + + @ApiOperation(value = "新增mysql连接", notes = "新增mysql连接接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("save") + @CheckRequestBodyAnnotation + public SuccessResult save(@RequestHeader("token") String token, @RequestBody MysqlVO mysqlVO) { + mysqlService.save(token, mysqlVO); + return new SuccessResult(); + } + + @ApiOperation(value = "删除mysql连接(id列表)", notes = "删除mysql连接(id列表)接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "ids", value = "ID列表,用下划线分隔", paramType = "path", example = "1_2_3") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @DeleteMapping("remove/{ids}") + public SuccessResult remove(@RequestHeader("token") String token, @PathVariable("ids") String ids) { + mysqlService.remove(token, Arrays.asList(ids.split("\\_"))); + return new SuccessResult(); + } + + @ApiOperation(value = "修改mysql连接", notes = "修改mysql连接接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "mysqlId", value = "mysql连接ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("updatemysql/{mysqlId}") + @CheckRequestBodyAnnotation + public SuccessResult updateMysql(@RequestHeader("token") String token, @PathVariable("mysqlId") String mysqlId, @RequestBody MysqlVO mysqlVO) { + mysqlService.update(token, mysqlId, mysqlVO); + return new SuccessResult(); + } + + @ApiOperation(value = "mysql连接详情(通过ID)", notes = "mysql连接详情(通过ID)接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "mysqlId", value = "mysql连接ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("get/{mysqlId}") + public MysqlDTO get(@RequestHeader("token") String token, @PathVariable("mysqlId") String mysqlId) { + return mysqlService.get(mysqlId); + } + + @ApiOperation(value = "mysql连接列表", notes = "mysql连接列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List list(@RequestHeader("token") String token) { + Map params = requestParams(); + return mysqlService.list(params); + } + + @ApiOperation(value = "mysql连接分页列表", notes = "mysql连接分页列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"), + @ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"), + @ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("listpagemysql") + public SuccessResultList> listPage(@RequestHeader("token") String token, ListPage page) { + Map params = requestParams(); + page.setParams(params); + return mysqlService.listPage(page); + } + + @ApiOperation(value = "mysql连接统计", notes = "mysql连接统计接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("count") + SuccessResultData count() { + Map params = requestParams(); + return new SuccessResultData<>(mysqlService.count(params)); + } + +} \ No newline at end of file diff --git a/module-database/src/main/java/ink/wgink/database/controller/route/mysql/MysqlRouteController.java b/module-database/src/main/java/ink/wgink/database/controller/route/mysql/MysqlRouteController.java new file mode 100644 index 00000000..6358a6c4 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/controller/route/mysql/MysqlRouteController.java @@ -0,0 +1,38 @@ +package ink.wgink.database.controller.route.mysql; + +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +/** + * @ClassName: MysqlController + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@Api(tags = ISystemConstant.ROUTE_TAGS_PREFIX + "mysql连接路由") +@RestController +@RequestMapping(ISystemConstant.ROUTE_PREFIX + "/mysql") +public class MysqlRouteController extends DefaultBaseController { + + @GetMapping("save") + public ModelAndView save() { + return new ModelAndView("mysql/save"); + } + + @GetMapping("update") + public ModelAndView update() { + return new ModelAndView("mysql/update"); + } + + @GetMapping("list") + public ModelAndView list() { + return new ModelAndView("mysql/list"); + } + +} \ No newline at end of file diff --git a/module-database/src/main/java/ink/wgink/database/controller/route/mysql/jdbc/MysqlJdbcRouteController.java b/module-database/src/main/java/ink/wgink/database/controller/route/mysql/jdbc/MysqlJdbcRouteController.java new file mode 100644 index 00000000..17b6b16f --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/controller/route/mysql/jdbc/MysqlJdbcRouteController.java @@ -0,0 +1,28 @@ +package ink.wgink.database.controller.route.mysql.jdbc; + +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +/** + * @ClassName: MysqlController + * @Description: mysql jdbc + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@Api(tags = ISystemConstant.ROUTE_TAGS_PREFIX + "mysql jdbc路由") +@RestController +@RequestMapping(ISystemConstant.ROUTE_PREFIX + "/mysql/jdbc") +public class MysqlJdbcRouteController extends DefaultBaseController { + + @GetMapping("query") + public ModelAndView save() { + return new ModelAndView("mysql/jdbc/query"); + } + +} \ No newline at end of file diff --git a/module-database/src/main/java/ink/wgink/database/dao/mysql/IMysqlDao.java b/module-database/src/main/java/ink/wgink/database/dao/mysql/IMysqlDao.java new file mode 100644 index 00000000..0213000c --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/dao/mysql/IMysqlDao.java @@ -0,0 +1,121 @@ +package ink.wgink.database.dao.mysql; + +import ink.wgink.database.pojo.bos.mysql.MysqlBO; +import ink.wgink.database.pojo.dtos.mysql.MysqlDTO; +import ink.wgink.database.pojo.pos.mysql.MysqlPO; +import ink.wgink.exceptions.RemoveException; +import ink.wgink.exceptions.SaveException; +import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.UpdateException; +import ink.wgink.interfaces.init.IInitBaseTable; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: IMysqlDao + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@Repository +public interface IMysqlDao extends IInitBaseTable { + + /** + * 新增mysql连接 + * + * @param params + * @throws SaveException + */ + void save(Map params) throws SaveException; + + /** + * 删除mysql连接 + * + * @param params + * @throws RemoveException + */ + void remove(Map params) throws RemoveException; + + /** + * 删除mysql连接(物理) + * + * @param params + * @throws RemoveException + */ + void delete(Map params) throws RemoveException; + + /** + * 修改mysql连接 + * + * @param params + * @throws UpdateException + */ + void update(Map params) throws UpdateException; + + /** + * mysql连接详情 + * + * @param params + * @return + * @throws SearchException + */ + MysqlDTO get(Map params) throws SearchException; + + /** + * mysql连接详情 + * + * @param params + * @return + * @throws SearchException + */ + MysqlBO getBO(Map params) throws SearchException; + + /** + * mysql连接详情 + * + * @param params + * @return + * @throws SearchException + */ + MysqlPO getPO(Map params) throws SearchException; + + /** + * mysql连接列表 + * + * @param params + * @return + * @throws SearchException + */ + List list(Map params) throws SearchException; + + /** + * mysql连接列表 + * + * @param params + * @return + * @throws SearchException + */ + List listBO(Map params) throws SearchException; + + /** + * mysql连接列表 + * + * @param params + * @return + * @throws SearchException + */ + List listPO(Map params) throws SearchException; + + /** + * mysql连接统计 + * + * @param params + * @return + * @throws SearchException + */ + Integer count(Map params) throws SearchException; + +} \ No newline at end of file diff --git a/module-database/src/main/java/ink/wgink/database/enums/ConnectionTypeEnum.java b/module-database/src/main/java/ink/wgink/database/enums/ConnectionTypeEnum.java new file mode 100644 index 00000000..d31d5bc4 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/enums/ConnectionTypeEnum.java @@ -0,0 +1,22 @@ +package ink.wgink.database.enums; + +/** + * @ClassName: ConnectionTypeEnum + * @Description: 连接类型枚举 + * @Author: wanggeng + * @Date: 2021/10/27 4:42 下午 + * @Version: 1.0 + */ +public enum ConnectionTypeEnum { + MYSQL("mysql"); + + private String value; + + ConnectionTypeEnum(String value) { + this.value = value; + } + + public String getValue() { + return value == null ? "" : value.trim(); + } +} diff --git a/module-database/src/main/java/ink/wgink/database/manager/ActiveConnectionManager.java b/module-database/src/main/java/ink/wgink/database/manager/ActiveConnectionManager.java new file mode 100644 index 00000000..dc157fea --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/manager/ActiveConnectionManager.java @@ -0,0 +1,69 @@ +package ink.wgink.database.manager; + +import ink.wgink.database.enums.ConnectionTypeEnum; +import ink.wgink.database.manager.entity.ActiveConnection; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @ClassName: ConnectionManager + * @Description: 连接管理器 + * @Author: wanggeng + * @Date: 2021/10/27 4:31 下午 + * @Version: 1.0 + */ +public class ActiveConnectionManager { + private static ActiveConnectionManager connectionManager = ConnectionManagerBuilder.CONNECTION_MANAGER; + private Map mysqlConnectionMap = new ConcurrentHashMap<>(); + + private ActiveConnectionManager() { + } + + public static ActiveConnectionManager getInstance() { + return connectionManager; + } + + public void add(ConnectionTypeEnum connectionTypeEnum, String id, Connection connection) { + if (ConnectionTypeEnum.MYSQL.equals(connectionTypeEnum)) { + mysqlConnectionMap.put(id, new ActiveConnection(id, connection)); + } + } + + public ActiveConnection getActiveConnection(ConnectionTypeEnum connectionTypeEnum, String id) { + if (ConnectionTypeEnum.MYSQL.equals(connectionTypeEnum)) { + return mysqlConnectionMap.get(id); + } + return null; + } + + public Connection getConnection(ConnectionTypeEnum connectionTypeEnum, String id) { + ActiveConnection activeConnection = getActiveConnection(connectionTypeEnum, id); + if (activeConnection == null) { + return null; + } + activeConnection.setLastUpdateTime(System.currentTimeMillis()); + return activeConnection.getConnection(); + } + + public void closeConnection(ConnectionTypeEnum connectionTypeEnum, String id) throws SQLException { + ActiveConnection activeConnection = getActiveConnection(connectionTypeEnum, id); + if (activeConnection == null) { + return; + } + Connection connection = activeConnection.getConnection(); + if (connection.isClosed()) { + return; + } + connection.close(); + mysqlConnectionMap.remove(id); + } + + + public static class ConnectionManagerBuilder { + public static ActiveConnectionManager CONNECTION_MANAGER = new ActiveConnectionManager(); + } + +} diff --git a/module-database/src/main/java/ink/wgink/database/manager/entity/ActiveConnection.java b/module-database/src/main/java/ink/wgink/database/manager/entity/ActiveConnection.java new file mode 100644 index 00000000..cef777ff --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/manager/entity/ActiveConnection.java @@ -0,0 +1,47 @@ +package ink.wgink.database.manager.entity; + +import java.sql.Connection; + +/** + * @ClassName: ActiveConnection + * @Description: 激活的连接 + * @Author: wanggeng + * @Date: 2021/10/27 4:40 下午 + * @Version: 1.0 + */ +public class ActiveConnection { + + private String id; + private Connection connection; + private long lastUpdateTime; + + public ActiveConnection(String id, Connection connection) { + this.id = id; + this.connection = connection; + this.lastUpdateTime = System.currentTimeMillis(); + } + + public String getId() { + return id == null ? "" : id.trim(); + } + + public void setId(String id) { + this.id = id; + } + + public Connection getConnection() { + return connection; + } + + public void setConnection(Connection connection) { + this.connection = connection; + } + + public long getLastUpdateTime() { + return lastUpdateTime; + } + + public void setLastUpdateTime(long lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } +} diff --git a/module-database/src/main/java/ink/wgink/database/pojo/bos/mysql/MysqlBO.java b/module-database/src/main/java/ink/wgink/database/pojo/bos/mysql/MysqlBO.java new file mode 100644 index 00000000..403f51f1 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/pojo/bos/mysql/MysqlBO.java @@ -0,0 +1,114 @@ +package ink.wgink.database.pojo.bos.mysql; + +/** + * + * @ClassName: MysqlBO + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +public class MysqlBO { + + private String mysqlId; + private String mysqlName; + private String mysqlHost; + private String mysqlPort; + private String mysqlUsername; + private String mysqlPassword; + private String creator; + private String gmtCreate; + private String modifier; + private String gmtModified; + private Integer isDelete; + + public String getMysqlId() { + return mysqlId == null ? "" : mysqlId.trim(); + } + + public void setMysqlId(String mysqlId) { + this.mysqlId = mysqlId; + } + + public String getMysqlName() { + return mysqlName == null ? "" : mysqlName.trim(); + } + + public void setMysqlName(String mysqlName) { + this.mysqlName = mysqlName; + } + + public String getMysqlHost() { + return mysqlHost == null ? "" : mysqlHost.trim(); + } + + public void setMysqlHost(String mysqlHost) { + this.mysqlHost = mysqlHost; + } + + public String getMysqlPort() { + return mysqlPort == null ? "" : mysqlPort.trim(); + } + + public void setMysqlPort(String mysqlPort) { + this.mysqlPort = mysqlPort; + } + + public String getMysqlUsername() { + return mysqlUsername == null ? "" : mysqlUsername.trim(); + } + + public void setMysqlUsername(String mysqlUsername) { + this.mysqlUsername = mysqlUsername; + } + + public String getMysqlPassword() { + return mysqlPassword == null ? "" : mysqlPassword.trim(); + } + + public void setMysqlPassword(String mysqlPassword) { + this.mysqlPassword = mysqlPassword; + } + + public String getCreator() { + return creator == null ? "" : creator.trim(); + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getGmtCreate() { + return gmtCreate == null ? "" : gmtCreate.trim(); + } + + public void setGmtCreate(String gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public String getModifier() { + return modifier == null ? "" : modifier.trim(); + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public String getGmtModified() { + return gmtModified == null ? "" : gmtModified.trim(); + } + + public void setGmtModified(String gmtModified) { + this.gmtModified = gmtModified; + } + + public Integer getIsDelete() { + return isDelete == null ? 0 : isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + +} diff --git a/module-database/src/main/java/ink/wgink/database/pojo/dtos/mysql/MysqlDTO.java b/module-database/src/main/java/ink/wgink/database/pojo/dtos/mysql/MysqlDTO.java new file mode 100644 index 00000000..2a5c405b --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/pojo/dtos/mysql/MysqlDTO.java @@ -0,0 +1,99 @@ +package ink.wgink.database.pojo.dtos.mysql; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * + * @ClassName: MysqlDTO + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@ApiModel +public class MysqlDTO { + + @ApiModelProperty(name = "mysqlId", value = "主键") + private String mysqlId; + @ApiModelProperty(name = "mysqlName", value = "连接名") + private String mysqlName; + @ApiModelProperty(name = "mysqlHost", value = "主机") + private String mysqlHost; + @ApiModelProperty(name = "mysqlPort", value = "端口") + private String mysqlPort; + @ApiModelProperty(name = "mysqlUsername", value = "用户名") + private String mysqlUsername; + @ApiModelProperty(name = "mysqlPassword", value = "密码") + private String mysqlPassword; + @ApiModelProperty(name = "gmtCreate", value = "创建时间") + private String gmtCreate; + @ApiModelProperty(name = "gmtModified", value = "修改时间") + private String gmtModified; + + public String getMysqlId() { + return mysqlId == null ? "" : mysqlId.trim(); + } + + public void setMysqlId(String mysqlId) { + this.mysqlId = mysqlId; + } + + public String getMysqlName() { + return mysqlName == null ? "" : mysqlName.trim(); + } + + public void setMysqlName(String mysqlName) { + this.mysqlName = mysqlName; + } + + public String getMysqlHost() { + return mysqlHost == null ? "" : mysqlHost.trim(); + } + + public void setMysqlHost(String mysqlHost) { + this.mysqlHost = mysqlHost; + } + + public String getMysqlPort() { + return mysqlPort == null ? "" : mysqlPort.trim(); + } + + public void setMysqlPort(String mysqlPort) { + this.mysqlPort = mysqlPort; + } + + public String getMysqlUsername() { + return mysqlUsername == null ? "" : mysqlUsername.trim(); + } + + public void setMysqlUsername(String mysqlUsername) { + this.mysqlUsername = mysqlUsername; + } + + public String getMysqlPassword() { + return mysqlPassword == null ? "" : mysqlPassword.trim(); + } + + public void setMysqlPassword(String mysqlPassword) { + this.mysqlPassword = mysqlPassword; + } + + public String getGmtCreate() { + return gmtCreate == null ? "" : gmtCreate.trim(); + } + + public void setGmtCreate(String gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public String getGmtModified() { + return gmtModified == null ? "" : gmtModified.trim(); + } + + public void setGmtModified(String gmtModified) { + this.gmtModified = gmtModified; + } + + +} diff --git a/module-database/src/main/java/ink/wgink/database/pojo/pos/mysql/MysqlPO.java b/module-database/src/main/java/ink/wgink/database/pojo/pos/mysql/MysqlPO.java new file mode 100644 index 00000000..d4c06762 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/pojo/pos/mysql/MysqlPO.java @@ -0,0 +1,114 @@ +package ink.wgink.database.pojo.pos.mysql; + +/** + * + * @ClassName: MysqlPO + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +public class MysqlPO { + + private String mysqlId; + private String mysqlName; + private String mysqlHost; + private String mysqlPort; + private String mysqlUsername; + private String mysqlPassword; + private String creator; + private String gmtCreate; + private String modifier; + private String gmtModified; + private Integer isDelete; + + public String getMysqlId() { + return mysqlId == null ? "" : mysqlId.trim(); + } + + public void setMysqlId(String mysqlId) { + this.mysqlId = mysqlId; + } + + public String getMysqlName() { + return mysqlName == null ? "" : mysqlName.trim(); + } + + public void setMysqlName(String mysqlName) { + this.mysqlName = mysqlName; + } + + public String getMysqlHost() { + return mysqlHost == null ? "" : mysqlHost.trim(); + } + + public void setMysqlHost(String mysqlHost) { + this.mysqlHost = mysqlHost; + } + + public String getMysqlPort() { + return mysqlPort == null ? "" : mysqlPort.trim(); + } + + public void setMysqlPort(String mysqlPort) { + this.mysqlPort = mysqlPort; + } + + public String getMysqlUsername() { + return mysqlUsername == null ? "" : mysqlUsername.trim(); + } + + public void setMysqlUsername(String mysqlUsername) { + this.mysqlUsername = mysqlUsername; + } + + public String getMysqlPassword() { + return mysqlPassword == null ? "" : mysqlPassword.trim(); + } + + public void setMysqlPassword(String mysqlPassword) { + this.mysqlPassword = mysqlPassword; + } + + public String getCreator() { + return creator == null ? "" : creator.trim(); + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getGmtCreate() { + return gmtCreate == null ? "" : gmtCreate.trim(); + } + + public void setGmtCreate(String gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public String getModifier() { + return modifier == null ? "" : modifier.trim(); + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public String getGmtModified() { + return gmtModified == null ? "" : gmtModified.trim(); + } + + public void setGmtModified(String gmtModified) { + this.gmtModified = gmtModified; + } + + public Integer getIsDelete() { + return isDelete == null ? 0 : isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + +} diff --git a/module-database/src/main/java/ink/wgink/database/pojo/result/SuccessResultSqlList.java b/module-database/src/main/java/ink/wgink/database/pojo/result/SuccessResultSqlList.java new file mode 100644 index 00000000..945ad5b2 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/pojo/result/SuccessResultSqlList.java @@ -0,0 +1,48 @@ +package ink.wgink.database.pojo.result; + +import ink.wgink.pojo.result.SuccessResult; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: SuccessResultList + * @Description: 成功列表结果 + * @Author: WangGeng + * @Date: 2019/3/3 12:21 AM + * @Version: 1.0 + **/ +public class SuccessResultSqlList extends SuccessResult { + + private static final long serialVersionUID = 7152646978840034322L; + + private List> fields; + private List> rows; + private Integer page; + private Long total; + + public SuccessResultSqlList() { + } + + public SuccessResultSqlList(List> fields, List> rows, Integer page, Long total) { + this.fields = fields; + this.rows = rows; + this.page = page; + this.total = total; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"fields\":") + .append(fields); + sb.append(",\"rows\":") + .append(rows); + sb.append(",\"page\":") + .append(page); + sb.append(",\"total\":") + .append(total); + sb.append('}'); + return sb.toString(); + } +} diff --git a/module-database/src/main/java/ink/wgink/database/pojo/vos/mysql/MysqlVO.java b/module-database/src/main/java/ink/wgink/database/pojo/vos/mysql/MysqlVO.java new file mode 100644 index 00000000..2365bc48 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/pojo/vos/mysql/MysqlVO.java @@ -0,0 +1,74 @@ +package ink.wgink.database.pojo.vos.mysql; + +import ink.wgink.annotation.CheckEmptyAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: MysqlVO + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@ApiModel +public class MysqlVO { + + @ApiModelProperty(name = "mysqlName", value = "连接名", required = true) + @CheckEmptyAnnotation(name = "连接名") + private String mysqlName; + @ApiModelProperty(name = "mysqlHost", value = "主机", required = true) + @CheckEmptyAnnotation(name = "主机") + private String mysqlHost; + @ApiModelProperty(name = "mysqlPort", value = "端口", required = true) + @CheckEmptyAnnotation(name = "端口") + private String mysqlPort; + @ApiModelProperty(name = "mysqlUsername", value = "用户名", required = true) + @CheckEmptyAnnotation(name = "用户名") + private String mysqlUsername; + @ApiModelProperty(name = "mysqlPassword", value = "密码", required = true) + @CheckEmptyAnnotation(name = "密码") + private String mysqlPassword; + + public String getMysqlName() { + return mysqlName == null ? "" : mysqlName.trim(); + } + + public void setMysqlName(String mysqlName) { + this.mysqlName = mysqlName; + } + + public String getMysqlHost() { + return mysqlHost == null ? "" : mysqlHost.trim(); + } + + public void setMysqlHost(String mysqlHost) { + this.mysqlHost = mysqlHost; + } + + public String getMysqlPort() { + return mysqlPort == null ? "" : mysqlPort.trim(); + } + + public void setMysqlPort(String mysqlPort) { + this.mysqlPort = mysqlPort; + } + + public String getMysqlUsername() { + return mysqlUsername == null ? "" : mysqlUsername.trim(); + } + + public void setMysqlUsername(String mysqlUsername) { + this.mysqlUsername = mysqlUsername; + } + + public String getMysqlPassword() { + return mysqlPassword == null ? "" : mysqlPassword.trim(); + } + + public void setMysqlPassword(String mysqlPassword) { + this.mysqlPassword = mysqlPassword; + } + + +} diff --git a/module-database/src/main/java/ink/wgink/database/pojo/vos/sql/SqlVO.java b/module-database/src/main/java/ink/wgink/database/pojo/vos/sql/SqlVO.java new file mode 100644 index 00000000..fcbd8f43 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/pojo/vos/sql/SqlVO.java @@ -0,0 +1,28 @@ +package ink.wgink.database.pojo.vos.sql; + +import ink.wgink.annotation.CheckEmptyAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: SqlVO + * @Description: SqlVO + * @Author: wanggeng + * @Date: 2021/10/27 6:15 下午 + * @Version: 1.0 + */ +@ApiModel +public class SqlVO { + + @ApiModelProperty(name = "sql", value = "sql语句", required = true) + @CheckEmptyAnnotation(name = "sql") + private String sql; + + public String getSql() { + return sql == null ? "" : sql.trim(); + } + + public void setSql(String sql) { + this.sql = sql; + } +} diff --git a/module-database/src/main/java/ink/wgink/database/service/connection/IConnection.java b/module-database/src/main/java/ink/wgink/database/service/connection/IConnection.java new file mode 100644 index 00000000..0c474964 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/service/connection/IConnection.java @@ -0,0 +1,22 @@ +package ink.wgink.database.service.connection; + +import java.sql.Connection; +import java.sql.SQLException; + +/** + * @ClassName: IConnection + * @Description: 连接 + * @Author: wanggeng + * @Date: 2021/10/26 11:56 下午 + * @Version: 1.0 + */ +public interface IConnection { + + /** + * 连接 + * + * @return + */ + Connection connect() throws SQLException; + +} diff --git a/module-database/src/main/java/ink/wgink/database/service/connection/impl/MySqlConnectionImpl.java b/module-database/src/main/java/ink/wgink/database/service/connection/impl/MySqlConnectionImpl.java new file mode 100644 index 00000000..a21305eb --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/service/connection/impl/MySqlConnectionImpl.java @@ -0,0 +1,43 @@ +package ink.wgink.database.service.connection.impl; + +import ink.wgink.database.service.connection.IConnection; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +/** + * @ClassName: MySqlConnectionImpl + * @Description: mysql连接 + * @Author: wanggeng + * @Date: 2021/10/26 11:57 下午 + * @Version: 1.0 + */ +public class MySqlConnectionImpl implements IConnection { + + private String host; + private String port; + private String username; + private String password; + + public MySqlConnectionImpl(String host, String port, String username, String password) { + this.host = host; + this.port = port; + this.username = username; + this.password = password; + } + + static { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Override + public Connection connect() throws SQLException { + return DriverManager.getConnection(String.format("jdbc:mysql://%s:%s?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true", host, port), username, password); + } + +} diff --git a/module-database/src/main/java/ink/wgink/database/service/jdbc/IJdbcService.java b/module-database/src/main/java/ink/wgink/database/service/jdbc/IJdbcService.java new file mode 100644 index 00000000..a3e0a96c --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/service/jdbc/IJdbcService.java @@ -0,0 +1,41 @@ +package ink.wgink.database.service.jdbc; + +import ink.wgink.database.pojo.vos.sql.SqlVO; +import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultList; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +/** + * @ClassName: IJdbcService + * @Description: jdbc + * @Author: wanggeng + * @Date: 2021/10/27 9:59 上午 + * @Version: 1.0 + */ +public interface IJdbcService { + + Boolean isConnected(String mysqlId); + + void openConnection(String mysqlId) throws SQLException; + + void closeConnection(String mysqlId) throws SQLException; + + List> listSchemata(String mysqlId) throws SQLException; + + List> listTable(String mysqlId, String schemata) throws SQLException; + + List> listField(String mysqlId, String schemata, String table) throws SQLException; + + List> listData(String mysqlId, String schemata, String table) throws SQLException; + + List> listData(String mysqlId, String schemata, String table, SqlVO sqlVO) throws SQLException; + + SuccessResultList>> listPageData(String mysqlId, String schemata, String table, int index, int size) throws SQLException; + + SuccessResult listPageQuerySql(String mysqlId, int page, int size, SqlVO sqlVO) throws SQLException; + + void updateSql(String mysqlId, SqlVO sqlVO) throws SQLException; +} diff --git a/module-database/src/main/java/ink/wgink/database/service/jdbc/impl/JdbcServiceImpl.java b/module-database/src/main/java/ink/wgink/database/service/jdbc/impl/JdbcServiceImpl.java new file mode 100644 index 00000000..f8c216bc --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/service/jdbc/impl/JdbcServiceImpl.java @@ -0,0 +1,180 @@ +package ink.wgink.database.service.jdbc.impl; + +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.database.enums.ConnectionTypeEnum; +import ink.wgink.database.manager.ActiveConnectionManager; +import ink.wgink.database.pojo.pos.mysql.MysqlPO; +import ink.wgink.database.pojo.vos.sql.SqlVO; +import ink.wgink.database.service.connection.IConnection; +import ink.wgink.database.service.connection.impl.MySqlConnectionImpl; +import ink.wgink.database.service.jdbc.IJdbcService; +import ink.wgink.database.service.mysql.IMysqlService; +import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.base.SystemException; +import ink.wgink.pojo.result.SuccessResultList; +import ink.wgink.util.jdbc.JdbcUtil; +import org.apache.commons.codec.binary.Base64; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +/** + * @ClassName: JdbcServiceImpl + * @Description: jdbc + * @Author: wanggeng + * @Date: 2021/10/27 9:59 上午 + * @Version: 1.0 + */ +@Service +public class JdbcServiceImpl extends DefaultBaseService implements IJdbcService { + + @Autowired + private IMysqlService mysqlService; + + @Override + public Boolean isConnected(String mysqlId) { + Connection connection = ActiveConnectionManager.getInstance().getConnection(ConnectionTypeEnum.MYSQL, mysqlId); + if (connection == null) { + return false; + } + return true; + } + + @Override + public void openConnection(String mysqlId) throws SQLException { + Connection connection = ActiveConnectionManager.getInstance().getConnection(ConnectionTypeEnum.MYSQL, mysqlId); + if (connection != null && !connection.isClosed()) { + return; + } + MysqlPO mysqlPO = mysqlService.getPO(mysqlId); + if (mysqlPO == null) { + throw new SearchException("数据库配置不存在"); + } + IConnection conn = new MySqlConnectionImpl(mysqlPO.getMysqlHost(), mysqlPO.getMysqlPort(), mysqlPO.getMysqlUsername(), mysqlPO.getMysqlPassword()); + ActiveConnectionManager.getInstance().add(ConnectionTypeEnum.MYSQL, mysqlId, conn.connect()); + } + + @Override + public void closeConnection(String mysqlId) throws SQLException { + ActiveConnectionManager.getInstance().closeConnection(ConnectionTypeEnum.MYSQL, mysqlId); + } + + @Override + public List> listSchemata(String mysqlId) throws SQLException { + Connection connection = getConnection(mysqlId); + String SQL = "SELECT * FROM `information_schema`.`SCHEMATA`"; + PreparedStatement preparedStatement = connection.prepareStatement(SQL); + return JdbcUtil.listResult(preparedStatement.executeQuery()); + } + + @Override + public List> listTable(String mysqlId, String schemata) throws SQLException { + Connection connection = getConnection(mysqlId); + String SQL = "SELECT * FROM `information_schema`.`TABLES` WHERE TABLE_SCHEMA = ?"; + PreparedStatement preparedStatement = connection.prepareStatement(SQL); + preparedStatement.setString(1, schemata); + return JdbcUtil.listResult(preparedStatement.executeQuery()); + } + + @Override + public List> listField(String mysqlId, String schemata, String table) throws SQLException { + Connection connection = getConnection(mysqlId); + String SQL = "SELECT * FROM `information_schema`.`COLUMNS` WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?"; + PreparedStatement preparedStatement = connection.prepareStatement(SQL); + preparedStatement.setString(1, schemata); + preparedStatement.setString(2, table); + return JdbcUtil.listResult(preparedStatement.executeQuery()); + } + + @Override + public List> listData(String mysqlId, String schemata, String table) throws SQLException { + Connection connection = getConnection(mysqlId); + String SQL = String.format("SELECT * FROM `%s`.`%s`", schemata, table); + PreparedStatement preparedStatement = connection.prepareStatement(SQL); + return JdbcUtil.listResult(preparedStatement.executeQuery()); + } + + @Override + public List> listData(String mysqlId, String schemata, String table, SqlVO sqlVO) throws SQLException { + String sql = Base64.encodeBase64String(sqlVO.getSql().getBytes(StandardCharsets.UTF_8)); + Connection connection = getConnection(mysqlId); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + return JdbcUtil.listResult(preparedStatement.executeQuery()); + } + + @Override + public SuccessResultList>> listPageData(String mysqlId, String schemata, String table, int page, int size) throws SQLException { + if (page < 1) { + page = 1; + } + if (size <= 0) { + size = 20; + } + String SQL = String.format("SELECT * FROM `%s`.`%s`", schemata, table); + return listPageQuery(mysqlId, SQL, page, size); + } + + @Override + public SuccessResultList>> listPageQuerySql(String mysqlId, int page, int size, SqlVO sqlVO) throws SQLException { + if (page < 1) { + page = 1; + } + if (size <= 0) { + size = 20; + } + return listPageQuery(mysqlId, sqlVO.getSql(), page, size); + } + + @Override + public void updateSql(String mysqlId, SqlVO sqlVO) throws SQLException { + Connection connection = getConnection(mysqlId); + PreparedStatement preparedStatement = connection.prepareStatement(sqlVO.getSql()); + preparedStatement.executeUpdate(); + } + + /** + * 执行请求 + * + * @param mysqlId + * @param sql + * @param page + * @param size + * @return + * @throws SQLException + */ + private SuccessResultList>> listPageQuery(String mysqlId, String sql, int page, int size) throws SQLException { + // 总数 + Connection connection = getConnection(mysqlId); + String countSQL = String.format("SELECT COUNT(*) total FROM (%s) t", sql); + PreparedStatement preparedStatement = connection.prepareStatement(countSQL); + Map countResult = JdbcUtil.getResult(preparedStatement.executeQuery()); + // 列表 + String querySQL = String.format("%s LIMIT ?,?", sql); + preparedStatement = connection.prepareStatement(querySQL); + preparedStatement.setInt(1, (page - 1) * size); + preparedStatement.setInt(2, size); + List> queryResult = JdbcUtil.listResult(preparedStatement.executeQuery()); + + return new SuccessResultList<>(queryResult, page, Long.valueOf(countResult.get("total").toString())); + } + + /** + * 得到连接 + * + * @return + */ + private Connection getConnection(String mysqlId) throws SQLException { + Connection connection = ActiveConnectionManager.getInstance().getConnection(ConnectionTypeEnum.MYSQL, mysqlId); + if (connection == null || connection.isClosed()) { + throw new SystemException("请重新连接数据库"); + } + return connection; + } + +} diff --git a/module-database/src/main/java/ink/wgink/database/service/mysql/IMysqlService.java b/module-database/src/main/java/ink/wgink/database/service/mysql/IMysqlService.java new file mode 100644 index 00000000..2c067e87 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/service/mysql/IMysqlService.java @@ -0,0 +1,188 @@ +package ink.wgink.database.service.mysql; + +import ink.wgink.database.pojo.bos.mysql.MysqlBO; +import ink.wgink.database.pojo.dtos.mysql.MysqlDTO; +import ink.wgink.database.pojo.pos.mysql.MysqlPO; +import ink.wgink.database.pojo.vos.mysql.MysqlVO; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.result.SuccessResultList; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: IMysqlService + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +public interface IMysqlService { + + /** + * 新增mysql连接 + * + * @param mysqlVO + * @return + */ + void save(MysqlVO mysqlVO); + + /** + * 新增mysql连接 + * + * @param token + * @param mysqlVO + * @return + */ + void save(String token, MysqlVO mysqlVO); + + /** + * 新增mysql连接 + * + * @param mysqlVO + * @return mysqlId + */ + String saveReturnId(MysqlVO mysqlVO); + + /** + * 新增mysql连接 + * + * @param token + * @param mysqlVO + * @return mysqlId + */ + String saveReturnId(String token, MysqlVO mysqlVO); + + /** + * 删除mysql连接 + * + * @param ids id列表 + * @return + */ + void remove(List ids); + + + /** + * 删除mysql连接 + * + * @param token + * @param ids id列表 + * @return + */ + void remove(String token, List ids); + + /** + * 删除mysql连接(物理删除) + * + * @param ids id列表 + */ + void delete(List ids); + + /** + * 修改mysql连接 + * + * @param mysqlId + * @param mysqlVO + * @return + */ + void update(String mysqlId, MysqlVO mysqlVO); + + /** + * 修改mysql连接 + * + * @param token + * @param mysqlId + * @param mysqlVO + * @return + */ + void update(String token, String mysqlId, MysqlVO mysqlVO); + + /** + * mysql连接详情 + * + * @param params 参数Map + * @return + */ + MysqlDTO get(Map params); + + /** + * mysql连接详情 + * + * @param mysqlId + * @return + */ + MysqlDTO get(String mysqlId); + + /** + * mysql连接详情 + * + * @param params 参数Map + * @return + */ + MysqlBO getBO(Map params); + + /** + * mysql连接详情 + * + * @param mysqlId + * @return + */ + MysqlBO getBO(String mysqlId); + + /** + * mysql连接详情 + * + * @param params 参数Map + * @return + */ + MysqlPO getPO(Map params); + + /** + * mysql连接详情 + * + * @param mysqlId + * @return + */ + MysqlPO getPO(String mysqlId); + + /** + * mysql连接列表 + * + * @param params + * @return + */ + List list(Map params); + + /** + * mysql连接列表 + * + * @param params + * @return + */ + List listBO(Map params); + + /** + * mysql连接列表 + * + * @param params + * @return + */ + List listPO(Map params); + + /** + * mysql连接分页列表 + * + * @param page + * @return + */ + SuccessResultList> listPage(ListPage page); + + /** + * mysql连接统计 + * + * @param params + * @return + */ + Integer count(Map params); + +} \ No newline at end of file diff --git a/module-database/src/main/java/ink/wgink/database/service/mysql/impl/MysqlServiceImpl.java b/module-database/src/main/java/ink/wgink/database/service/mysql/impl/MysqlServiceImpl.java new file mode 100644 index 00000000..d837ce55 --- /dev/null +++ b/module-database/src/main/java/ink/wgink/database/service/mysql/impl/MysqlServiceImpl.java @@ -0,0 +1,171 @@ +package ink.wgink.database.service.mysql.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.database.dao.mysql.IMysqlDao; +import ink.wgink.database.pojo.bos.mysql.MysqlBO; +import ink.wgink.database.pojo.dtos.mysql.MysqlDTO; +import ink.wgink.database.pojo.pos.mysql.MysqlPO; +import ink.wgink.database.pojo.vos.mysql.MysqlVO; +import ink.wgink.database.service.mysql.IMysqlService; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.result.SuccessResultList; +import ink.wgink.util.UUIDUtil; +import ink.wgink.util.map.HashMapUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: MysqlServiceImpl + * @Description: mysql连接 + * @Author: CodeFactory + * @Date: 2021-10-26 23:05:32 + * @Version: 3.0 + **/ +@Service +public class MysqlServiceImpl extends DefaultBaseService implements IMysqlService { + + @Autowired + private IMysqlDao mysqlDao; + + @Override + public void save(MysqlVO mysqlVO) { + saveReturnId(mysqlVO); + } + + @Override + public void save(String token, MysqlVO mysqlVO) { + saveReturnId(token, mysqlVO); + } + + @Override + public String saveReturnId(MysqlVO mysqlVO) { + return saveReturnId(null, mysqlVO); + } + + @Override + public String saveReturnId(String token, MysqlVO mysqlVO) { + String mysqlId = UUIDUtil.getUUID(); + Map params = HashMapUtil.beanToMap(mysqlVO); + params.put("mysqlId", mysqlId); + if (StringUtils.isBlank(token)) { + setSaveInfo(params); + } else { + setAppSaveInfo(token, params); + } + mysqlDao.save(params); + return mysqlId; + } + + @Override + public void remove(List ids) { + remove(null, ids); + } + + @Override + public void remove(String token, List ids) { + Map params = getHashMap(2); + params.put("mysqlIds", ids); + if (StringUtils.isBlank(token)) { + setUpdateInfo(params); + } else { + setAppUpdateInfo(token, params); + } + mysqlDao.remove(params); + } + + @Override + public void delete(List ids) { + Map params = getHashMap(2); + params.put("mysqlIds", ids); + mysqlDao.delete(params); + } + + @Override + public void update(String mysqlId, MysqlVO mysqlVO) { + update(null, mysqlId, mysqlVO); + } + + @Override + public void update(String token, String mysqlId, MysqlVO mysqlVO) { + Map params = HashMapUtil.beanToMap(mysqlVO); + params.put("mysqlId", mysqlId); + if (StringUtils.isBlank(token)) { + setUpdateInfo(params); + } else { + setAppUpdateInfo(token, params); + } + mysqlDao.update(params); + } + + @Override + public MysqlDTO get(Map params) { + return mysqlDao.get(params); + } + + @Override + public MysqlDTO get(String mysqlId) { + Map params = super.getHashMap(2); + params.put("mysqlId", mysqlId); + return get(params); + } + + @Override + public MysqlBO getBO(Map params) { + return mysqlDao.getBO(params); + } + + @Override + public MysqlBO getBO(String mysqlId) { + Map params = super.getHashMap(2); + params.put("mysqlId", mysqlId); + return getBO(params); + } + + @Override + public MysqlPO getPO(Map params) { + return mysqlDao.getPO(params); + } + + @Override + public MysqlPO getPO(String mysqlId) { + Map params = super.getHashMap(2); + params.put("mysqlId", mysqlId); + return getPO(params); + } + + @Override + public List list(Map params) { + return mysqlDao.list(params); + } + + @Override + public List listBO(Map params) { + return mysqlDao.listBO(params); + } + + @Override + public List listPO(Map params) { + return mysqlDao.listPO(params); + } + + @Override + public SuccessResultList> listPage(ListPage page) { + PageHelper.startPage(page.getPage(), page.getRows()); + List mysqlDTOs = list(page.getParams()); + PageInfo pageInfo = new PageInfo<>(mysqlDTOs); + return new SuccessResultList<>(mysqlDTOs, pageInfo.getPageNum(), pageInfo.getTotal()); + } + + @Override + public Integer count(Map params) { + Integer count = mysqlDao.count(params); + return count == null ? 0 : count; + } + +} \ No newline at end of file diff --git a/module-database/src/main/resources/mybatis/mapper/mysql/mysql-mapper.xml b/module-database/src/main/resources/mybatis/mapper/mysql/mysql-mapper.xml new file mode 100644 index 00000000..868b29e9 --- /dev/null +++ b/module-database/src/main/resources/mybatis/mapper/mysql/mysql-mapper.xml @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CREATE TABLE IF NOT EXISTS `conn_mysql` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `mysql_id` char(36) DEFAULT NULL COMMENT '主键', + `mysql_name` varchar(255) DEFAULT NULL COMMENT '连接名', + `mysql_host` varchar(255) DEFAULT NULL COMMENT '主机', + `mysql_port` varchar(10) DEFAULT NULL COMMENT '端口', + `mysql_username` varchar(255) DEFAULT NULL COMMENT '用户名', + `mysql_password` varchar(255) DEFAULT NULL COMMENT '密码', + `creator` char(36) DEFAULT NULL COMMENT '创建人', + `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', + `modifier` char(36) DEFAULT NULL COMMENT '修改人', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `is_delete` int(1) DEFAULT '0' COMMENT '是否删除', + PRIMARY KEY (`id`), + KEY `connection_id` (`mysql_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='mysql连接'; + + + + + INSERT INTO conn_mysql( + mysql_id, + mysql_name, + mysql_host, + mysql_port, + mysql_username, + mysql_password, + creator, + gmt_create, + modifier, + gmt_modified, + is_delete + ) VALUES( + #{mysqlId}, + #{mysqlName}, + #{mysqlHost}, + #{mysqlPort}, + #{mysqlUsername}, + #{mysqlPassword}, + #{creator}, + #{gmtCreate}, + #{modifier}, + #{gmtModified}, + #{isDelete} + ) + + + + + UPDATE + conn_mysql + SET + gmt_modified = #{gmtModified}, + modifier = #{modifier}, + is_delete = 1 + WHERE + mysql_id IN + + #{mysqlIds[${index}]} + + + + + + DELETE FROM + conn_mysql + WHERE + mysql_id IN + + #{mysqlIds[${index}]} + + + + + + UPDATE + conn_mysql + SET + + mysql_name = #{mysqlName}, + + + mysql_host = #{mysqlHost}, + + + mysql_port = #{mysqlPort}, + + + mysql_username = #{mysqlUsername}, + + + mysql_password = #{mysqlPassword}, + + gmt_modified = #{gmtModified}, + modifier = #{modifier}, + mysql_id = mysql_id + WHERE + mysql_id = #{mysqlId} + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-database/src/main/resources/templates/mysql/jdbc/query-layui.html b/module-database/src/main/resources/templates/mysql/jdbc/query-layui.html new file mode 100644 index 00000000..0c09925d --- /dev/null +++ b/module-database/src/main/resources/templates/mysql/jdbc/query-layui.html @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+
+
+
+
+
+
    +
    +
    +
    +
    +
    +
    + + 只能运行一条SQL语句 +
    + +
    +
    +
    +
      +
    • 查询结果
    • +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
      +
    • 打开
    • + + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/module-database/src/main/resources/templates/mysql/jdbc/query.html b/module-database/src/main/resources/templates/mysql/jdbc/query.html new file mode 100644 index 00000000..69201961 --- /dev/null +++ b/module-database/src/main/resources/templates/mysql/jdbc/query.html @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    +
    +
      +
      +
      + +
      +
      +
      +
        +
      • 打开
      • + + +
      +
      + + + + + + + + + + + + + \ No newline at end of file diff --git a/module-database/src/main/resources/templates/mysql/list.html b/module-database/src/main/resources/templates/mysql/list.html new file mode 100644 index 00000000..7f925210 --- /dev/null +++ b/module-database/src/main/resources/templates/mysql/list.html @@ -0,0 +1,301 @@ + + + + + + + + + + + + + +
      +
      +
      +
      +
      +
      +
      + +
      + 新增时间 +
      + +
      +
      + +
      + +
      +
      + + +
      +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/module-database/src/main/resources/templates/mysql/save.html b/module-database/src/main/resources/templates/mysql/save.html new file mode 100644 index 00000000..ed2fc0e7 --- /dev/null +++ b/module-database/src/main/resources/templates/mysql/save.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + +
      +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      注意:必须是服务器能够访问到的地址
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/module-database/src/main/resources/templates/mysql/update.html b/module-database/src/main/resources/templates/mysql/update.html new file mode 100644 index 00000000..805824e5 --- /dev/null +++ b/module-database/src/main/resources/templates/mysql/update.html @@ -0,0 +1,147 @@ + + + + + + + + + + + + + +
      +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      注意:必须是服务器能够访问到的地址
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f5b0740a..5a1f28af 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ mongo-module-dictionary redis-cache mongo-module-file - module-database-api + module-database module-form basic-abstract @@ -55,6 +55,7 @@ 5.2.9.RELEASE 2.3.3.RELEASE 1.2.25 + 2.0.2 20210307 2.2.11 3.2.12 @@ -188,6 +189,11 @@ fastjson ${fastjson.version}
      + + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.version} + @@ -437,16 +443,6 @@ tomcat-embed-core ${tomcat-embed.version} - - org.apache.tomcat.embed - tomcat-embed-el - ${tomcat-embed.version} - - - org.apache.tomcat.embed - tomcat-embed-websocket - ${tomcat-embed.version} -