文档章节

mybatis封装过程

傳_奇
 傳_奇
发布于 2015/07/16 15:55
字数 1581
阅读 544
收藏 0

实例:

可考虑做两部封装,

1.对从数据库连接池中获取的sqlSession封装成sqlSessionTemplate对象,是的用户不需要关心数据连接的获取过程

2.对mybatis获取mapp.xml的过程进行封装,即用户只需要关心传入表名称和sql语句,另外对sqlSession提供的原始方法封装,如crud,selectOne,selectList


  1. 首先对sqlSession进行封装,封装出一个可用的SqlSessionTemplate

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.lvmama.vst.comm.mybatis;
 
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
/**
 * sqlSession基类
 * 
 * @author wenzhengtao
 *
 */
public class SqlSessionTemplateDaoSupport {
 
    protected SqlSessionTemplate sqlSession;
    protected boolean externalSqlSession;
         
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSession = sqlSessionTemplate;
        this.externalSqlSession = true;
    }
 
    public final SqlSession getBatchSqlSession() {
        return new SqlSessionTemplate(this.sqlSession.getSqlSessionFactory(), ExecutorType.BATCH);
    }
 
    public SqlSession getSqlSession() {
        return this.sqlSession;
    }
 
    @Autowired(required = false)
    public final void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        if (!this.externalSqlSession) {
            this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
        }
    }
}

2.对mapp.xml中的可操作表进行封装

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package com.lvmama.vst.comm.mybatis;
 
import java.io.Serializable;
import java.util.List;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.session.RowBounds;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
 
/**
 * MyBatis的Dao基类
 * 
 * @author wenzhengtao
 */
@Repository
public class MyBatisDao extends SqlSessionTemplateDaoSupport {
 
    private static final Log LOG = LogFactory.getLog(MyBatisDao.class);
 
    private int maxRows = 1001;
    private int maxRowsForReport = 50000;
    private String namespaceName;
 
    public MyBatisDao(String namespaceName) {
        super();
        this.namespaceName = namespaceName;
    }
 
    private String createStatementName(String id) {
        return namespaceName + "." + id;
    }
 
    protected int insert(String key, Object object) {
        if (object != null) {
            return getSqlSession().insert(createStatementName(key), object);
        }
        return 0;
    }
 
    protected int update(String key, Object object) {
        if (object != null) {
            return getSqlSession().update(createStatementName(key), object);
        }
        return 0;
    }
 
    protected int delete(String key, Serializable id) {
        if (id != null) {
            return getSqlSession().delete(createStatementName(key), id);
        }
        return 0;
    }
 
    protected int delete(String key, Object object) {
        if (object != null) {
            return getSqlSession().delete(createStatementName(key), object);
        }
        return 0;
    }
 
    @SuppressWarnings({ "unchecked" })
    protected <T> T get(String key, Object params) {
        if (params != null) {
            return (T) getSqlSession().selectOne(createStatementName(key), params);
        } else {
            return null;
        }
    }
     
    /**
     * 重载一个无参数的get方法,供vst_search使用
     * @author wenzhengtao
     * @param key
     * @return
     */
    @SuppressWarnings({ "unchecked" })
    protected <T> T get(String key) {
        return (T) getSqlSession().selectOne(createStatementName(key));
    }
 
    protected <T> List<T> getList(String key) {
        return getSqlSession().selectList(createStatementName(key));
    }
 
    protected <T> List<T> getList(String key, Object params) {
        if (params != null) {
            return getSqlSession().selectList(createStatementName(key), params);
        } else {
            return null;
        }
    }
 
    protected <T> List<T> queryForList(String statementName) throws DataAccessException {
        return queryForList(statementName, null);
    }
 
    protected <T> List<T> queryForList(final String statementName, final Object parameterObject) throws DataAccessException {
        if (parameterObject != null) {
            List<T> result = getSqlSession().selectList(createStatementName(statementName), parameterObject, new RowBounds(0, maxRows));
            if ((result != null) && (result.size() == maxRows)) {
                LOG.warn("SQL Exception: result size is greater than the max rows, " + namespaceName + "." + statementName);
            }
            return result;
        } else {
            return null;
        }
    }
 
    protected <T> List<T> queryForList(String statementName, int skipResults, int maxResults) throws DataAccessException {
 
        if ((maxResults - skipResults) >= maxRows) {
            maxResults = skipResults + maxRows;
            LOG.warn("SQL Exception: result size is greater than the max rows, " + createStatementName(statementName));
        }
 
        return queryForList(statementName, null, skipResults, maxResults);
    }
 
    protected <T> List<T> queryForList(final String statementName, final Object parameterObject, final int skipResults, final int maxResults) throws DataAccessException {
 
        int tempMaxResults = maxResults;
        if ((maxResults - skipResults) >= maxRows) {
            tempMaxResults = skipResults + maxRows;
            LOG.warn("SQL Exception: result size is greater than the max rows, " + createStatementName(statementName));
        }
        return getSqlSession().selectList(createStatementName(statementName), parameterObject, new RowBounds(skipResults, tempMaxResults));
    }
 
    // 数据量比较大的报表导出请用这个接口
    protected <T> List<T> queryForListForReport(String statementName) throws DataAccessException {
        return queryForListForReport(statementName, null);
    }
 
    // 数据量比较大的报表导出请用这个接口
    protected <T> List<T> queryForListForReport(final String statementName, final Object parameterObject) throws DataAccessException {
 
        List<T> result = getSqlSession().selectList(createStatementName(statementName), parameterObject, new RowBounds(0, maxRowsForReport));
 
        if ((result != null) && (result.size() == maxRowsForReport)) {
            LOG.warn("SQL Exception: result size is greater than the max rows, " + statementName);
        }
        return result;
    }
 
