README.md 9.9 KB
Newer Older
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
1
# MyBatis JPA Extra
M
MaxKey 已提交
2 3
**MyBatis JPA Extra**对MyBatis扩展JPA功能
   
M
MaxKey 已提交
4
1.基于JPA 2.1的注释**简化CUID操作**;
M
MaxKey 已提交
5 6 7 8
	
2.用Interceptor实现数据库**SELECT分页查询**;
	
3.提供mybatis-jpa-extra-spring-boot-starter,**简化SpringBoot集成**;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
9

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

M
MaxKey 已提交
12
仅有6个注释
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
13
> * @Entity
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
14 15
> * @Table
> * @Column
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
16
> * @Id
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
17
> * @GeneratedValue
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
18 19
> * @Transient 

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

M
MaxKey 已提交
21
@GeneratedValue有4中策略 
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
22 23

 1. **AUTO**
M
readme  
MaxKey 已提交
24 25 26
	
	snowflakeid
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40
    uuid

    uuid.hex

    serial

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

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

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

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
42
```java
M
readme  
MaxKey 已提交
43
package org.apache.mybatis.jpa.test.entity;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
44 45
import java.io.Serializable;
import javax.persistence.Column;
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
46
import javax.persistence.Entity;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
47 48 49 50
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
M
readme  
MaxKey 已提交
51 52
import org.apache.mybatis.jpa.persistence.JpaBaseEntity;

MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
53
@Entity
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
54
@Table(name = "STUDENTS")  
M
readme  
MaxKey 已提交
55
public class Students extends JpaBaseEntity implements Serializable{
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
56 57
	private static final long serialVersionUID = -6928570405840778151L;
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
58 59
	@Id
	@Column
M
readme  
MaxKey 已提交
60
	@GeneratedValue(strategy=GenerationType.AUTO,generator="snowflakeid")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
61
	//@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_MYBATIS_STUD")
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
62
	//@GeneratedValue(strategy=GenerationType.IDENTITY,generator="SEQ_MYBATIS_STUD")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
63
	private String id;
M
MaxKey 已提交
64
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
65 66
	@Column
	private String stdNo;
M
MaxKey 已提交
67
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
68 69
	@Column
	private String stdName;
M
MaxKey 已提交
70
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
71 72
	@Column
	private String stdGender;
M
MaxKey 已提交
73
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
74 75
	@Column
	private int stdAge;
M
MaxKey 已提交
76
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
77 78
	@Column
	private String stdMajor;
M
MaxKey 已提交
79
	
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
80 81 82
	@Column
	private String stdClass;
	
M
readme  
MaxKey 已提交
83 84 85
	@Column
	private byte[] images;
	
MaxKey单点登录官方's avatar
README  
MaxKey单点登录官方 已提交
86 87 88 89
	public Students() {
		super();
	}

M
MaxKey 已提交
90 91 92
	public get(){};
	public void set(){};
	//...
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
93 94 95
}
```

M
readme  
MaxKey 已提交
96
## 2、单表新增、修改、删除、查询、分页查询
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
97 98 99

