欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

抽丝剥茧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即可。 

以上。不定期更新详扯。