您的位置 首页 java

mybatis使用mapper接口生成实现类

mybatis在java开发中已经成为主流,它有很多优点,例如
1. 易于上手和掌握。
2. sql写在xml里,便于统一管理和优化。
3. 解除sql与程序代码的耦合。
4. 提供映射标签,支持对象与数据库的orm字段关系映射
5. 提供对象关系映射标签,支持对象关系组建维护
6. 提供xml标签,支持编写动态sql。

如图:我们在使用mybatis的时候,经常会这样写接口服务。

mybatis使用mapper接口生成实现类


Controller调用service
service有实现类serviceImpl
serviceImpl调用DAO
但是,不用写DAO的实现,你知道这是为什么吗?

一:配置spring集成mybatis

 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:conf/mybatis/config.xml"/>
</bean>  1234  

要实现对数据库的操作就要有sqlSession,而sqlSession就是有sqlSessionFactory创建的。

 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
     <property name="basePackage" value="com.lzz.aspp.**.dao,com.lzz.lsp.**.dao" />
</bean>123  

这段配置主要是配置映射文件的路径,这样做的好处就是不用写Dao的实现了,简单的说就是接好接口,写好映射文件 会自动映射到方法和sql语句。

二原理:
mybatis通过JDK的动态代理方式,在启动加载配置文件时,根据配置mapper的xml去生成Dao的实现。
session.getMapper()使用了代理,当调用一次此方法,都会产生一个代理class的instance,看看这个代理class的实现.

 
public class MapperProxy implements InvocationHandler { 
... 
public static <T> T newMapperProxy(Class<T> mapperInterface, SqlSession sqlSession) { 
    ClassLoader classLoader = mapperInterface.getClassLoader(); 
    Class<?>[] interfaces = new Class[]{mapperInterface}; 
    MapperProxy proxy = new MapperProxy(sqlSession); 
    return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy); 
  } 

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    if (!OBJECT_METHODS.contains(method.getName())) { 
      final Class<?> declaringInterface = findDeclaringInterface(proxy, method); 
      final MapperMethod mapperMethod = new MapperMethod(declaringInterface, method, sqlSession); 
      final Object result = mapperMethod.execute(args); 
      if (result == null && method.getReturnType().isPrimitive()) { 
        throw new BindingException("Mapper method '" + method.getName() + "' (" + method.getDeclaringClass() + ") attempted to return null from a method with a primitive return type (" +    method.getReturnType() + ")."); 
      } 
      return result; 
    } 
    return null; 
  }  

这里是用到了JDK的代理Proxy。 newMapperProxy()可以取得实现interfaces 的class的代理类的实例。

当执行interfaces中的方法的时候,会自动执行invoke()方法,其中public Object invoke(Object proxy, Method method, Object[] args)中 method参数就代表你要执行的方法.

MapperMethod类会使用method方法的methodName 和declaringInterface去取 sqlMapxml 取得对应的sql,也就是拿declaringInterface的类全名加上 sqlid..

文章来源:智云一二三科技

文章标题:mybatis使用mapper接口生成实现类

文章地址:https://www.zhihuclub.com/177532.shtml

关于作者: 智云科技

热门文章

网站地图