@Service
public class UserService {
@Autowired
private SqlSessionFactory sqlSessionFactory ;
* @description
* 获取 user 表的 元数据 表结构
* @author TianwYam
* @date 2021年10月6日上午9:05:14
* @return
public List<TableColumnBean> getUserMeta() {
List<TableColumnBean> columnList = new ArrayList<>();
try {
DatabaseMetaData metaData = sqlSessionFactory.openSession()
.getConnection()
.getMetaData();
ResultSet columns = metaData.getColumns("test", null, "user", null);
System.out.println("column: ");
while(columns.next()){
TableColumnBean columnBean = TableColumnBean.builder()
.dbName(columns.getString("TABLE_CAT"))
.tableName(columns.getString("TABLE_NAME"))
.columnName(columns.getString("COLUMN_NAME"))
.autoIncrement(columns.getString("IS_AUTOINCREMENT"))
.generatedColumn(columns.getString("IS_GENERATEDCOLUMN"))
.columnType(columns.getString("TYPE_NAME"))
.columnLength(columns.getInt("COLUMN_SIZE"))
.columnRemark(columns.getString("REMARKS"))
.build();
columnList.add(columnBean);
System.out.println(JSON.toJSONString(columnList, true));
} catch (SQLException e) {
e.printStackTrace();
return columnList;
mybatis 中对元数据的操作目录mybatis 中对元数据的操作1. 使用MySQL内部数据库information_schema表查询实现1.1 MySQL内部字段表 information_schema.COLUMNS1.2 mybatis的mapper.xml文件1.3 mybatis服务层1.4 输出结果2. 使用jdbc方式获取元数据2.1 使用原生jdbc获取元数据2.1.1 原生JDBC2.1.2 DatabaseMetaData.getColumns2.2 mybatis采用JDBC
Sql 注入产生原因及威胁:
当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。
Sql 注入带来的威胁主要有如下几点
猜解后台数据库,这是利用最多的方式,盗取网站的
N+1问题??
N+1问题来源于数据库中常见的级联技术,即N个数据库表形成关联关系,当再增加一个关联表时,也就是N+1个级联关系,由于某些时候,我们并不需要加载数据库的所有数据,而是某一个数据库表中数据,这时Mybatis会自动加载所有表的数据,多执行几条无关sql语句,会造成数据库资源的浪费以及系统性能的下降,这就是级联表的缺点。
如何解决N+1问题
<select id="findFields" resultType="java.lang.String">
select DISTINCT COLUMN_NAME,DATA_TYPE from information_schema.COLUMNS where table_name = #{dataTable}
</select>
随着业务的发展和合规要求,产品数据库将切换到Postgres。之前不同技术域,不同交付工程的数据分库管理的方式切换到PG数据库后将通过分schema管理。
ORM继续使用Mybatis,为使用迁移工作量极可能小,现有的SQL代码不做大的修改,考虑在Mybatis执行过程中做拦截,替换sql中的schema标识。
提取请求参数中的schema
约定rest接口请求参数中增加schema,通过切面技术从请求头中schema保持到线程变量中。
1. 提取schema代码
package com.postgr
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
mysql查询表名:
SELECT table_name FROM information_schema.tables WHERE table_schema='sell' AND table_type='base table';
查询表中的字段:
SELECT column_name FROM information_schema.columns WHERE table_sc...
private List<String> getTableName(String tradeTimeBegin,String tradeTimeEnd){
List<String> tableName = new ArrayList<>();
if(StringUtils.isBlank(tradeTimeBegin)){
tradeTimeBegin="2020-01-01";
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.1</version>
</dependency>
然后,你可以使用@TableField注解来标记你的实体类中的JSON类型字段:
```java
public class User {
// ... 省略其他字段
@TableField(typeHandler = JsonTypeHandler.class)
private Map<String, Object> extra;
这样,在使用mybatis-plus操作数据库时,extra字段就会自动使用JsonTypeHandler进行转换。
你也可以自定义自己的JsonTypeHandler来覆盖默认的转换器,例如使用你喜欢的JSON库进行转换。
```java
public class MyJsonTypeHandler extends JsonTypeHandler {
// ... 自定义实现
然后,在你的实体类中使用自定义的JsonTypeHandler:
```java
public class User {
// ... 省略其他字段
@TableField(typeHandler = MyJsonTypeHandler.class)
private Map<String, Object> extra;
最后,你就可以在mybatis-plus中像操作其他类型一样操作JSON类型数据了。