Mybatis项目中不使用代理写法【我】

时间:2023-03-10 08:30:25
Mybatis项目中不使用代理写法【我】

首先 spring 配置文件中引入 数据源配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                                    http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx.xsd
                                  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

        <property name="url" value="jdbc:mysql://172.16.1.24:8866/xxx?characterEncoding=UTF-8" />
        <property name="username" value="txxc" />
        <property name="password" value="tydic123" />

        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" />
        <property name="maxActive" value="10" />
        <property name="maxWait" value="60000" />
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <property name="validationQuery" value="select  1  from dual" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
    </bean>
    <!-- 配置数据源 -->
    <bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

        <property name="url" value="jdbc:mysql://192.168.0.246:8866/xxx?characterEncoding=UTF-8" />
        <property name="username" value="txxc" />
        <property name="password" value="tydic123" />

        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" />
        <property name="maxActive" value="10" />
        <property name="maxWait" value="60000" />
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <property name="validationQuery" value="select  1  from dual" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
    </bean>     

    <!-- sqlSessionFactory工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:sql-config/**/*.xml" />
        <property name="configLocation" value="classpath:mybatis-config/mybatis.config.xml" />
    </bean>

    <bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource1" />
        <property name="mapperLocations" value="classpath:sql-config/**/*.xml" />
        <property name="configLocation" value="classpath:mybatis-config/mybatis.config.xml" />
    </bean>    

    <bean id="routeSwith" class="com.txxc.fm.mybatis.impl.RouteSwithImpl"></bean>

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory" />
        <property name="targetSqlSessionFactorys">
            <map>
                <entry key="ds1" value-ref="sqlSessionFactory" />
                <entry key="ds2" value-ref="sqlSessionFactory1" />
            </map>
        </property>
        <property name="routeSwith" ref="routeSwith"></property>
    </bean>

    <bean id="sqlSessionDaoSupport" class="com.txxc.fm.mybatis.dao.SqlSessionDaoImpl">
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate" />
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource1" />
    </bean>    

    <!-- 配置事务回滚的场景-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="registerUser*" rollback-for="java.lang.Exception" />
            <tx:method name="testServiceJson*" rollback-for="java.lang.Exception" />
            <tx:method name="addWorkOrder" rollback-for="java.lang.Exception" />
        </tx:attributes>
    </tx:advice>

    <tx:advice id="txAdvice1" transaction-manager="transactionManager1">
        <tx:attributes>
            <tx:method name="registerUser*" rollback-for="java.lang.Exception" />
            <tx:method name="testServiceJson*" rollback-for="java.lang.Exception" />
        </tx:attributes>
    </tx:advice>    

    <!-- 指定那些类的哪些方法参与事务 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.txxc.jtcrm..*.*(..))" />
        <aop:advisor advice-ref="txAdvice1" pointcut="execution(* com.txxc.jtcrm..*.*(..))" />
    </aop:config>

</beans>

其中需要主要关注的就是:

    <!-- sqlSessionFactory工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:sql-config/**/*.xml" />
        <property name="configLocation" value="classpath:mybatis-config/mybatis.config.xml" />
    </bean>

首先是配置了sql工厂类的bean: sqlSessionFactory,然后里面配置了使用的数据源 datasource ,还有 mybatis的 主配置文件mybatis.config.xml , 还有 操作数据库表的 xml 文件的位置 classpath:sql-config/**/*.xml  。

==========

