<dl class="box_p">
<dd class="pRight"><a href="/">首頁</a><span> > </span><a href="https://www.2cto.com/kf/">程序開發</a> > <a href="https://www.2cto.com/kf/ware/">軟件開發</a> > <a href="https://www.2cto.com/kf/ware/Java/news/">Java</a> > 正文</dd>
</dl>
<dl class="box_t"><dd>SpringMVC,Mybatis,FreeMarker連接mycat示例(一)</dd></dl>
<!-- 2cto_左一 -->
<div class="cont_ibox">
<script type="text/javascript">cto_A_D("2cto_9");</script>
</div>
<div class="box_body" id="fontzoom">
<div id="Article">
<h1 id="項目結構如圖">項目結構如圖:</h1>
首先是各種配置文件,屬性文件
mycat.properties內容:
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
|
#數據庫連接配置
#以下是mycat中間件連接
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:
//localhost:8066/SSMDB?useUnicode=true&characterEncoding=UTF-8
jdbc.username=wu
jdbc.password=hello123
#以下是mysql連接
#jdbc.url=jdbc:mysql:
//localhost:3306/MyCAT_DB?useUnicode=true&characterEncoding=UTF-8
#jdbc.username=root
#jdbc.password=
123456
#定義初始連接數
jdbc.initialPoolSize=
10
jdbc.maxPoolSize=
200
jdbc.minPoolSize=
5
jdbc.maxIdleTime=
20
jdbc.acquireIncrement=
10
jdbc.maxStatements=
50
jdbc.idleConnectionTestPeriod=
60
jdbc.initialSize=
5
#定義最大空閑
jdbc.maxIdle=
20
#定義最小空閑
jdbc.minIdle=
5
#定義最大連接數
jdbc.maxActive=
200
jdbc.removeAbandonedTimeout=
300
#定義最長等待時間
jdbc.maxWait=
60000
jdbc.maxOpenPreparedStatements=
10
|
log4j.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
|
<!--?xml version=
'1.0'
encoding=
'UTF-8'
?-->
<layout
class
=
"org.apache.log4j.PatternLayout"
><param name=
"ConversionPattern"
value=
"%d [%7r] %6p - %30.30c - %m \n"
>
</layout>
</appender>
<param name=
"Append"
value=
"false"
><param name=
"file"
value=
"mycatDemo-debug.log"
>
<layout
class
=
"org.apache.log4j.PatternLayout"
><param name=
"ConversionPattern"
value=
"%d [%7r] %6p - %30.30c - %m \n"
>
</layout>
</appender>
<param name=
"DatePattern"
value=
"'.'yyyy-MM-dd"
><param name=
"Append"
value=
"true"
><param name=
"file"
value=
"mycatDemo.log"
>
<layout
class
=
"org.apache.log4j.PatternLayout"
><param name=
"ConversionPattern"
value=
"%d [%7r] %6p - %30.30c - %m \n"
>
</layout>
<filter
class
=
"org.apache.log4j.varia.LevelRangeFilter"
><param name=
"LevelMin"
value=
"DEBUG"
>
</filter>
</appender>
<!--
<param name=
"DatePattern"
value=
"'.'yyyy-MM-dd"
/>
<param name=
"file"
value=
"${las-im-scheduler.log.path}/las-report-zookeeper.log"
/>
<layout
class
=
"org.apache.log4j.PatternLayout"
>
<param name=
"ConversionPattern"
value=
"%d [%7r] %6p - %30.30c - %m \n"
/>
</layout>
</appender>
<category name=
"org.apache.zookeeper"
additivity=
"false"
>
<priority value=
"debug"
/>
</category>
-->
<category additivity=
"true"
name=
"org.cometd"
>
<priority value=
"ERROR"
>
</appender-ref></priority></category>
<category additivity=
"true"
name=
"org.springframework.orm.ibatis3"
>
<priority value=
"INFO"
>
</appender-ref></priority></category>
<category additivity=
"true"
name=
"org.apache.ibatis"
>
<priority value=
"ERROR"
>
</appender-ref></priority></category>
<category additivity=
"true"
name=
"java.sql"
>
<priority value=
"ERROR"
>
</appender-ref></priority></category>
<category additivity=
"true"
name=
"com.mycat"
>
<priority value=
"debug"
>
</appender-ref></priority></category>
<root>
<priority value=
"ERROR"
>
</appender-ref></appender-ref></priority></root>
</log4j:configuration>
|
sqlmap文件下的TestMapper.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
|
<!--?xml version=
"1.0"
encoding=
"UTF-8"
?-->
<mapper namespace=
"com.mycat.test.model.Test"
>
<resultmap id=
"testResultMap"
type=
"com.mycat.test.model.Test"
>
<result column=
"id_"
property=
"id"
>
<result column=
"name_"
property=
"name"
>
<result column=
"user_id"
property=
"userId"
>
</result></result></result></resultmap>
<select id=
"selectAll"
resultmap=
"testResultMap"
>
select * from sam_test
</select>
<select id=
"selectSome"
parametertype=
"java.util.Map"
resultmap=
"testResultMap"
>
select * from sam_test limit #{offset},#{limit}
</select>
<select id=
"getObject"
parametertype=
"java.lang.Object"
resultmap=
"testResultMap"
>
select * from sam_test where id_ = #{id}
</select>
<insert id=
"insert"
keyproperty=
"id_"
parametertype=
"com.mycat.test.model.Test"
>
INSERT INTO sam_test(
name_,
user_id
)
VALUES(
#{name,jdbcType=VARCHAR},
#{userId,jdbcType=BIGINT}
)
<selectkey keyproperty=
"id"
order=
"AFTER"
resulttype=
"java.lang.Integer"
>
select last_insert_id() as id
</selectkey>
</insert>
<update id=
"update"
parametertype=
"com.mycat.test.model.Test"
>
update sam_test
<set>
<
if
test=
"name != null and name != ''"
>
name_ = #{name},
</
if
>
<
if
test=
"userId != null"
>
user_id = #{userId},
</
if
>
</set>
where id_=#{id}
</update>
<!-- #{}中的參數名與方法中的參數的復雜數據類型的屬性名一致 -->
<delete id=
"delete"
parametertype=
"java.lang.Integer"
>
delete from sam_test where id_ = #{id}
</delete>
<select id=
"findOneByMap"
resultmap=
"testResultMap"
>
select * from sam_test where
1
=
1
AND
${param.name} = #{param.value}
limit
0
,
1
</select>
<select id=
"findOneByObject"
parametertype=
"com.mycat.test.model.Test"
resultmap=
"testResultMap"
>
select * from sam_test
and name_=#{name}
and user_id=#{userId}
limit
0
,
1
</select>
<select id=
"findByMap"
resultmap=
"testResultMap"
>
select * from sam_test where
1
=
1
AND
${param.name} = #{param.value}
</select>
<select id=
"findByObject"
parametertype=
"com.mycat.test.model.Test"
resultmap=
"testResultMap"
>
select * from sam_test
and name_=#{name}
and user_id=#{userId}
</select>
<select id=
"findByIn"
resultmap=
"testResultMap"
>
select * from sam_test where
1
=
1
AND
${param.name} IN (#{param.value})
</select>
<select id=
"findByLike"
resultmap=
"testResultMap"
>
select * from sam_test where
1
=
1
AND
${param.name} LIKE #{param.value}
</select>
<select id=
"getTotalCount"
resulttype=
"int"
>
select count(
1
) from sam_test
</select>
<select id=
"getCount"
parametertype=
"java.util.Map"
resulttype=
"int"
>
select count(
1
) from sam_test where
1
=
1
${whereClause}
</select>
<select id=
"query"
parametertype=
"java.util.Map"
resultmap=
"testResultMap"
>
select ${fieldsClause} from sam_test where
1
=
1
${whereClause}
${orderClause}
limit ${limit} offset ${offset}
</select>
</mapper>
|
spring-config-db.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
|
<!--?xml version=
"1.0"
encoding=
"UTF-8"
?-->
<beans xmlns=
"https://www.springframework.org/schema/beans"
xmlns:aop=
"https://www.springframework.org/schema/aop"
xmlns:tx=
"https://www.springframework.org/schema/tx"
xmlns:xsi=
"https://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation="https://www.springframework.org/schema/beans
https:
//www.springframework.org/schema/beans/spring-beans-3.1.xsd
https:
//www.springframework.org/schema/tx
https:
//www.springframework.org/schema/tx/spring-tx.xsd
https:
//www.springframework.org/schema/aop
https:
//www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置Mybatis會話工廠 -->
<bean
class
=
"org.mybatis.spring.SqlSessionFactoryBean"
id=
"sqlSessionFactory"
>
<!-- 注入DataSource -->
<!-- 數據源 -->
<property name=
"dataSource"
ref=
"druidDataSource"
>
<!-- 需要加載的mapper.xml,該bean被創建后,會自動加載這些文件。 -->
<property name=
"mapperLocations"
>
<list>
<!-- 自動匹配Mapper映射文件 -->
<value>classpath*:sqlmap/*Mapper.xml</value>
</list>
</property>
</property></bean>
<bean
class
=
"org.mybatis.spring.SqlSessionTemplate"
id=
"sqlSession"
>
<constructor-arg ref=
"sqlSessionFactory"
>
</constructor-arg></bean>
<!-- Druid集連接池,首先spring配置DataSource -->
<bean
class
=
"com.alibaba.druid.pool.DruidDataSource"
destroy-method=
"close"
id=
"druidDataSource"
init-method=
"init"
>
<property name=
"driverClassName"
value=
"${jdbc.driverClassName}"
>
<!-- 基本屬性 url、user、password -->
<property name=
"url"
value=
"${jdbc.url}"
>
<property name=
"username"
value=
"${jdbc.username}"
>
<property name=
"password"
value=
"${jdbc.password}"
>
<!--initialSize: 初始化連接-->
<property name=
"initialSize"
value=
"${jdbc.initialSize}"
>
<!--minIdle: 最小空閑連接-->
<property name=
"minIdle"
value=
"${jdbc.minIdle}"
>
<!--maxActive: 最大連接數量-->
<property name=
"maxActive"
value=
"${jdbc.maxActive}"
>
<!--removeAbandoned: 對泄漏的連接,是否自動回收超時連接-->
<property name=
"removeAbandoned"
value=
"true"
>
<!--removeAbandonedTimeout: 超時時間(以秒數為單位)-->
<property name=
"removeAbandonedTimeout"
value=
"${jdbc.removeAbandonedTimeout}"
>
<!--maxWait: 超時等待時間以毫秒為單位
6000
毫秒/
1000
等於
60
秒-->
<property name=
"maxWait"
value=
"${jdbc.maxWait}"
>
<property name=
"defaultAutoCommit"
>
<value>
false
</value>
</property>
<property name=
"validationQuery"
value=
"select 1"
>
<!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
<!-- 如果用Oracle,則把poolPreparedStatements配置為
true
,mysql可以配置為
false
。分庫分表較多的數據庫,建議配置為
false
-->
<property name=
"poolPreparedStatements"
value=
"true"
>
<property name=
"maxOpenPreparedStatements"
value=
"${jdbc.maxOpenPreparedStatements}"
>
<!-- 配置監控統計攔截的filters,去掉后監控界面sql無法統計 -->
<!--<property name=
"filters"
value=
"stat"
/>-->
<!-- 慢日志查詢 缺省為
3
秒 修改為
10
秒
10000
-->
<!-- <property name=
"connectionProperties"
value=
"druid.stat.slowSqlMillis=5000"
/> -->
</property></property></property></property></property></property></property></property></property></property></property></property></property></bean>
<!-- druid 監控 spring -->
<!-- <bean id=
"druid-stat-interceptor"
class
=
"com.alibaba.druid.support.spring.stat.DruidStatInterceptor"
/> -->
<!-- 按類型攔截配置 -->
<!-- <bean id=
"druid-type-proxyCreator"
class
=
"com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator"
> -->
<!-- 所有ABCInterface的派生類被攔截監控 -->
<!-- <property name=
"targetBeanType"
value=
"xxxx.ABCInterface"
/>
<property name=
"interceptorNames"
>
<list>
<value>druid-stat-interceptor</value>
</list>
</property>
</bean> -->
<!-- 按照BeanId來攔截配置 -->
<!-- <bean
class
=
"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
>
<property name=
"proxyTargetClass"
value=
"true"
/>
<property name=
"beanNames"
>
<list> -->
<!-- 這里配置需要攔截的bean id列表 -->
<!-- <value>xxx-dao</value>
<value>xxx-service</value>
</list>
</property>
<property name=
"interceptorNames"
>
<list>
<value>druid-stat-interceptor</value>
</list>
</property>
</bean> -->
<!-- 方法名正則匹配攔截配置 -->
<!-- <bean id=
"druid-stat-pointcut"
class
=
"org.springframework.aop.support.JdkRegexpMethodPointcut"
scope=
"prototype"
> -->
<!-- <property name=
"patterns"
> -->
<!-- <list> -->
<!-- <value>com.xinnet.*.service.*</value> -->
<!-- <value>com.mycompany.service.*</value> -->
<!-- <value>com.mycompany.dao.*</value> -->
<!-- </list> -->
<!-- </property> -->
<!-- </bean> -->
<!-- -->
<!-- -->
<!-- </aop:config> -->
<!-- 配置事物管理器 -->
<!-- 事務管理器 對mybatis操作數據庫事務控制,spring使用jdbc的事務控制類 -->
<bean
class
=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
id=
"transactionManager"
>
<!-- 數據源 dataSource在上面配置了 -->
<property name=
"dataSource"
ref=
"druidDataSource"
>
</property></bean>
<!-- 配置聲明式事務 -->
<tx:annotation-driven transaction-manager=
"transactionManager"
>
</tx:annotation-driven></beans>
|
vcxml配置">spring-config-mvc.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
|
<!--?xml version=
"1.0"
encoding=
"UTF-8"
?-->
<!--suppress ALL -->
<beans xmlns=
"https://www.springframework.org/schema/beans"
xmlns:context=
"https://www.springframework.org/schema/context"
xmlns:mvc=
"https://www.springframework.org/schema/mvc"
xmlns:util=
"https://www.springframework.org/schema/util"
xmlns:xsi=
"https://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation="
https:
//www.springframework.org/schema/beans
https:
//www.springframework.org/schema/beans/spring-beans-3.1.xsd
https:
//www.springframework.org/schema/context
https:
//www.springframework.org/schema/context/spring-context-3.1.xsd
https:
//www.springframework.org/schema/mvc
https:
//www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
https:
//www.springframework.org/schema/util
https:
//www.springframework.org/schema/util/spring-util-3.1.xsd">
<!-- spring 自動掃描組件 -->
<!-- 自動掃描 controller 包下的所有類 -->
<!-- mvc controller -->
<context:component-scan base-
package
=
"com.mycat"
>
<context:include-filter expression=
".*.controller.*"
type=
"regex"
>
<context:include-filter expression=
".*.service.*"
type=
"regex"
>
<context:include-filter expression=
".*.dao.*"
type=
"regex"
>
</context:include-filter></context:include-filter></context:include-filter></context:component-scan>
<!-- 開啟注解的功能 -->
<!-- 啟動支持 mvc 的注解,比如
@Controller
,
@RequestMapping
等-->
<mvc:annotation-driven>
<!--<bean id=
"conversionService"
-->
<!--
class
=
"org.springframework.format.support.FormattingConversionServiceFactoryBean"
>-->
<!--<property name=
"formatterRegistrars"
>-->
<!--<bean
class
=
"com.jd.common.springmvc.converter.DefaultFormatterRegistrar"
/>-->
<!--</property>-->
<!--</bean>-->
<!-- 解決靜態資源被攔截的問題 -->
<mvc:
default
-servlet-handler>
<!--
static
resources -->
<!--<mvc:resources location=
"/static/"
mapping=
"/static/**"
cache-period=
"864000"
/>-->
<!--<mvc:resources location=
"/js/"
mapping=
"/js/**"
cache-period=
"864000"
/>-->
<!-- 配置視圖解析器,使得在JSP中能夠使用完整的JSTL功能 -->
<!-- 設置視圖解析工具 -->
<!-- template view -->
<bean
class
=
"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"
id=
"freemarkerConfig"
>
<property name=
"templateLoaderPath"
value=
"/WEB-INF/views/"
>
<property name=
"freemarkerSettings"
>
<props>
<prop key=
"template_update_delay"
>
0
</prop>
<prop key=
"default_encoding"
>UTF-
8
</prop>
<prop key=
"number_format"
>
0
.##########</prop>
<prop key=
"datetime_format"
>yyyy-MM-dd HH:mm:ss</prop>
<prop key=
"classic_compatible"
>
true
</prop>
<prop key=
"template_exception_handler"
>ignore</prop>
</props>
</property>
</property></bean>
<bean
class
=
"org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
id=
"freeMarkerViewResolver"
>
<!--<property name=
"layoutUrl"
value=
"layout/default.ftl"
/>-->
<property name=
"cache"
value=
"false"
>
<property name=
"suffix"
value=
".ftl"
>
<property name=
"requestContextAttribute"
value=
"request"
>
<property name=
"exposeSpringMacroHelpers"
value=
"true"
>
<property name=
"exposeRequestAttributes"
value=
"true"
>
<property name=
"exposeSessionAttributes"
value=
"true"
>
<property name=
"contentType"
value=
"text/html;charset=UTF-8"
>
</property></property></property></property></property></property></property></bean>
<bean
class
=
"org.springframework.web.servlet.view.ContentNegotiatingViewResolver"
>
<property name=
"defaultContentType"
value=
"text/html"
>
<!-- not by accept header -->
<property name=
"ignoreAcceptHeader"
value=
"true"
>
<!-- by extension -->
<property name=
"mediaTypes"
><map>
<entry key=
"html"
value=
"text/html"
>
<entry key=
"xml"
value=
"application/xml"
>
<entry key=
"json"
value=
"application/json"
>
</entry></entry></entry></map>
</property>
<property name=
"viewResolvers"
>
<list>
<ref bean=
"freeMarkerViewResolver"
>
</ref></list>
</property>
<property name=
"defaultViews"
>
<list>
<!--
for
application/json -->
<bean
class
=
"org.springframework.web.servlet.view.json.MappingJacksonJsonView"
>
</bean></list>
</property>
</property></property></bean>
<!-- locale related -->
<!--<bean id=
"localeResolver"
class
=
"org.springframework.web.servlet.i18n.CookieLocaleResolver"
>-->
<!--<property name=
"cookieName"
value=
"_clientlocale"
/>-->
<!--<property name=
"defaultLocale"
value=
"zh_CN"
/>-->
<!--<property name=
"cookieMaxAge"
value=
"2147483647"
/>-->
<!--</bean>-->
<bean
class
=
"org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
>
<bean
class
=
"org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
>
<property name=
"messageConverters"
>
<util:list id=
"beanList"
>
<ref bean=
"mappingJacksonHttpMessageConverter"
>
</ref></util:list>
</property>
</bean>
<bean
class
=
"org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
id=
"mappingJacksonHttpMessageConverter"
>
<property name=
"supportedMediaTypes"
>
<list>
<value>text/html;charset=UTF-
8
</value>
</list>
</property>
</bean>
</bean></mvc:
default
-servlet-handler></mvc:annotation-driven></beans>
|
spring-config.xml配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!--?xml version=
"1.0"
encoding=
"UTF-8"
?-->
<beans xmlns=
"https://www.springframework.org/schema/beans"
xmlns:context=
"https://www.springframework.org/schema/context"
xmlns:xsi=
"https://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation="https://www.springframework.org/schema/beans
https:
//www.springframework.org/schema/beans/spring-beans-3.1.xsd
https:
//www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- spring容器中最多只能定義一個context:property-placeholder spring中 context:property-placeholder
導入多個獨立的 .properties配置文件 Spring容器僅允許最多定義一個PropertyPlaceholderConfigurer(或<context:property-placeholder/>),其余的會被Spring忽略掉
通配符解決 -->
<!-- 引入項目配置文件 -->
<!-- 加載db.properties文件中的內容,db.properties文件中的key要有一定的特殊規則 -->
<context:property-placeholder location=
"classpath*:mycat.properties"
>
<
import
resource=
"spring-config-mvc.xml"
>
<!--文件中主要負責配置:加載db.properties、配置數據源、配置SqlSessionFactoryBean、Mapper掃描器-->
<
import
resource=
"spring-config-db.xml"
>
</
import
></
import
></context:property-placeholder></beans>
|