my02(mybatis02)
一、MyBatis拦截器:给参数对象属性赋值的实例
该拦截器的作用:在进行增加、修改等操作时,给数据模型的一些通用操作属性(如:创建人、创建时间、修改人、修改时间等)自动赋值。
该实现是在DAO层拦截,即存入DB前最后一层。后经分析,不是很合理,改为在service层拦截,用spring AOP来实现了,该代码遂弃用。不过已经测试可用,记录备忘。
package com.development;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
/**
*拦截器作用:给各实体对象在增加、修改时,自动添加操作属性信息。
*/
@Intercepts({@Signature(type= Executor.class, method="update", args={MappedStatement.class, Object.class})})
public class OpeInfoInterceptor implements Interceptor
{
public Object intercept(Invocation invocation) throws Throwable
{
Object[] args= invocation.getArgs();
System.out.println("-----------参数拦截---------------------------------------------------");
System.out.println("02当前线程ID:"+Thread.currentThread().getId());
//遍历处理所有参数,update方法有两个参数,参见Executor类中的update()方法。
for(int i=0;i
{
Object arg=args[i];
String className=arg.getClass().getName();
System.out.println(i+"参数类型:"+className);
//第一个参数处理。根据它判断是否给“操作属性”赋值。
if(arg instanceof MappedStatement)
{//如果是第一个参数 MappedStatement
MappedStatement ms=(MappedStatement)arg;
SqlCommandType sqlCommandType= ms.getSqlCommandType();
System.out.println("操作类型:"+sqlCommandType);
if(sqlCommandType== SqlCommandType.INSERT|| sqlCommandType==SqlCommandType.UPDATE)
{//如果是“增加”或“更新”操作,则继续进行默认操作信息赋值。否则,则退出
continue;
}
else
{
break;
}
}
//第二个参数处理。(只有第二个程序才能跑到这)
if(arg instanceof Map)
{//如果是map,有两种情况:(1)使用@Param多参数传入,由Mybatis包装成map。(2)原始传入Map
System.out.println("这是一个包装过的类型!");
Map map=(Map)arg;
for(Object obj: map.values())
{
setProperty(obj);
}
}
else
{//原始参数传入
setProperty(arg);
}
}
return invocation.proceed();
}
/**
*为对象的操作属性赋值
*@param obj
*/
private void setProperty(Object obj)
{
try
{
//TODO:根据需要,将相关属性赋上默认值
BeanUtils.setProperty(obj,"createrUsername","张三");
BeanUtils.setProperty(obj,"createDT", new Date());
}
catch(IllegalAccessException e)
{
e.printStackTrace();
}
catch(InvocationTargetException e)
{
e.printStackTrace();
}
}
public Object plugin(Object target)
{
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties)
{
}
}
二、mybatis bigdecimal 对应什么类型
在实际项目开发过程中,数据库dao层的增删改查操作,都要接收到前端页面传递过来的参数,然后再进行操作,那么在使用Mybatis数据库框架进行开发时,底层dao的参数传递怎么处理呢?
Mybatis传递参数有以下五种方式可以实现,下面以员工操作为例,看看具体的操作方式。
第一种方式使用顺序传递参数
EmployeeMapper.java文件:
EmployeeMapper.xml文件:
注意:xml里面的param1,param2的数字代表方法传入参数的顺序,必须严格按照参数顺序来引用,缺点呢不够灵活,而且特别参数个数多的时候也不是很方便。
第二种方式使用Mybatis自带的注解@Param传递参数
这种方式来传递参数,可以在xml文件中按照参数名称去引用。
EmployeeMapper.java文件:
EmployeeMapper.xml文件:
注意:在mapper.xml文件中sql语句参数变量名称要和@Param注解中定义的参数名称一样。
第三种方式使用Map集合传递参数
实际开发中当前端页面传递多个参数时,使用Map集合操作是一种推荐的方式。
EmployeeMapper.java文件:
EmployeeMapper.xml文件:
在上面的例子中可以看到使用map集合来传递多个参数进行查询,可以直接在sql语句中使用参数名称进行引用。
第四种方式使用JavaBean实体类传递参数
使用JavaBean实体类的方式来传递多个参数,使用时parameterType参数类型指定为对应的JavaBean实体类类型,sql语句中使用参数名称进行引用。
EmployeeMapper.java文件:
EmployeeMapper.xml文件:
第五种方式传递集合类型参数List集合
在一些复杂的操作中,比如下面的批量添加操作,传统的参数传递已无法满足需求,这时候就要用到List集合类型的参数传递,具体使用如下:
EmployeeMapper.java文件:
EmployeeMapper.xml文件:
三、mybatis generator为什么会生成withblobs
前面几个回答的都是什么东西。。。
说白了就是优化。
blob,longtext这些类型的数据数据量可能会很大。频繁的操作会有效率问题。
当我们不需要操作这些数据时,就可以使用id不带withBlobs的方法。(比如展示分页列表的时候,我们只需要展示简单的数据就可以了)
需要操作它们到时候,再通过id带withBlobs的方法来操作就行了(比如展示详情数据时)
可以类比延迟加载。