mybatis.config.xml 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties>
        <!-- 目标数据库环境oracle,mysql,其它类型数据库待扩展,no表示不处理 -->
        <property name="data_base" value="mysql" />
        <!-- 是否需要sql转换,1:处理,0:不处理 -->
        <property name="handle" value="0" />
        <!--排除部分sqlId -->
        <property name="handle_exclude_sql" value="" />
        <!-- 是否需要sql提示,1:提示,0:不提示 -->
        <property name="hint" value="1" />
        <!-- 排除部分关键字,多个以逗号隔开,比如nvl,ifnull -->
        <property name="hint_no_keys" value="getcodename" />
        <!--排除部分sqlId -->
        <property name="hint_exclude_sql" value="" />
        <!-- sql表数量限制,0:关闭,其它则默认开启,建议为4 -->
        <property name="limit" value="4" />
        <!-- sql排除sqlId -->
        <property name="limit_exclude_sql" value="" />
        <!-- 序列替换的函数名 -->
        <property name="handle_seqname_fun" value="getSeqFunction" />
    </properties>

    <settings>
        <setting name="cacheEnabled" value="true"/>

        <setting name="callSettersOnNulls" value="true"/>
    </settings>
    <plugins>
        <plugin interceptor="com.tydic.fm.mybatis.pages.TPageInterceptor">
            <property name="databaseType" value="mysql" />
        </plugin>
    </plugins>
</configuration>

==========

xml文件:

Mybatis项目中不使用代理写法【我】

=====

然后就是代码使用了,

首先定义一个基础的 service:

import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import com.tydic.fm.mybatis.dao.SqlSessionDaoImpl;

public abstract class ParentService {
    @Autowired
    private SqlSessionDaoImpl sqlSessionDaoSupport;

    /**
     * 查询方法(无参数+返回单行)
     *
     * @param routeObject
     * @param statement
     * @return
     */
    protected <T> T selectOne(Object routeObject, String statement) {
        return this.sqlSessionDaoSupport.getSqlSession().selectOne(routeObject, statement);
    }

    /**
     * 查询参数(参数+返回单行)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @return
     */
    protected <T> T selectOne(Object routeObject, String statement, Object parameter) {
        return this.sqlSessionDaoSupport.getSqlSession().selectOne(routeObject, statement, parameter);
    }

    /**
     * 查询方法(参数+返回List)
     *
     * @param routeObject
     * @param statement
     * @return
     */
    protected <E> List<E> selectList(Object routeObject, String statement) {
        return this.sqlSessionDaoSupport.getSqlSession().selectList(routeObject, statement);
    }

    /**
     * 查询方法(参数+返回List)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @return
     */
    protected <E> List<E> selectList(Object routeObject, String statement, Object parameter) {
        return this.sqlSessionDaoSupport.getSqlSession().selectList(routeObject, statement, parameter);
    }

    /**
     * 查询方法(参数+返回List+逻辑分页) 该分页方法不建议使用
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @param rowBounds
     * @return
     */
    protected <E> List<E> selectList(Object routeObject, String statement, Object parameter, RowBounds rowBounds) {
        return this.sqlSessionDaoSupport.getSqlSession().selectList(routeObject, statement, parameter, rowBounds);
    }

    /**
     * 查询方法(无参数+返回List+指定mapKey)
     *
     * @param routeObject
     * @param statement
     * @param mapKey
     * @return
     */
    protected <K, V> Map<K, V> selectMap(Object routeObject, String statement, String mapKey) {
        return this.sqlSessionDaoSupport.getSqlSession().selectMap(routeObject, statement, mapKey);
    }

    /**
     * 查询方法(参数+返回List+指定mapKey)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @param mapKey
     * @return
     */
    protected <K, V> Map<K, V> selectMap(Object routeObject, String statement, Object parameter, String mapKey) {
        return this.sqlSessionDaoSupport.getSqlSession().selectMap(routeObject, statement, parameter, mapKey);
    }

    /**
     * 查询方法(参数+返回List+指定mapKey+逻辑分页) 该分页方法不建议使用
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @param mapKey
     * @param rowBounds
     * @return
     */
    protected <K, V> Map<K, V> selectMap(Object routeObject, String statement, Object parameter, String mapKey, RowBounds rowBounds) {
        return this.sqlSessionDaoSupport.getSqlSession().selectMap(routeObject, statement, parameter, mapKey, rowBounds);
    }

