首页源码my02(mybatis02)

my02(mybatis02)

编程之家2024-01-24190次浏览

一、MyBatis拦截器:给参数对象属性赋值的实例

该拦截器的作用:在进行增加、修改等操作时,给数据模型的一些通用操作属性(如:创建人、创建时间、修改人、修改时间等)自动赋值。

my02(mybatis02)

该实现是在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;

my02(mybatis02)

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;

my02(mybatis02)

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的方法来操作就行了(比如展示详情数据时)

可以类比延迟加载。

windows server 2003 序列号(服务器2003系统序列号)shutdown重启(shutdown立即关机命令)