README.md 12.1 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查询语句,根据不同的数据库完成分页查询。
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 11


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

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

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

 1. **AUTO**
 
    uuid

    uuid.hex

    serial

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

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

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

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

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

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
44 45 46 47 48
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单点登录官方 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

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单点登录官方 已提交
64 65
/**
 * @author Crystal.Sea
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
66
 *
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
67 68
 */
@Table(name = "STUDENTS")  
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
69 70 71 72 73 74
public class Students extends JpaBaseDomain implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -6928570405840778151L;
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
75 76 77 78
	@Id
	@Column
	@GeneratedValue(strategy=GenerationType.AUTO,generator="serial")
	//@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_MYBATIS_STUD")
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
79
	//@GeneratedValue(strategy=GenerationType.IDENTITY,generator="SEQ_MYBATIS_STUD")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
80 81 82 83 84 85 86 87 88 89 90 91 92 93
	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单点登录官方 已提交
94 95 96 97 98 99
	
	public Students() {
		super();
	}


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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


	
	

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
183 184
}

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

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

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

```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单点登录官方 已提交
197

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
198 199 200 201 202 203 204 205 206 207
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单点登录官方 已提交
208

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
209 210 211 212
public class MyBatisTestRunner {
	private static final Logger _logger = LoggerFactory.getLogger(MyBatisTestRunner.class);
	
	public static ApplicationContext context;
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
213
	public static StudentsService service;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
214 215 216 217 218 219 220 221 222 223 224
	
	@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单点登录官方 已提交
225
		service.insert(student);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
226
		Thread.sleep(1000);
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
227
		service.remove(student.getId());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
228 229 230 231 232
	}
	
	@Test
	public void get() throws Exception{
		_logger.info("get...");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
233
		Students student=service.get("921d3377-937a-4578-b1e2-92fb23b5e512");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
234 235 236 237 238 239 240 241 242
		 _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单点登录官方 已提交
243
		service.remove(student.getId());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
244 245 246 247 248 249 250 251 252 253 254
		
	}
	
	@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单点登录官方 已提交
255
		service.batchDelete(idList);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
256 257 258 259 260
	}

	@Test
	public void findAll() throws Exception{
		_logger.info("findAll...");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
261
		_logger.info("findAll "+service.findAll());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
	}
	
	@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单点登录官方 已提交
288 289
		WebContext.applicationContext=context;
		service =(StudentsService)WebContext.getBean("studentsService");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
290 291 292 293 294
	}
	
}
```

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

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
297 298 299 300 301 302 303
```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单点登录官方 已提交
304

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
305 306 307 308 309 310 311 312 313 314
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单点登录官方 已提交
315

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
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单点登录官方 已提交
331
		 _logger.info("queryPageResults "+service.queryPageResults(student));
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
332 333 334 335 336 337 338 339 340 341
	}
	
	@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单点登录官方 已提交
342
		 _logger.info("queryPageResults by mapperId "+service.queryPageResults("queryPageResults1",student));
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
		 
	}

	@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单点登录官方 已提交
368 369
		WebContext.applicationContext=context;
		service =(StudentsService)WebContext.getBean("studentsService");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
370 371 372 373 374
	}
	
}
```

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

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

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
378 379 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
```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单点登录官方 已提交
422
     <select id="queryBy" parameterType="Students" resultType="Students">
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
    	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单点登录官方 已提交
442
##  5、Spring XML配置
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
443

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
444 445 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
```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单点登录官方 已提交
506

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
507 508 509

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