README.md 8.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
	
2.用Interceptor实现数据库**SELECT分页查询**;
	
M
MaxKey 已提交
8
3.**链式**Query查询条件构造器;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
9

M
MaxKey 已提交
10
4.提供starter,**简化SpringBoot集成**;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
11

M
MaxKey 已提交
12 13 14
## 1、JPA 2.1注释

仅支持6个注释
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
15
> * @Entity
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
16 17
> * @Table
> * @Column
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
18
> * @Id
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
19
> * @GeneratedValue
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
20 21
> * @Transient 

M
MaxKey 已提交
22
主键策略
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
23

M
MaxKey 已提交
24
支持3种主键策略,4种AUTO自动主键策略 
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
25 26

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

    uuid.hex

    serial

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

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

M
MaxKey 已提交
44
## 1、JavaBean JPA注释
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
45

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
46
```java
M
readme  
MaxKey 已提交
47

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

M
MaxKey 已提交
84 85 86
	public get(){};
	public void set(){};
	//...
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
87 88 89
}
```

M
MaxKey 已提交
90
## 2、CURD、Qruey构造器查询和分页查询
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
91 92

```java
M
MaxKey 已提交
93
	//新增数据
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
94 95 96 97
	@Test
	public void insert() throws Exception{
		_logger.info("insert...");
		Students student=new Students();
M
readme  
MaxKey 已提交
98
		//student.setId("10024");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
99 100 101 102 103 104
		student.setStdNo("10024");
		student.setStdGender("M");
		student.setStdName("司马昭");
		student.setStdAge(20);
		student.setStdMajor("政治");
		student.setStdClass("4");
MaxKey单点登录官方's avatar
rm  
MaxKey单点登录官方 已提交
105
		service.insert(student);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
106
		
M
readme  
MaxKey 已提交
107 108 109
		Thread.sleep(1000);
		_logger.info("insert id " + student.getId());
		//service.remove(student.getId());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
110 111
	}
	
M
MaxKey 已提交
112
	//根据实体查询并更新
M
readme  
MaxKey 已提交
113 114 115
	@Test
	public void merge() throws Exception{
		_logger.info("merge...");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
116
		Students student=new Students();
M
readme  
MaxKey 已提交
117
		//student.setId("10024");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
118 119 120 121 122 123
		student.setStdNo("10024");
		student.setStdGender("M");
		student.setStdName("司马昭");
		student.setStdAge(20);
		student.setStdMajor("政治");
		student.setStdClass("4");
M
readme  
MaxKey 已提交
124
		service.merge(student);
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
125 126
		
		Thread.sleep(1000);
M
readme  
MaxKey 已提交
127
		_logger.info("insert id " + student.getId());
M
MaxKey 已提交
128 129
	}
	
M
MaxKey 已提交
130
	//springJDBC 的查询方式
M
MaxKey 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144
	@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单点登录官方 已提交
145
	}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
146
	
M
MaxKey 已提交
147
	//根据ID查询
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
148 149 150
	@Test
	public void get() throws Exception{
		_logger.info("get...");
M
readme  
MaxKey 已提交
151
		Students student=service.get("317d5eda-927c-4871-a916-472a8062df23");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
152 153
		System.out.println("Students "+student);
		 _logger.info("Students "+student);
M
readme  
MaxKey 已提交
154 155
	}
	
M
MaxKey 已提交
156
	//查询数据实体并更新
M
readme  
MaxKey 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
	@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.");
	}
	
M
MaxKey 已提交
173
	//根据ID删除
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
174 175 176 177 178
	@Test
	public void remove() throws Exception{
		_logger.info("remove...");
		Students student=new Students();
		student.setId("921d3377-937a-4578-b1e2-92fb23b5e512");
M
readme  
MaxKey 已提交
179
		service.remove(student.getId());
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
180 181
	}
	
M
MaxKey 已提交
182
	//根据ID集合批量删除
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
183 184 185 186 187 188 189 190
	@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 已提交
191 192 193
		service.deleteBatch(idList);
	}
	
M
MaxKey 已提交
194
	//根据ID批量逻辑删除
M
MaxKey 已提交
195 196 197 198 199 200 201 202 203 204
	@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);
	}
M
MaxKey 已提交
205 206

	//根据ID批量删除
M
MaxKey 已提交
207 208 209 210 211
	@Test
	public void batchDeleteByIds() throws Exception{
		_logger.info("batchDeleteByIds...");
		service.deleteBatch("2");
		service.deleteBatch("2,639178432667713536");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
212
	}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
213

M
MaxKey 已提交
214
	//分页查询
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
215 216 217 218 219
	@Test
	public void queryPageResults() throws Exception{
		_logger.info("queryPageResults...");
		 Students student=new Students();
		 //student.setId("af04d610-6092-481e-9558-30bd63ef783c");
M
MaxKey 已提交
220
		 //student.setStdGender("M");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
221
		 //student.setStdMajor(政治");
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
222
		 student.setPageSize(10);
M
MaxKey 已提交
223 224
		 //student.setPageNumber(2);
		 student.calculate(21);
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
225
		 List<Students> allListStudents = 
M
readme  
MaxKey 已提交
226
				 service.queryPageResults(student).getRows();
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
227 228 229
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
230
	}
M
MaxKey 已提交
231 232

	//mapper id分页查询
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
233 234 235 236 237 238
	@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单点登录官方 已提交
239 240 241
		 student.setPageSize(10);
		 student.setPageNumber(2);
		 List<Students> allListStudents = 
M
readme  
MaxKey 已提交
242
				 service.queryPageResults("queryPageResults1",student).getRows();
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
243 244 245
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
246
	}
M
MaxKey 已提交
247
	//根据实体查询
M
MaxKey 已提交
248 249 250 251 252 253 254 255
	@Test
	public void query() throws Exception{
		_logger.info("findAll...");
		List<Students> allListStudents =service.query(null);
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
	}
M
MaxKey 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268

	//根据链式条件构造器查询
	//WHERE (stdMajor = '政治' and STDAGE > 30 and stdMajor in ( '政治' , '化学' )  or  ( stdname = '周瑜' or stdname = '吕蒙' ) )
	@Test
	public void queryByQuery() throws Exception{
		_logger.info("find...");
		List<Students> allListStudents =service.query(
				new Query().eq("stdMajor", "政治").and().gt("STDAGE", 30).and().in("stdMajor", new Object[]{"政治","化学"})
				.or(new Query().eq("stdname", "周瑜").or().eq("stdname", "吕蒙")));
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
	}
M
readme  
MaxKey 已提交
269
	
M
MaxKey 已提交
270
	//查询所有记录
M
readme  
MaxKey 已提交
271 272 273 274 275 276 277 278 279
	@Test
	public void findAll() throws Exception{
		_logger.info("findAll...");
		List<Students> allListStudents =service.findAll();
		 for (Students s : allListStudents) {
			 _logger.info("Students "+s);
		 }
	}
	
M
MaxKey 已提交
280
	//...
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
281 282
```

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

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
```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单点登录官方 已提交
329
     <select id="queryBy" parameterType="Students" resultType="Students">
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
    	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 已提交
349
##  4、SpringBoot配置
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
350

MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
351 352 353 354 355 356 357 358
```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 已提交
359 360 361
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单点登录官方 已提交
362
mybatis.table-column-escape=true
M
readme  
MaxKey 已提交
363 364
mybatis.table-column-snowflake-datacenter-id=1
mybatis.table-column-snowflake-machine-id=1
MaxKey单点登录官方's avatar
v2.2  
MaxKey单点登录官方 已提交
365
#mybatis.table-column-escape-char=`
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
366
```
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
367

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

M
MaxKey 已提交
369 370 371 372 373 374
##  5、相关资源

[MyBatis网站][1]

[MyBatis GitHub源码][2]

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