Browse Source

spring-boot-demo-orm-beetlsql 完成

pull/1/head
Yangkai.Shen 5 years ago
parent
commit
dab9ee4b2f
8 changed files with 499 additions and 27 deletions
  1. +386
    -1
      spring-boot-demo-orm-beetlsql/README.md
  2. +5
    -0
      spring-boot-demo-orm-beetlsql/pom.xml
  3. +3
    -0
      spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/config/BeetlConfig.java
  4. +2
    -0
      spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/entity/User.java
  5. +12
    -2
      spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/service/UserService.java
  6. +23
    -6
      spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/service/impl/UserServiceImpl.java
  7. +24
    -17
      spring-boot-demo-orm-beetlsql/src/main/resources/application.yml
  8. +44
    -1
      spring-boot-demo-orm-beetlsql/src/test/java/com/xkcoding/orm/beetlsql/service/impl/UserServiceImplTest.java

+ 386
- 1
spring-boot-demo-orm-beetlsql/README.md View File

@@ -1,3 +1,388 @@
# spring-boot-demo-orm-beetlsql

> 此 demo 仍然存在问题
> 此 demo 主要演示了 Spring Boot 如何整合 beetl sql 快捷操作数据库,使用的是beetl官方提供的beetl-framework-starter集成。集成过程不是十分顺利,没有其他的orm框架集成的便捷。

## pom.xml

```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<artifactId>spring-boot-demo-orm-beetlsql</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>spring-boot-demo-orm-beetlsql</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>com.xkcoding</groupId>
<artifactId>spring-boot-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<ibeetl.version>1.1.68.RELEASE</ibeetl.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl-framework-starter</artifactId>
<version>${ibeetl.version}</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<build>
<finalName>spring-boot-demo-orm-beetlsql</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
```

## application.yml

> 注意下方注释的地方,**不能解开注释,并且需要通过JavaConfig的方式手动配置数据源**,否则,会导致beetl启动失败,因此,初始化数据库的数据,只能手动在数据库使用 resources/db 下的建表语句和数据库初始化数据。

```yaml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
#### beetlsql starter不能开启下面选项
# type: com.zaxxer.hikari.HikariDataSource
# initialization-mode: always
# continue-on-error: true
# schema:
# - "classpath:db/schema.sql"
# data:
# - "classpath:db/data.sql"
# hikari:
# minimum-idle: 5
# connection-test-query: SELECT 1 FROM DUAL
# maximum-pool-size: 20
# auto-commit: true
# idle-timeout: 30000
# pool-name: SpringBootDemoHikariCP
# max-lifetime: 60000
# connection-timeout: 30000
logging:
level:
com.xkcoding: debug
com.xkcoding.orm.beetlsql: trace
beetl:
enabled: false
beetlsql:
enabled: true
sqlPath: /sql
daoSuffix: Dao
basePackage: com.xkcoding.orm.beetlsql.dao
dbStyle: org.beetl.sql.core.db.MySqlStyle
nameConversion: org.beetl.sql.core.UnderlinedNameConversion
beet-beetlsql:
dev: true
```

## BeetlConfig.java

```java
/**
* <p>
* Beetl数据源配置
* </p>
*
* @package: com.xkcoding.orm.beetlsql.config
* @description: Beetl数据源配置
* @author: yangkai.shen
* @date: Created in 2018/11/14 17:15
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@Configuration
public class BeetlConfig {

/**
* Beetl需要显示的配置数据源,方可启动项目,大坑,切记!
*/
@Bean(name = "datasource")
public DataSource getDataSource(Environment env){
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
dataSource.setJdbcUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
}
```

## UserDao.java

```java
/**
* <p>
* UserDao
* </p>
*
* @package: com.xkcoding.orm.beetlsql.dao
* @description: UserDao
* @author: yangkai.shen
* @date: Created in 2018/11/14 16:18
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@Component
public interface UserDao extends BaseMapper<User> {

}
```

## UserServiceImpl.java

