实例:
可考虑做两部封装,
1.对从数据库连接池中获取的sqlSession封装成sqlSessionTemplate对象,是的用户不需要关心数据连接的获取过程
2.对mybatis获取mapp.xml的过程进行封装,即用户只需要关心传入表名称和sql语句,另外对sqlSession提供的原始方法封装,如crud,selectOne,selectList
首先对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>
|