README.md 12.2 KB
Newer Older
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
1

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
2
# MyBatis JPA Extra
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
3
   **MyBatis JPA Extra**对MyBatis进行了扩展,目的在于简化开发的难度,采用了JPA 2.1的注释,无需配置映射的XML文件,使用插件的方式动态生成SQL语句,实现对单表的操作的简化;另外使用Interceptor拦截需要分页的SELECT查询语句,根据不同的数据库完成分页查询。
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
4

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
5
相关资源
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
6

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
7
[MyBatis网站][1]
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
8

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
9
[MyBatis GitHub源码][2]
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
10

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
11 12
[作者Blog][3]

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
13

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
14
## 1、JavaBean注释简单
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
15

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
16 17 18 19 20 21
只支持4个注释
> * @Table
> * @Id
> * @Column
> * @GeneratedValue

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
22
@GeneratedValue有3中策略 
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

 1. **AUTO**
 
    uuid

    uuid.hex

    serial

 2. **SEQUENCE**
 
    generator值为数据库序列名

 3. **IDENTITY**
 
    generator无,根据数据库自动生成方式

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
40

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
41 42
```java
package org.apache.mybatis.jpa.test.domain;
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
43

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
44
import java.io.Serializable;
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
45

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
46 47 48 49 50
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

import org.apache.mybatis.jpa.persistence.JpaBaseDomain;



/*
   ID                   varchar(40)                    not null,
   NAME                 varchar(60)                    not null,
   STATUS               char(1)                        null,
   CREATEBY             varchar(40)                    null,
   CREATEDATE           date                           null,
   UPDATEBY             varchar(40)                    null,
   UPDATEDATE           date                           null,
   constraint PK_ROLES primary key clustered (ID)
 */
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
66 67
/**
 * @author Crystal.Sea
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
68
 *
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
69 70
 */
@Table(name = "STUDENTS")  
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
71 72 73 74 75 76
public class Students extends JpaBaseDomain implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -6928570405840778151L;
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
77 78 79 80
	@Id
	@Column
	@GeneratedValue(strategy=GenerationType.AUTO,generator="serial")
	//@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_MYBATIS_STUD")
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
81
	//@GeneratedValue(strategy=GenerationType.IDENTITY,generator="SEQ_MYBATIS_STUD")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95
	private String id;
	@Column
	private String stdNo;
	@Column
	private String stdName;
	@Column
	private String stdGender;
	@Column
	private int stdAge;
	@Column
	private String stdMajor;
	@Column
	private String stdClass;
	
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
96 97 98 99 100 101
	
	public Students() {
		super();
	}


MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
102 103 104 105
	public String getStdNo() {
		return stdNo;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
106

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
107 108 109 110
	public void setStdNo(String stdNo) {
		this.stdNo = stdNo;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
111

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
112 113 114 115
	public String getStdName() {
		return stdName;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
116

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
117 118 119 120
	public void setStdName(String stdName) {
		this.stdName = stdName;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
121 122 123 124




MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
125 126 127 128
	public String getStdGender() {
		return stdGender;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
129

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
130 131 132 133
	public void setStdGender(String stdGender) {
		this.stdGender = stdGender;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
134

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
135 136 137 138
	public int getStdAge() {
		return stdAge;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
139

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
140 141 142 143
	public void setStdAge(int stdAge) {
		this.stdAge = stdAge;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
144

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
145 146 147 148
	public String getStdMajor() {
		return stdMajor;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
149

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
150 151 152 153
	public void setStdMajor(String stdMajor) {
		this.stdMajor = stdMajor;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
154

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
155 156 157 158
	public String getStdClass() {
		return stdClass;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
159

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
160 161 162 163
	public void setStdClass(String stdClass) {
		this.stdClass = stdClass;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
164

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
165 166 167 168
	public String getId() {
		return id;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
169

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
170 171 172 173
	public void setId(String id) {
		this.id = id;
	}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
174

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
175 176
	@Override
	public String toString() {
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
177 178
		return "Students [stdNo=" + stdNo + ", stdName=" + stdName + ", stdgender=" + stdGender + ", stdAge=" + stdAge
				+ ", stdMajor=" + stdMajor + ", stdClass=" + stdClass + "]";
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
179
	}
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
180 181 182 183 184


	
	

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
185 186
}

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
187

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
188 189
```

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
190
## 2、单表新增、修改、删除、查询
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
191 192 193 194 195 196 197 198