```java
/**
* <p>
* User Service
* </p>
*
* @package: com.xkcoding.orm.beetlsql.service.impl
* @description: User Service
* @author: yangkai.shen
* @date: Created in 2018/11/14 16:28
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@Service
@Slf4j
public class UserServiceImpl implements UserService {

private final UserDao userDao;

@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}

/**
* 新增用户
*
* @param user 用户
*/
@Override
public User saveUser(User user) {
userDao.insert(user, true);
return user;
}

/**
* 批量插入用户
*
* @param users 用户列表
*/
@Override
public void saveUserList(List<User> users) {
userDao.insertBatch(users);
}

/**
* 根据主键删除用户
*
* @param id 主键
*/
@Override
public void deleteUser(Long id) {
userDao.deleteById(id);
}

/**
* 更新用户
*
* @param user 用户
* @return 更新后的用户
*/
@Override
public User updateUser(User user) {
if (ObjectUtil.isNull(user)) {
throw new RuntimeException("用户id不能为null");
}
userDao.updateTemplateById(user);
return userDao.single(user.getId());
}

/**
* 查询单个用户
*
* @param id 主键id
* @return 用户信息
*/
@Override
public User getUser(Long id) {
return userDao.single(id);
}

/**
* 查询用户列表
*
* @return 用户列表
*/
@Override
public List<User> getUserList() {
return userDao.all();
}

/**
* 分页查询
*
* @param currentPage 当前页
* @param pageSize 每页条数
* @return 分页用户列表
*/
@Override
public PageQuery<User> getUserByPage(Integer currentPage, Integer pageSize) {
return userDao.createLambdaQuery().page(currentPage, pageSize);
}
}
```

## UserServiceImplTest.java

```java
/**
* <p>
* User Service测试
* </p>
*
* @package: com.xkcoding.orm.beetlsql.service.impl
* @description: User Service测试
* @author: yangkai.shen
* @date: Created in 2018/11/14 16:30
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@Slf4j
public class UserServiceImplTest extends SpringBootDemoOrmBeetlsqlApplicationTests {
@Autowired
private UserService userService;

@Test
public void saveUser() {
String salt = IdUtil.fastSimpleUUID();
User user = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build();

user = userService.saveUser(user);
Assert.assertTrue(ObjectUtil.isNotNull(user.getId()));
log.debug("【user】= {}", user);
}

@Test
public void saveUserList() {
List<User> users = Lists.newArrayList();
for (int i = 5; i < 15; i++) {
String salt = IdUtil.fastSimpleUUID();
User user = User.builder().name("testSave" + i).password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave" + i + "@xkcoding.com").phoneNumber("1730000000" + i).status(1).lastLoginTime(new DateTime()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build();
users.add(user);
}
userService.saveUserList(users);
Assert.assertTrue(userService.getUserList().size() > 2);
}

@Test
public void deleteUser() {
userService.deleteUser(1L);
User user = userService.getUser(1L);
Assert.assertTrue(ObjectUtil.isNull(user));
}

@Test
public void updateUser() {
User user = userService.getUser(2L);
user.setName("beetlSql 修改后的名字");
User update = userService.updateUser(user);
Assert.assertEquals("beetlSql 修改后的名字", update.getName());
log.debug("【update】= {}", update);
}

@Test
public void getUser() {
User user = userService.getUser(1L);
Assert.assertNotNull(user);
log.debug("【user】= {}", user);
}

@Test
public void getUserList() {
List<User> userList = userService.getUserList();
Assert.assertTrue(CollUtil.isNotEmpty(userList));
log.debug("【userList】= {}", userList);
}

@Test
public void getUserByPage() {
List<User> userList = userService.getUserList();
PageQuery<User> userByPage = userService.getUserByPage(1, 5);
Assert.assertEquals(5, userByPage.getList().size());
Assert.assertEquals(userList.size(), userByPage.getTotalRow());
log.debug("【userByPage】= {}", JSONUtil.toJsonStr(userByPage));
}
}
```

## 参考