```java
package org.apache.mybatis.jpa.test;
M
MaxKey 已提交
100
import java.sql.Types;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
101 102 103 104 105
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.mybatis.jpa.test.dao.service.StudentsService;
M
readme  
MaxKey 已提交
106
import org.apache.mybatis.jpa.test.entity.Students;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
107 108 109 110 111 112 113 114 115 116 117
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;

public class MyBatisTestRunner {
	private static final Logger _logger = LoggerFactory.getLogger(MyBatisTestRunner.class);
	public static ApplicationContext context;
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
118
	public static StudentsService service;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
119 120 121 122 123
	
	@Test
	public void insert() throws Exception{
		_logger.info("insert...");
		Students student=new Students();
M
readme  
MaxKey 已提交
124
		//student.setId("10024");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
125 126 127 128 129 130
		student.setStdNo("10024");
		student.setStdGender("M");
		student.setStdName("司马昭");
		student.setStdAge(20);
		student.setStdMajor("政治");
		student.setStdClass("4");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
131
		service.insert(student);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
132
		
M
readme  
MaxKey 已提交
133 134 135
		Thread.sleep(1000);
		_logger.info("insert id " + student.getId());
		//service.remove(student.getId());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
136 137
	}
	
M
readme  
MaxKey 已提交
138 139 140
	@Test
	public void merge() throws Exception{
		_logger.info("merge...");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
141
		Students student=new Students();
M
readme  
MaxKey 已提交
142
		//student.setId("10024");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
143 144 145 146 147 148
		student.setStdNo("10024");
		student.setStdGender("M");
		student.setStdName("司马昭");
		student.setStdAge(20);
		student.setStdMajor("政治");
		student.setStdClass("4");
M
readme  
MaxKey 已提交
149
		service.merge(student);
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
150 151
		
		Thread.sleep(1000);
M
readme  
MaxKey 已提交
152
		_logger.info("insert id " + student.getId());
M
MaxKey 已提交
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
	}
	
	@Test
	public void find() throws Exception{
		_logger.info("find...");
		_logger.info("find by filter  " 
					+ service.find(" StdNo = '10024' or StdNo = '10004'")
		);

		_logger.info("find by filter with args " 
				+ service.find(
							" StdNo = ? or StdNo = ?  ",
							new Object[]{"10024","10004"},
							new int[]{Types.VARCHAR,Types.INTEGER}
						)
		);	
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
169
	}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
170
	
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
171 172 173
	@Test
	public void get() throws Exception{
		_logger.info("get...");
M
readme  
MaxKey 已提交
174
		Students student=service.get("317d5eda-927c-4871-a916-472a8062df23");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
175 176
		System.out.println("Students "+student);
		 _logger.info("Students "+student);
M
readme  
MaxKey 已提交
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
	}
	
	@Test
	public void update() throws Exception{
		_logger.info("get...");
		Students student=service.get("317d5eda-927c-4871-a916-472a8062df23");
		System.out.println("Students "+student);
		 _logger.info("Students "+student);
		 _logger.info("update...");
		 student.setImages(null);
		 service.update(student);
		 _logger.info("updateed.");
		 
		 student.setImages("ssss".getBytes());
		 service.update(student);
		 _logger.info("updateed2.");
	}
	
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
195 196 197 198 199
	@Test
	public void remove() throws Exception{
		_logger.info("remove...");
		Students student=new Students();
		student.setId("921d3377-937a-4578-b1e2-92fb23b5e512");
M
readme  
MaxKey 已提交
200
		service.remove(student.getId());
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
201 202 203 204 205 206 207 208 209 210
	}
	
	@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");
M
MaxKey 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
		service.deleteBatch(idList);
	}
	
	@Test
	public void logicDelete() throws Exception{
		_logger.info("logicDelete...");
		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");
		service.logicDelete(idList);
	}
	
	@Test
	public void batchDeleteByIds() throws Exception{
		_logger.info("batchDeleteByIds...");
		service.deleteBatch("2");
		service.deleteBatch("2,639178432667713536");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
230
	}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
231 232 233 234 235 236

	@Test
	public void queryPageResults() throws Exception{
		_logger.info("queryPageResults...");
		 Students student=new Students();
		 //student.setId("af04d610-6092-481e-9558-30bd63ef783c");
M
MaxKey 已提交
237
		 //student.setStdGender("M");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
238
		 //student.setStdMajor(政治");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
239
		 student.setPageSize(10);
M
MaxKey 已提交
240 241
		 //student.setPageNumber(2);
		 student.calculate(21);
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
242
		 List<Students> allListStudents = 
M
readme  
MaxKey 已提交
243
				 service.queryPageResults(student).getRows();
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
244 245 246
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
247 248 249 250 251 252 253 254
	}
	
	@Test
	public void queryPageResultsByMapperId() throws Exception{
		_logger.info("queryPageResults by mapperId...");
		 Students student=new Students();
		 student.setStdGender("M");
		 //student.setStdMajor(政治");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
255 256 257
		 student.setPageSize(10);
		 student.setPageNumber(2);
		 List<Students> allListStudents = 
M
readme  
MaxKey 已提交
258
				 service.queryPageResults("queryPageResults1",student).getRows();
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
259 260 261
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
262
	}
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
263
	
M
MaxKey 已提交
264 265 266 267 268 269 270 271
	@Test
	public void query() throws Exception{
		_logger.info("findAll...");
		List<Students> allListStudents =service.query(null);
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
	}
M
readme  
MaxKey 已提交
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
	
	@Test
	public void findAll() throws Exception{
		_logger.info("findAll...");
		List<Students> allListStudents =service.findAll();
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
	}
	
	@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()));
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
295
	}
M
readme  
MaxKey 已提交
296 297 298 299 300 301 302 303
	
	//Initialization ApplicationContext for Project
	public void init(){
		_logger.info("Application dir "+System.getProperty("user.dir"));
		context = new ClassPathXmlApplicationContext(new String[] {"spring/applicationContext.xml"});
		WebContext.applicationContext=context;
		service =(StudentsService)WebContext.getBean("studentsService");
	}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
304 305 306
}
```

M
MaxKey 已提交
307
## 3、映射文件配置
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
308

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
```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单点登录官方 已提交
353
     <select id="queryBy" parameterType="Students" resultType="Students">
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
    	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>
    
```


M
MaxKey 已提交
373
##  4、SpringBoot配置
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
374

MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
375 376 377 378 379 380 381 382
```ini
#
spring.datasource.username=root
spring.datasource.password=maxkey
spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

M
readme  
MaxKey 已提交
383 384 385
mybatis.dialect=mysql
mybatis.type-aliases-package=org.apache.mybatis.jpa.test.entity
mybatis.mapper-locations=classpath*:/org/apache/mybatis/jpa/test/dao/persistence/xml/${mybatis.dialect}/*.xml
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
386
mybatis.table-column-escape=true
M
readme  
MaxKey 已提交
387 388
mybatis.table-column-snowflake-datacenter-id=1
mybatis.table-column-snowflake-machine-id=1
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
389
#mybatis.table-column-escape-char=`
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
390
```
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
391

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

M
MaxKey 已提交
393 394 395 396 397 398
##  5、相关资源

[MyBatis网站][1]

[MyBatis GitHub源码][2]

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
399 400
  [1]: http://www.mybatis.org/mybatis-3/
  [2]: https://github.com/mybatis/mybatis-3/