抽丝剥茧JavaWeb应用之简单扯扯mybatis,Interceptor ,Filter
程序员文章站
2022-03-05 14:15:30
...
本文主要概述在项目中使用mybatis及springMVC的小知识点
1.使用mybatis往oracle插入数据,mybatis返回的依然是更新数据的条数,并将主键写入对象中,及mybatis批量插入数据。下面的两种情况均可使用在插入后,将userId写入到对象中。
<insert id="addUser" parameterType="com.model.UserVO"> <selectKey keyProperty="userId" resultType="java.lang.String" order="BEFORE"> select SEQ_USER_SEQUENCE.NEXTVAL from dual </selectKey> insert into t_user (userId ,userName) values(userId,#{userName,jdbcType=VARCHAR}) </insert> <insert id="addUser" parameterType="com.model.UserVO"> <selectKey keyProperty="userId" resultType="java.lang.String" order="AFTER"> select SEQ_USER_SEQUENCE.currval from dual </selectKey> insert into t_user (userId ,userName) values(SEQ_USER_SEQUENCE.NEXTVAL,#{userName, jdbcType=VARCHAR}) </insert>
2:大量数据插入:
addUsers(List<UserVO> lists) //method <insert id="addUsers" parameterType="java.util.List"> insert into t_user (userId, userName) <foreach close=")" collection="list" item="item" index="index" open="(" separator="union"> select #{item.userId,jdbcType=VARCHAR}, #{item.userName,jdbcType=VARCHAR} from dual </foreach> </insert> <insert id="demoinsert" parameterType="java.util.List"> <foreach collection="list" item="item" index ="index" open="begin" close=";end;" separator=";"> insert into t_role_resources ( role_id , resource_id , available , modify_date , modify_user) values(#{item.roleId,jdbcType=VARCHAR} , #{item.resourceId ,jdbcType=INTEGER},#{item.available,jdbcType=VARCHAR}, sysdate,#{item.modifyUser,jdbcType=VARCHAR} ) </foreach> </insert>
此方法不适合特大数据的批量插入之后,一次性提交。大批量数据适合分批次提交,可参考博客:
http://blog.csdn.net/wlwlwlwl015/article/details/50246717
3:在操作数据库时,在开发环境下会测试每个sql的性能和耗时,可采用实现mybatis中的Interceptor
import java.util.Properties; import java.lang.reflect.Method; import org.apache.ibatis.plugin.*; import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Intercepts(value = { @Signature (type=Executor.class, method="update", args={MappedStatement.class,Object.class}), @Signature(type=Executor.class, method="query", args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class, CacheKey.class,BoundSql.class}), @Signature(type=Executor.class, method="query", args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})}) public class TimerInterceptor implements Interceptor { private static final Logger logger = LoggerFactory.getLogger(TimerInterceptor.class); /** * 实现拦截的地方 * */ @Override public Object intercept(Invocation invocation) throws Throwable { Object target = invocation.getTarget(); Object result = null; if (target instanceof Executor) { long start = System.currentTimeMillis(); Method method = invocation.getMethod(); /**执行方法*/ result = invocation.proceed(); long end = System.currentTimeMillis(); logger.info("[TimerInterceptor] execute [" + method.getName() + "] cost [" + (end - start) + "] ms"); } return result; } /** * Plugin.wrap生成拦截代理对象 * */ @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { } }
然后在mybatis的配置文件中,将这个类配置成plugin 。
4.在前后端开发时,开发环境出现的跨域问题,可以写一个Filter,实现这个接口,这样在开发环境便于与其他人员调试code。
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; // 指定允许其他域名访问 response.setHeader("Access-Control-Allow-Origin", "*"); // 表明它允许POST,GET,PUT,DELETE的外域请求 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); // 不需要再发送预检验请求,可以缓存该结果 response.setHeader("Access-Control-Max-Age", "3600"); // 表明它允许跨域请求包含content-type头 response.setHeader("Access-Control-Allow-Headers", " Origin, X-Requested-With, Content-Type, Accept"); chain.doFilter(req, res); }
然后在应用的web.xml中配置这个Filter即可。
以上。不定期更新详扯。
上一篇: Uneasy