    /**
     * 查询方法(无参数+回调)
     *
     * @param routeObject
     * @param statement
     * @param handler
     */
    protected void select(Object routeObject, String statement, ResultHandler handler) {
        this.sqlSessionDaoSupport.getSqlSession().select(routeObject, statement, handler);
    }

    /**
     * 查询方法(参数+回调)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @param handler
     */
    protected void select(Object routeObject, String statement, Object parameter, ResultHandler handler) {
        this.sqlSessionDaoSupport.getSqlSession().select(routeObject, statement, parameter, handler);
    }

    /**
     * 查询方法(参数+分页+回调)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @param rowBounds
     * @param handler
     */
    protected void select(Object routeObject, String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
        this.sqlSessionDaoSupport.getSqlSession().select(routeObject, statement, parameter, rowBounds, handler);
    }

    /**
     * 插入(无参数)
     *
     * @param routeObject
     * @param statement
     * @return
     */
    protected int insert(Object routeObject, String statement) {
        return this.sqlSessionDaoSupport.getSqlSession().insert(routeObject, statement);
    }

    /**
     * 插入(带参数)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @return
     */
    protected int insert(Object routeObject, String statement, Object parameter) {
        return this.sqlSessionDaoSupport.getSqlSession().insert(routeObject, statement, parameter);
    }

    /**
     * 更新(无参数)
     *
     * @param routeObject
     * @param statement
     * @return
     */
    protected int update(Object routeObject, String statement) {
        return this.sqlSessionDaoSupport.getSqlSession().update(routeObject, statement);
    }

    /**
     * 更新(带参数)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @return
     */
    protected int update(Object routeObject, String statement, Object parameter) {
        return this.sqlSessionDaoSupport.getSqlSession().update(routeObject, statement, parameter);
    }

    /**
     * 删除(无参数)
     *
     * @param routeObject
     * @param statement
     * @return
     */
    protected int delete(Object routeObject, String statement) {
        return this.sqlSessionDaoSupport.getSqlSession().delete(routeObject, statement);
    }

    /**
     * 删除(带参数)
     *
     * @param routeObject
     * @param statement
     * @param parameter
     * @return
     */
    protected int delete(Object routeObject, String statement, Object parameter) {
        return this.sqlSessionDaoSupport.getSqlSession().delete(routeObject, statement, parameter);
    }
}

====

然后在具体的业务service中记承它,再实现业务接口,写代码:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class batchXXXNameServiceImpl extends ParentService implements batchXXXNameService {

    private final static Logger logger = LoggerFactory.getLogger(batchXXXNameServiceImpl.class);

    @Resource
    private batchXXXNameServiceSub batchXXXNameServiceSub;

    //根据某参数 查询对应数据记录数量
    @Override
    public String queryWaitHandleCount(String jsonString){
        Map<String, Object> requestMap = Util.getJsonRequestObject(jsonString);
        String count = this.selectOne("ds1", "batchXXX.queryWaitHandleCount",requestMap);
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("count", count);
        return Util.getInterfaceRes(resultMap);
    }

    //根据条件 查询对应数据列表
    @Override
    public String queryWaitHandleList(String jsonString) {
        Map<String, Object> requestMap = Util.getJsonRequestObject(jsonString);
        List<Map> WaitHandleList = this.selectList("ds1", "batchXXX.queryWaitHandleList",requestMap);
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("WAIT_HANDLE_LIST", WaitHandleList);
        return Util.getInterfaceRes(resultMap);
    }

    ////更新数据
    @Override
    public String updateProvBatchCd(String jsonString) {
        Map<String, Object> requestMap = Util.getJsonRequestObject(jsonString);
        this.update("ds1", "batchXXX.updateProvBatchCd",requestMap);
        Map<String, Object> resultMap = new HashMap<>();
        return Util.getInterfaceRes(resultMap);
    }

}