JAVA类获取mybatis的mapper进行数据库操作

- 0x00 前言
最近在做项目的项目, 有个功能是从数据库中读取一些参数, 项目用的是spring mvc + spring + mybatis, 也就是需要在java类中通过spring获取mapper.

- 0x01 思路
怎样在一个普通的类获取spring的applicationContext这个很关键. 我的思路是这样的:
① 实现接口ApplicationContextAware, 实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。
② 配置bean, Spring初始化时,通过该方法将ApplicationContext对象注入.

- 0x02 代码

SpringBeanFactoryUtils.java

package com.tooldin.portal.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * Created by William Suen on 2016/7/20.
 */
public class SpringBeanFactoryUtils implements ApplicationContextAware {

    private static ApplicationContext appCtx;

    /**
     * 此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。
     *
     * @param applicationContext ApplicationContext 对象.
     * @throws BeansException
     * @author wangdf
     */
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringBeanFactoryUtils.appCtx = applicationContext;
    }

    /**
     * 获取ApplicationContext
     *
     * @return
     * @author wangdf
     */
    public static ApplicationContext getApplicationContext() {
        return appCtx;
    }

    /**
     * 这是一个便利的方法,帮助我们快速得到一个BEAN
     *
     * @param beanName bean的名字
     * @return 返回一个bean对象
     * @author wangdf
     */
    public static Object getBean(String beanName) {
        return appCtx.getBean(beanName);
    }

}

在applicationContext.xml文件中配置

<bean id="springBeanFactoryUtils" class="com.tooldin.portal.util.SpringBeanFactoryUtils"/>



好的, 上面两步都已经做好了, 那我们来试试吧.
用法
SpringBeanFactoryUtils.getApplicationContext().getBean(Mapper.class);
或者
SpringBeanFactoryUtils.getApplicationContext().getBean(“beanName”);

package com.tooldin.portal.util.wxpay;

import com.tooldin.mapper.SysWeixinMapper;
import com.tooldin.pojo.SysWeixin;
import com.tooldin.portal.util.SpringBeanFactoryUtils;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * <p>这里放置各种配置数据</p>
 * Created by William Suen on 2016/7/20.
 */
public class Configure{

    private static SysWeixin sysWeixin;

    private static SysWeixin getSysWeixin() {
        if (sysWeixin == null) {
            SysWeixinMapper weixinMapper = SpringBeanFactoryUtils.getApplicationContext().getBean(SysWeixinMapper.class);
            sysWeixin = weixinMapper.selectByPrimaryKey(1);
        }
        return sysWeixin;
    }

    public static String getAppId() {
        return getSysWeixin().getWxAppid();
    }

}


- 0x03 参考资料
参考资料 获取Spring容器中的Bean
参考资料 @Autowired bean is null in Test Listener class

MyBatis 允许通过 Mapper 接口无实现操作数据库,其原理主要基于动态代理和配置文件的映射。 在 MyBatis 中,当使用 Mapper 接口时,并不需要为接口编写具体的实现。这是因为 MyBatis 会在运行时利用 Java 的动态代理机制为这些接口创建代理对象。具体而言,MyBatis 会根据配置文件(如 XML 映射文件)或注解中的信息,将 Mapper 接口的方法与 SQL 语句进行绑定。 对于 XML 配置方式,需要遵循一定的约定。mapper 文件中的 namespace 名称就是接口的包名加上接口名称,并且 mapper 文件中的方法需要和接口的方法名保持一致。MyBatis 会根据这些映射关系,在调用 Mapper 接口的方法时,找到对应的 SQL 语句并执行。例如,当调用接口中的某个方法时,MyBatis 会根据方法名在对应的 XML 文件中查找匹配的 SQL 语句,然后将参数传递给该 SQL 语句并执行,最后将结果返回给调用者 [^1]。 在使用注解的情况下,MyBatis 会直接根据注解中的 SQL 信息来执行操作。例如使用 `@Select`、`@Insert`、`@Update`、`@Delete` 等注解直接在接口方法上定义 SQL 语句。 对于使用 `@Mapper` 注解的接口,MyBatis 会自动扫描这些接口,并为它们创建代理对象。这些代理对象会处理方法的调用,将其转换为数据库操作。即使只定义了接口而没有实现MyBatis 也能通过动态代理机制完成 POJO 对象到数据库记录的映射 [^2]。 ### 示例代码 以下是一个简单的示例,展示了如何使用 Mapper 接口进行数据库操作: ```java // 定义 Mapper 接口 import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @Mapper public interface UserDAO { @Select("SELECT * FROM users WHERE id = #{id}") User getUserById(int id); } // 调用 Mapper 接口的方法 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserDAO userDAO; public User getUser(int id) { return userDAO.getUserById(id); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值