    // 数据量比较大的报表导出请用这个接口
    protected <T> List<T> queryForList(final String statementName, final Object parameterObject, final boolean isForReportExport) throws DataAccessException {
 
        int maxRowsTemp = maxRows;
        if (isForReportExport) {
            maxRowsTemp = maxRowsForReport;
        }
 
        List<T> result = getSqlSession().selectList(createStatementName(statementName), parameterObject, new RowBounds(0, maxRowsTemp));
        if ((result != null) && (result.size() == maxRowsTemp)) {
            LOG.warn("SQL Exception: result size is greater than the max rows, " + statementName);
        }
        return result;
    }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.lvmama.vst.comm.dao;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.stereotype.Repository;
 
import com.lvmama.vst.comm.mybatis.MyBatisDao;
import com.lvmama.vst.comm.po.ComFileMap;
 
@Repository
public class ComFileMapDAO extends MyBatisDao{
 
    public ComFileMapDAO() {
        super("COM_FILE_MAP");
    }
 
    public int deleteByPrimaryKey(Long comFileId) {
        return super.delete("deleteByPrimaryKey", comFileId);
    }
 
    public int insert(ComFileMap record) {
        return super.insert("insert", record);
    }
 
    public int insertSelective(ComFileMap record) {
        return super.insert("insertSelective", record);
    }
 
    public ComFileMap selectByPrimaryKey(Long comFileId) {
        return super.get("selectByPrimaryKey", comFileId);
    }
 
    public int updateByPrimaryKeySelective(ComFileMap record) {
        return super.update("updateByPrimaryKeySelective", record);
    }
 
    public int updateByPrimaryKey(ComFileMap record) {
        return super.update("updateByPrimaryKeySelective", record);
    }
     
    public List<ComFileMap> selectByParams(Map<String, Object> params) {
        return super.queryForList("selectByParams", params);
    }
     
    public ComFileMap getByFileName(String fileName) {
        Map<String, Object> params =new HashMap<String, Object>();
        params.put("fileName", fileName);
        return super.get("selectByParams", params);
    }
     
    public ComFileMap getByFileId(Long fileId) {
        Map<String, Object> params =new HashMap<String, Object>();
        params.put("fileId", fileId);
        return super.get("selectByParams", params);
    }
}

Spring配置样本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<!-- 数据源配置,使用应用内的DBCP数据库连接池  -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
            <value>${jdbc.driverClassName}</value>
        </property>
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
        <property name="maxActive">
            <value>${jdbc.maxActive}</value>
        </property>
        <property name="maxWait">
            <value>${jdbc.maxWait}</value>
        </property>
        <property name="maxIdle">
            <value>${jdbc.maxIdle}</value>
        </property>
        <property name="initialSize">
            <value>${jdbc.initSize}</value>
        </property>
        <property name="removeAbandoned">
            <value>true</value>
        </property>
        <property name="testWhileIdle">
            <value>true</value>
        </property>
        <property name="testOnBorrow">
            <value>false</value>
        </property>
        <property name="validationQuery">
            <value>SELECT 1 FROM SYS.DUAL</value>
        </property>
    </bean>
 
    <!-- mysql数据源配置,使用应用内的DBCP数据库连接池  -->
    <bean id="dataSourceMysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
            <value>${jdbc.mysql.driverClassName}</value>
        </property>
        <property name="url">
            <value>${jdbc.mysql.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.mysql.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.mysql.password}</value>
        </property>
        <property name="maxActive">
            <value>${jdbc.mysql.maxActive}</value>
        </property>
        <property name="maxWait">
            <value>${jdbc.mysql.maxWait}</value>
        </property>
        <property name="maxIdle">
            <value>${jdbc.mysql.maxIdle}</value>
        </property>
        <property name="initialSize">
            <value>${jdbc.mysql.initSize}</value>
        </property>
        <property name="removeAbandoned">
            <value>true</value>
        </property>
    </bean>
 
    <!-- Transaction manager for a single JDBC DataSource -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:sqlmap-config.xml"/>
        <property name="mapperLocations">
            <value>classpath*:com/lvmama/vst/interfacePlatform/map/oracle/*.xml</value>
        </property>
    </bean> 
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
     <!-- 连接事务的注解配置
    <tx:annotation-driven transaction-manager="transactionManager"/>
    -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="*" propagation="REQUIRED" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="allManagerMethod" expression="execution(* com.lvmama..*.*ServiceImpl.*(..))" />
       <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
    </aop:config>

© 著作权归作者所有

傳_奇
粉丝 2
博文 5
码字总数 5851
作品 0
南京
私信 提问
mybatis 学习笔记(一):mybatis 初认识

mybatis 学习笔记(一):mybatis 初认识 简介 MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。mybatis 可以将 preparedStatement 中的输入参数自动...

希希里之海
2018/08/22
0
0
Mybaits深入了解(一)----带你入门

Mybatis简介 Mybatis架构 Mybatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对iba...

令仔很忙
2016/07/01
0
0
Mybatis3.3.x技术内幕(七):Mybatis初始化之六个工具

全民欢庆的五一劳动节,可谓是赏花赏月赏秋香的好季节,炎炎夏日,柳絮飞扬,短裙飞舞,低胸抢镜,是旅游撩妹裸奔等精彩活动的不二选择,不过,这显然与我无关。 终于要开启Mybatis的初始化过...

祖大俊
2016/05/01
2.6K
6
终结篇:MyBatis原理深入解析(一)

1 引言# 本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。 2 JDBC实现查...

猿码道
2016/08/04
0
0
JPA、Hibernate、Mybatis的区别

1.概念: Hibernate :Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。着力点对象与对象之间...

Jack088
2018/12/19
23
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
12
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部