记一次设计pojo生成工具出现的问题-mysql 获取数据库表的的所有列属性以及其他信息
2019-05-31 17:59
696 查看
最近在做一个pojo,dao生成工具,了解了一下mysql相关的东西,这里做个总结:
获取某个库指定表的列的属性:
[code]select COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT from information_schema.COLUMNS where table_name = '表名' and table_schema = '数据库名';
数据库的查询结果:
mybatis的mapper实现:
[code] <select id="listTableColumns" resultType="com.arror.code_factory.model.TableColumnDO"> select COLUMN_NAME as columnName,DATA_TYPE as dataType,COLUMN_COMMENT as columnComment from information_schema.`COLUMNS` where table_name = #{tableName} and TABLE_SCHEMA=#{dataBase} </select>
这样一次只能查询一个表的属性,我试着改了一下sql改成in查询,查询一个数据库 里面的指定数据库的列属性:
[code]select COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT from information_schema.COLUMNS where table_name in ('gy_user','mqtt_acl') and table_schema = 'gy_account';
最后却是这样的结果,这样的结果对于mybais不是很好处理。然后放弃了这种方式。
工具实现的效果:
可以同时选择我们需要的任何表,任何 库前端选什么我们后端就造什么数据的pojo,baseDao。
这样会存在一个问题,数据库的连接问题,当连接不同的库的时候会需要不同的连接,对于这个问题,有两种解决方式
1.直接初始化多个数据库连接,需要哪个用哪一个
2.将数据库连接写在业务层,调用一次创建一次。
第一种方式是最好的,
一开始我采用的是第二个方式,采用原生的mybatis去连接数据库
[code]package com.arror.code_factory.mybatis; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; /** * @Description * @Author DJZ-WWS * @Date 2019/5/31 8:54 */ public class GetSessionFactory { private static SqlSessionFactory sqlSessionFactory; private GetSessionFactory(){ } synchronized public static SqlSessionFactory getSqlSessionFactory(String resources){ if(sqlSessionFactory==null){ InputStream inputStream=null; try { inputStream= Resources.getResourceAsStream(resources); }catch (Exception e){ e.printStackTrace(); } sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } return sqlSessionFactory; } }
代码如上面,根据不同的库我去加载不同的配置文件,当然mybatis支持多数据源的,这里没有去这么实现
考虑到数据库连接,这种情况一般一个资源就够了,我暂时使用了hashmap做缓存(后期优化使用Guava的本地缓存技术实现),
[code] private SqlSessionFactory getSqlSessionFactory(String dataName) { //在这里使用缓存优化性能 if(cacheMap.get(dataName)!=null){ return cacheMap.get(dataName); } SqlSessionFactory sqlSessionFactory=null; if(dataName.equals(DataBaseEnum.GY_ACCOUNT.getDataBase())){ String resources="mybatisconfig/gy_account.xml"; sqlSessionFactory = GetSessionFactory.getSqlSessionFactory(resources); cacheMap.put("gy_account",sqlSessionFactory); } if(dataName.equals(DataBaseEnum.GY_PROJECT.getDataBase())){ String resources="mybatisconfig/gy_project.xml"; sqlSessionFactory=GetSessionFactory.getSqlSessionFactory(resources); cacheMap.put("gy_account",sqlSessionFactory); } if(dataName.equals(DataBaseEnum.GY_CORE.getDataBase())){ String resources="mybatisconfig/gy_core.xml"; sqlSessionFactory=GetSessionFactory.getSqlSessionFactory(resources); cacheMap.put("gy_account",sqlSessionFactory); } if(dataName.equals(DataBaseEnum.GY_MODEL.getDataBase())){ String resources="mybatisconfig/gy_model.xml"; sqlSessionFactory=GetSessionFactory.getSqlSessionFactory(resources); cacheMap.put("gy_account",sqlSessionFactory); } return sqlSessionFactory; }
这样就暂时保证了不会重复创建多余的资源。
一些关于系统路径问题:
[code]System.getProperty("user.home") 获取用户系统的用户目录 我的是 C:\Users\DELL
System.getProperty("user.dir") 获取项目部署后tomcat所在的bin目录下,
还有一处优化,原本我采用的是双层for循环,为了减少数据的查询压力使用了map,将双重的循环转成了一层数据库查询循环
[code]public void handler(List<SQLParam> sqlParams) { String baseFile = System.getProperty("user.home") + File.separator + "code" + File.separator; //表名数据库map 减少创建数据库连接次数 Map<String,String> tableMap=new HashMap<>(); sqlParams.forEach(e->{ e.getTableNames().forEach(t->{ tableMap.put(t,e.getDataName()); }); }); for (Map.Entry<String,String> entry:tableMap.entrySet()){ createPoJoHandler.createPojo(entry.getKey(), baseFile,entry.getValue()); System.out.println("Pojo生成完毕"); createDaoHandler.createDao(entry.getKey(), baseFile,entry.getValue()); System.out.println("DAO生成完毕"); createServiceHandler.createService(entry.getKey(), baseFile,entry.getValue()); System.out.println("SERVICE生成完毕"); createServiceImplHandler.createServiceImpl(entry.getKey(), baseFile,entry.getValue()); System.out.println("SERVICEIMPL生成完毕"); createXmlHandler.createXml(entry.getKey(), baseFile,entry.getValue()); System.out.println("XML生成完毕"); } }
还有一个问题:数据库连接问题
[code] <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://192.168.111.111:3306/gy_xxx?useSSL=false&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true" /> <property name="username" value="xxxn" /> <property name="password" value="xxx" /> </dataSource> </environment> </environments>
没有使用properties,在URL后面拼接条件,会提示错误信息
解决办法:将&进行转义换成
[code]&
工具还会继续更新。。。。。。
相关文章推荐
- Mysql获取数据库的所有表,以及表所有字段信息
- 数据库编程细节问题 -- 获取关于mysql的基本信息
- 转 windows 环境下 mysql 数据库的升级以及 出现问题的解决 Communication link failure: Bad handshake
- MySQL SQL Server 获取数据库中的所有表信息,字段信息
- Sqlserver获取所有数据库名,表信息,字段信息,主键信息,以及表结构等。
- mysql的编码问题以及购物网站的数据库设计
- mybatis mysql获取当前数据库所有表与表字段信息
- Sqlserver获取所有数据库名,表信息,字段信息,主键信息,以及表结构等。
- Oracle SQLServer MySQL查看当前所有数据库表名及其他信息
- mysql 数据库 操作 获取某一个表的所有信息 主键 外键 类型
- mysql:获取当前数据库信息以及SELECT命令的使用
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- DMP文件的生成和使用(转),由于须要取得用户出现问题的信息,所以须要取得demp信息,可以通过本方法获取。
- 获取数据库的所有用户表 以及 获取指定表的相关字段属性
- 获取mysql表中字段备注信息以及选中数据库中表的备注信息
- RSA 密钥生成工具,以及出现的问题
- 获取某个数据库中所有表的信息的操作oracle和mysql的操作
- 针对不同数据库,获取当前用户所有有权限查看的表,以及表的创建时间、更新时间、注释等信息,表中字段的相关信息(包含分页实现)
- 解决Mysql安装问题 出现security1045 ,数据库1045修改密码以及eclipse出现乱码问题(真心真心帮助)