- BeetlSQL官方文档:http://ibeetl.com/guide/#beetlsql
- 开源项目:https://gitee.com/yangkb/springboot-beetl-beetlsql
- 博客:https://blog.csdn.net/flystarfly/article/details/82752597

+ 5
- 0
spring-boot-demo-orm-beetlsql/pom.xml View File

@@ -56,6 +56,11 @@
<artifactId>hutool-all</artifactId>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>


+ 3
- 0
spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/config/BeetlConfig.java View File

@@ -23,6 +23,9 @@ import javax.sql.DataSource;
@Configuration
public class BeetlConfig {

/**
* Beetl需要显示的配置数据源,方可启动项目,大坑,切记!
*/
@Bean(name = "datasource")
public DataSource getDataSource(Environment env){
HikariDataSource dataSource = new HikariDataSource();


+ 2
- 0
spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/entity/User.java View File

@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.beetl.sql.core.annotatoin.Table;

import java.io.Serializable;
import java.util.Date;
@@ -25,6 +26,7 @@ import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "orm_user")
public class User implements Serializable {
private static final long serialVersionUID = -1840831686851699943L;



+ 12
- 2
spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/service/UserService.java View File

@@ -1,6 +1,7 @@
package com.xkcoding.orm.beetlsql.service;

import com.xkcoding.orm.beetlsql.entity.User;
import org.beetl.sql.core.engine.PageQuery;

import java.util.List;

@@ -22,8 +23,17 @@ public interface UserService {
* 新增用户
*
* @param user 用户
* @return 保存的用户
*/
void saveUser(User user);
User saveUser(User user);


/**
* 批量插入用户
*
* @param users 用户列表
*/
void saveUserList(List<User> users);

/**
* 根据主键删除用户
@@ -62,5 +72,5 @@ public interface UserService {
* @param pageSize 每页条数
* @return 分页用户列表
*/
List<User> getUserByPage(Integer currentPage, Integer pageSize);
PageQuery<User> getUserByPage(Integer currentPage, Integer pageSize);
}

+ 23
- 6
spring-boot-demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/service/impl/UserServiceImpl.java View File

@@ -1,9 +1,11 @@
package com.xkcoding.orm.beetlsql.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.xkcoding.orm.beetlsql.dao.UserDao;
import com.xkcoding.orm.beetlsql.entity.User;
import com.xkcoding.orm.beetlsql.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@@ -39,8 +41,19 @@ public class UserServiceImpl implements UserService {
* @param user 用户
*/
@Override
public void saveUser(User user) {
public User saveUser(User user) {
userDao.insert(user, true);
return user;
}

/**
* 批量插入用户
*
* @param users 用户列表
*/
@Override
public void saveUserList(List<User> users) {
userDao.insertBatch(users);
}

/**
@@ -50,7 +63,7 @@ public class UserServiceImpl implements UserService {
*/
@Override
public void deleteUser(Long id) {
userDao.deleteById(id);
}

/**
@@ -61,7 +74,11 @@ public class UserServiceImpl implements UserService {
*/
@Override
public User updateUser(User user) {
return null;
if (ObjectUtil.isNull(user)) {
throw new RuntimeException("用户id不能为null");
}
userDao.updateTemplateById(user);
return userDao.single(user.getId());
}

/**
@@ -82,7 +99,7 @@ public class UserServiceImpl implements UserService {
*/
@Override
public List<User> getUserList() {
return null;
return userDao.all();
}

/**
@@ -93,7 +110,7 @@ public class UserServiceImpl implements UserService {
* @return 分页用户列表
*/
@Override
public List<User> getUserByPage(Integer currentPage, Integer pageSize) {
return null;
public PageQuery<User> getUserByPage(Integer currentPage, Integer pageSize) {
return userDao.createLambdaQuery().page(currentPage, pageSize);
}
}

+ 24
- 17
spring-boot-demo-orm-beetlsql/src/main/resources/application.yml View File

@@ -4,22 +4,23 @@ spring:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
initialization-mode: always
continue-on-error: true
schema:
- "classpath:db/schema.sql"
data:
- "classpath:db/data.sql"
hikari:
minimum-idle: 5
connection-test-query: SELECT 1 FROM DUAL
maximum-pool-size: 20
auto-commit: true
idle-timeout: 30000
pool-name: SpringBootDemoHikariCP
max-lifetime: 60000
connection-timeout: 30000
#### beetlsql starter不能开启下面选项
# type: com.zaxxer.hikari.HikariDataSource
# initialization-mode: always
# continue-on-error: true
# schema:
# - "classpath:db/schema.sql"
# data:
# - "classpath:db/data.sql"
# hikari:
# minimum-idle: 5
# connection-test-query: SELECT 1 FROM DUAL
# maximum-pool-size: 20
# auto-commit: true
# idle-timeout: 30000
# pool-name: SpringBootDemoHikariCP
# max-lifetime: 60000
# connection-timeout: 30000
logging:
level:
com.xkcoding: debug
@@ -27,5 +28,11 @@ logging:
beetl:
enabled: false
beetlsql:
enabled: true
sqlPath: /sql
daoSuffix: Dao
basePackage: com.xkcoding.orm.beetlsql.dao
basePackage: com.xkcoding.orm.beetlsql.dao
dbStyle: org.beetl.sql.core.db.MySqlStyle
nameConversion: org.beetl.sql.core.UnderlinedNameConversion
beet-beetlsql:
dev: true

+ 44
- 1
spring-boot-demo-orm-beetlsql/src/test/java/com/xkcoding/orm/beetlsql/service/impl/UserServiceImplTest.java View File

@@ -1,14 +1,23 @@
package com.xkcoding.orm.beetlsql.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.xkcoding.orm.beetlsql.SpringBootDemoOrmBeetlsqlApplicationTests;
import com.xkcoding.orm.beetlsql.entity.User;
import com.xkcoding.orm.beetlsql.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.beetl.sql.core.SQLManager;
import org.assertj.core.util.Lists;
import org.beetl.sql.core.engine.PageQuery;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
* <p>
* User Service测试
@@ -29,14 +38,40 @@ public class UserServiceImplTest extends SpringBootDemoOrmBeetlsqlApplicationTes

@Test
public void saveUser() {
String salt = IdUtil.fastSimpleUUID();
User user = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build();

user = userService.saveUser(user);
Assert.assertTrue(ObjectUtil.isNotNull(user.getId()));
log.debug("【user】= {}", user);
}

@Test
public void saveUserList() {
List<User> users = Lists.newArrayList();
for (int i = 5; i < 15; i++) {
String salt = IdUtil.fastSimpleUUID();
User user = User.builder().name("testSave" + i).password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave" + i + "@xkcoding.com").phoneNumber("1730000000" + i).status(1).lastLoginTime(new DateTime()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build();
users.add(user);
}
userService.saveUserList(users);
Assert.assertTrue(userService.getUserList().size() > 2);
}

@Test
public void deleteUser() {
userService.deleteUser(1L);
User user = userService.getUser(1L);
Assert.assertTrue(ObjectUtil.isNull(user));
}

@Test
public void updateUser() {
User user = userService.getUser(2L);
user.setName("beetlSql 修改后的名字");
User update = userService.updateUser(user);
Assert.assertEquals("beetlSql 修改后的名字", update.getName());
log.debug("【update】= {}", update);
}

@Test
@@ -48,9 +83,17 @@ public class UserServiceImplTest extends SpringBootDemoOrmBeetlsqlApplicationTes

@Test
public void getUserList() {
List<User> userList = userService.getUserList();
Assert.assertTrue(CollUtil.isNotEmpty(userList));
log.debug("【userList】= {}", userList);
}

@Test
public void getUserByPage() {
List<User> userList = userService.getUserList();
PageQuery<User> userByPage = userService.getUserByPage(1, 5);
Assert.assertEquals(5, userByPage.getList().size());
Assert.assertEquals(userList.size(), userByPage.getTotalRow());
log.debug("【userByPage】= {}", JSONUtil.toJsonStr(userByPage));
}
}

Loading…
Cancel
Save