```java
package org.apache.mybatis.jpa.test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
199

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
200 201 202 203 204 205 206 207 208 209
import org.apache.mybatis.jpa.test.dao.service.StudentsService;
import org.apache.mybatis.jpa.test.domain.Students;
import org.apache.mybatis.jpa.util.WebContext;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
210

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
211 212 213 214
public class MyBatisTestRunner {
	private static final Logger _logger = LoggerFactory.getLogger(MyBatisTestRunner.class);
	
	public static ApplicationContext context;
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
215
	public static StudentsService service;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
216 217 218 219 220 221 222 223 224 225 226
	
	@Test
	public void insert() throws Exception{
		_logger.info("insert...");
		Students student=new Students();
		student.setStdNo("10024");
		student.setStdGender("M");
		student.setStdName("司马昭");
		student.setStdAge(20);
		student.setStdMajor("政治");
		student.setStdClass("4");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
227
		service.insert(student);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
228
		Thread.sleep(1000);
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
229
		service.remove(student.getId());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
230 231 232 233 234
	}
	
	@Test
	public void get() throws Exception{
		_logger.info("get...");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
235
		Students student=service.get("921d3377-937a-4578-b1e2-92fb23b5e512");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
236 237 238 239 240 241 242 243 244
		 _logger.info("Students "+student);

	}
	
	@Test
	public void remove() throws Exception{
		_logger.info("remove...");
		Students student=new Students();
		student.setId("921d3377-937a-4578-b1e2-92fb23b5e512");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
245
		service.remove(student.getId());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
246 247 248 249 250 251 252 253 254 255 256
		
	}
	
	@Test
	public void batchDelete() throws Exception{
		_logger.info("batchDelete...");
		List<String> idList=new ArrayList<String>();
		idList.add("8584804d-b5ac-45d2-9f91-4dd8e7a090a7");
		idList.add("ab7422e9-a91a-4840-9e59-9d911257c918");
		idList.add("12b6ceb8-573b-4f01-ad85-cfb24cfa007c");
		idList.add("dafd5ba4-d2e3-4656-bd42-178841e610fe");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
257
		service.batchDelete(idList);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
258 259 260 261 262
	}

	@Test
	public void findAll() throws Exception{
		_logger.info("findAll...");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
263
		_logger.info("findAll "+service.findAll());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
	}
	
	@Before
	public void initSpringContext(){
		if(context!=null) return;
		_logger.info("init Spring Context...");
		SimpleDateFormat sdf_ymdhms =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String startTime=sdf_ymdhms.format(new Date());

		try{
			MyBatisTestRunner runner=new MyBatisTestRunner();
			runner.init();
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
		_logger.info("-- --Init Start at " + startTime+" , End at  "+sdf_ymdhms.format(new Date()));
	}
	
	//Initialization ApplicationContext for Project
	public void init(){
		_logger.info("init ...");
		
		context = new ClassPathXmlApplicationContext(new String[] {"spring/applicationContext.xml"});
		
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
290 291
		WebContext.applicationContext=context;
		service =(StudentsService)WebContext.getBean("studentsService");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
292 293 294 295 296
	}
	
}
```

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
297
## 3、支持分页查询
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
298

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
299 300 301 302 303 304 305
```java
package org.apache.mybatis.jpa.test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
306

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
307 308 309 310 311 312 313 314 315 316
import org.apache.mybatis.jpa.test.dao.service.StudentsService;
import org.apache.mybatis.jpa.test.domain.Students;
import org.apache.mybatis.jpa.util.WebContext;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
317

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
public class MyBatisTestRunner {
	
	private static final Logger _logger = LoggerFactory.getLogger(MyBatisTestRunner.class);
	
	public static ApplicationContext context;

	@Test
	public void queryPageResults() throws Exception{
		_logger.info("queryPageResults...");
		 Students student=new Students();
		 //student.setId("af04d610-6092-481e-9558-30bd63ef783c");
		 student.setStdGender("M");
		 //student.setStdMajor(政治");
		 student.setPageResults(10);
		 student.setPage(2);
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
333
		 _logger.info("queryPageResults "+service.queryPageResults(student));
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
334 335 336 337 338 339 340 341 342 343
	}
	
	@Test
	public void queryPageResultsByMapperId() throws Exception{
		_logger.info("queryPageResults by mapperId...");
		 Students student=new Students();
		 student.setStdGender("M");
		 //student.setStdMajor(政治");
		 student.setPageResults(10);
		 student.setPage(2);
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
344
		 _logger.info("queryPageResults by mapperId "+service.queryPageResults("queryPageResults1",student));
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
		 
	}

	@Before
	public void initSpringContext(){
		if(context!=null) return;
		_logger.info("init Spring Context...");
		SimpleDateFormat sdf_ymdhms =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String startTime=sdf_ymdhms.format(new Date());

		try{
			MyBatisTestRunner runner=new MyBatisTestRunner();
			runner.init();
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
		_logger.info("-- --Init Start at " + startTime+" , End at  "+sdf_ymdhms.format(new Date()));
	}
	
	//Initialization ApplicationContext for Project
	public void init(){
		_logger.info("init ...");
		context = new ClassPathXmlApplicationContext(new String[] {"spring/applicationContext.xml"});
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
370 371
		WebContext.applicationContext=context;
		service =(StudentsService)WebContext.getBean("studentsService");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
372 373 374 375 376
	}
	
}
```

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
377 378

