接到一个需求,在某操作(这个是gen代码自动生成的,比如导入)后,需要对这个操作进行记录,并且可以根据记录信息将本次导入影响数据进行删除。需要应用记录操作的表大概有100多个。
分析:
1,首先想记录操作的表要有一个批次号字段,其次要有一个另外的表记录这个批次号。
2,可以使用AOP编程来实现,AOP解决了记录的时机和位置,还需要使用反射获取切入点的信息,从而进行加料操作。
下面是一些遇到问题的解决方法
1,切入点表达式
2,JoinPoint接口和Signature接口
2,自定义注解
4,时间格式化到毫秒(Java 和 sql 的不同)
5,可能存在的并发bug:
后询问得知并发量并不高,为了保险还是简单用一个用户名+哈希 定义一个用户当前操作。
6,Mybatis $和#的实际使用场景,如果表名不确定,需要传参进去(这个传参的参数是我自己生成的,不是前端页面传进来的),需要使用${},不要使用#{}
7,正则:未解决的一个问题,使用代码硬撸实现了,这提醒我要收集一批常见正则拿来即用那种。
8,获取表字段,这个mysq很简单,desc即可,我现在用的数据库有点麻烦,非主流,国产数据库人大金仓,底层应该是pgsql,解决方法如下:
<select id="ipBatch" parameterType="java.lang.String" resultType="java.util.Map">
select c.relname, col_description(a.attrelid, a.attnum) as comment, format_type(a.atttypid, a.atttypmod) as type,
a.attname as name, a.attnotnull as notnull from pg_class as c, pg_attribute as a where a.attrelid = c.oid and a.attnum > 0
and c.relname = #{tbname};
</select>
贴的XML代码,各参数名简单修改了下,tbname是我传进去的表名
9,mybatis的注解和XML使用权衡
简单增删改查用注解,复杂连表用XML
10,事务传播性
前置通知不融合到原始方法事务中,后置通知融入到原始方法事务中。因为前置通知发生时原始方法还没有发生,后置通知会影响原始方法事务。