## 4、映射文件配置
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
379

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
```xml
<mapper namespace="org.apache.mybatis.jpa.test.dao.persistence.StudentsMapper" >
	<sql id="sql_condition">
		WHERE	1	=	1
    	<if test="id != null">
			AND	ID	=	'${id}'
		</if>
		<if test="stdName != null  and stdName != '' ">
			AND STDNAME like '%${stdName}%'
		</if>
		<if test="stdGender != null  and stdGender != '' ">
			AND	STDGENDER	=	#{stdGender}
		</if>
		<if test="stdMajor != null">
			<![CDATA[AND	STDMAJOR	= #{stdMajor}]]>
		</if>
	</sql>
	
    <select id="queryPageResults" parameterType="Students" resultType="Students">
    	SELECT 
    		ID		   ,
			STDNO      ,
			STDNAME    ,
			STDGENDER  ,
			STDAGE     ,
			STDMAJOR   ,
			STDCLASS 
    	FROM STUDENTS 
    	<include refid="sql_condition"/>
    </select>
 
     <select id="queryPageResults1" parameterType="Students" resultType="Students">
    	SELECT 
    		ID		   ,
			STDNO      ,
			STDNAME    ,
			STDGENDER  ,
			STDAGE     ,
			STDMAJOR   ,
			STDCLASS 
    	FROM STUDENTS 
    	<include refid="sql_condition"/>
    </select>
       
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
424
     <select id="queryBy" parameterType="Students" resultType="Students">
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
    	SELECT 
    		ID		   ,
			STDNO      ,
			STDNAME    ,
			STDGENDER  ,
			STDAGE     ,
			STDMAJOR   ,
			STDCLASS 
    	FROM ROLES 
    	<include refid="sql_condition"/>
    </select>
  
    <delete id="delete" parameterType="Students" >
    	DELETE FROM STUDENTS WHERE ID=#{id}
    </delete>
    
```


MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
444
##  5、Spring XML配置
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
445

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
```xml
  <tx:annotation-driven transaction-manager="txManager" />

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

    <!-- enable autowire -->
    <context:annotation-config />

    <!-- enable transaction demarcation with annotations 
    <tx:annotation-driven />-->

	<!--<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">-->
	<bean id="sqlSessionFactory" class="org.apache.mybatis.jpa.MyBatisSessionFactoryBean">
		<property name="timeout" value="30" />
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations" value="classpath*:/org/apache/mybatis/jpa/test/dao/persistence/xml/mysql/*.xml" />
		<property name="typeAliasesPackage" 
        		  value="
	        			org.apache.mybatis.jpa.test.domain,
        			" />
		<property name="transactionFactory">
			<bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
		</property>
		<property name="interceptors">
			<list>
					<bean class="org.apache.mybatis.jpa.StatementHandlerInterceptor">
						<property name="dialectString" value="org.apache.mybatis.jpa.dialect.MySQLDialect"/>
					</bean>
			</list>
		</property>
	</bean>

    <!-- scan for mappers and let them be autowired -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" 
        		  value="
        		  		org.apache.mybatis.jpa.test.dao.persistence,
        		  		" />
    </bean>

 	<!-- enable component scanning (beware that this does not enable mapper scanning!) -->    
    <context:component-scan base-package="org.apache.mybatis.jpa.test.dao.service" />
    
    <bean class ="org.apache.mybatis.jpa.id.IdentifierGeneratorFactory">
	    <property name="generatorStrategyMap" >
	    	<map>
		        <entry key="serial" >
		        	<bean class="org.apache.mybatis.jpa.id.SerialGenerator">
		        		<property name="ipAddressNodeValue"  value="F0-76-1C-B0-26-9C=02,"/>
		        	</bean></entry>
		    </map>
	    </property>
    </bean>
    
   	<!-- 
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory" />
	</bean>
	 -->
```
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
508

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
509 510 511 512

  [1]: http://www.mybatis.org/mybatis-3/
  [2]: https://github.com/mybatis/mybatis-3/
  [3]: http://shimingxy.blog.163.com/