springboot整合kotlin+ebean orm,java与kotlin混合开发web
- 1. Idea创建springboot项目,勾选web -> springboot web
- 2. 导入kotlin依赖项以及插件配置
- 3. 导入eBean依赖项
- 4. 完整的pom文件:
- 5. 打开Idea设置 settings中的plugins,查找ebean 11,添加Ebean 11 Enhancement,然后重启Idea,在菜单栏的Build中可以看到Ebean 11 Enhancement的选项,勾选它
- 6. 在resources文件夹下新建ebean.properties,添加配置
- 7. 创建eBean的工厂类
- 8. 创建实体类
- 9. kotlin使用Ebean,这里不写services了,直接写一个controller
- 10. java使用Ebean,这里不写services了,直接写一个controller
demo github地址:https://github.com/LorinHan/kotlin_and_ebean
1. Idea创建springboot项目,勾选web -> springboot web
2. 导入kotlin依赖项以及插件配置
1.8
1.3.60
org.jetbrains.kotlin
kotlin-stdlib-jdk8
${kotlin.version}
org.jetbrains.kotlin
kotlin-reflect
${kotlin.version}
org.jetbrains.kotlin
kotlin-stdlib
${kotlin.version}
- compile时 指定目录,不指定的话用maven打包时会失败
- 插件配置:在 Kotlin 中,data class 默认没有无参构造方法,并且 data class 默认为 final 类型,不可以被继承。注意的是,如果我们使用 Spring + Kotlin 的模式,那么使用 @autowared 就可能遇到这个问题。因此,我们可以添加 NoArg 为标注的类生成无参构造方法。使用 AllOpen 为被标注的类去掉 final,允许被继承。
kotlin-maven-plugin
1.8
org.jetbrains.kotlin
${kotlin.version}
compile
compile
compile
${project.basedir}/src/main/java
test-compile
test-compile
test-compile
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
3. 导入eBean依赖项
mysql
mysql-connector-java
io.ebean
persistence-api
2.2.1
io.ebean
ebean
12.1.8
io.ebean
ebean-querybean
12.1.8
io.ebean
querybean-generator
12.1.8
provided
io.ebean
ebean-test
12.1.8
test
io.repaint.maven
tiles-maven-plugin
2.12
true
io.ebean.tile:enhancement:12.1.8
io.ebean.tile:kotlin-kapt:1.5
4. 完整的pom文件:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.2.RELEASE
com.example
kotlin_and_ebean
0.0.1-SNAPSHOT
kotlin_and_ebean
Demo project for Spring Boot
UTF-8
UTF-8
1.8
1.3.60
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.jetbrains.kotlin
kotlin-stdlib-jdk8
${kotlin.version}
org.jetbrains.kotlin
kotlin-reflect
${kotlin.version}
org.jetbrains.kotlin
kotlin-stdlib
${kotlin.version}
mysql
mysql-connector-java
8.0.18
io.ebean
persistence-api
2.2.1
io.ebean
ebean
12.1.8
io.ebean
ebean-querybean
12.1.8
io.ebean
querybean-generator
12.1.8
provided
io.ebean
ebean-test
12.1.8
test
org.springframework.boot
spring-boot-maven-plugin
com.example.kotlin_and_ebean.KotlinAndEbeanApplication
kotlin-maven-plugin
1.8
org.jetbrains.kotlin
${kotlin.version}
compile
compile
compile
${project.basedir}/src/main/java
test-compile
test-compile
test-compile
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
org.apache.maven.plugins
maven-compiler-plugin
compile
compile
compile
testCompile
test-compile
testCompile
io.repaint.maven
tiles-maven-plugin
2.12
true
io.ebean.tile:enhancement:12.1.8
io.ebean.tile:kotlin-kapt:1.5
5. 打开Idea设置 settings中的plugins,查找ebean 11,添加Ebean 11 Enhancement,然后重启Idea,在菜单栏的Build中可以看到Ebean 11 Enhancement的选项,勾选它
6. 在resources文件夹下新建ebean.properties,添加配置
ebean.search.packages= com.example
# the name of the default server
datasource.default=db
## define these in external properties ...
datasource.db.username=root
datasource.db.password=root
datasource.db.databaseUrl=jdbc:mysql://localhost:3306/springboot_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
# 这是mysql8的驱动,如果是mysql5,引入mysql5的驱动jar,而且下面要去掉cj,改为com.mysql.jdbc.Driver
datasource.db.databaseDriver=com.mysql.cj.jdbc.Driver
7. 创建eBean的工厂类
import io.ebean.EbeanServer;
import io.ebean.EbeanServerFactory;
import io.ebean.config.ServerConfig;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component
public class MyEbeanServerFactory implements FactoryBean {
public EbeanServer getObject() throws Exception {
return createEbeanServer();
}
public Class> getObjectType() {
return EbeanServer.class;
}
public boolean isSingleton() {
return true;
}
/**
* Create a EbeanServer instance.
*/
private EbeanServer createEbeanServer() {
ServerConfig config = new ServerConfig();
config.setName("db");
// load configuration from ebean.properties,默认从resources下的ebean.properties中加载配置
config.loadFromProperties();
config.setDefaultServer(true);
// other programmatic configuration
return EbeanServerFactory.create(config);
}
}
8. 创建实体类
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table
@Entity
@Table(name = "t_author")
class Author{
@Id
var id: Long? = null
var realName: String? = null
var nickName: String? = null
}
9. kotlin使用Ebean,这里不写services了,直接写一个controller
- ebean的操作方式有多种:
- 1.可以直接通过通过实体类操作.save() .delete()等等方法;
- 2.也可以通过ebean生成的"Q实体类"进行各种操作;
- 3.也可以用工厂类EbeanServer来操作实体类或者使用原生sql
- 注意:我们只写了Author类,推测是Ebean会帮我们打包出"Q实体类",原本我是用maven打包过,后来再用了QAuthor这个类,没有出问题,但是当我用pom重新构建一个项目的时候发现QAuthor类找不到,几经尝试发现编写完实体类之后,需要先用maven compile一下才会在target下的domain包中生成出Q实体类,然后就可以直接操作Q实体类了。
import com.example.kotlin_and_ebean.domain.Author
import io.ebean.EbeanServer
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod
import org.springframework.web.bind.annotation.RestController
@RestController
class EbeanController {
@Autowired
private lateinit var ebeanServer: EbeanServer
@RequestMapping(value = ["/ebean"], method = [RequestMethod.GET])
fun getAuthorList(): String {
// 新增
val author = Author()
// author.id = 10L
// author.realName = "test"
// author.nickName = "test"
// ebeanServer.save(author)
// 查询
var find = ebeanServer.find(Author::class.java, 1)
println(find?.nickName)
return "ebean"
}
@GetMapping("/testEbean")
fun testEbean(): List {
/*
* 注意: QAuthor并不是我们自己写的,如果要使用这个类的话,需要编译一下,
* 编写完实体类之后,maven compile一下,就会在target的domain包下出现query包,里面会有这个类
* */
val authors = QAuthor().setMaxRows(2).findList() // 类型是BeanList
authors.forEach{
println(it.id)
}
for(item in authors) {
println(item.nickName)
}
return authors
}
@GetMapping("/testNative")
fun testNative(): String {
var findNative = ebeanServer.sqlQuery("select id, real_name from t_author where id <= 2;").findList()
// 类型应该是List, 直接toString当做json返回就行了
println(findNative is List)
return findNative.toString()
}
@GetMapping("/testKotlin")
fun testKotlin(): String {
var arr = intArrayOf(1, 2, 3)
println(arr[0])
var arrList = arrayListOf(1, 2, 3)
arrList.add(4)
println(arrList)
var str = "abc"
str += "$str 的长度为:${str.length * 2}"
println(str)
arr[0] = 2
when(arr[0]) {
1 -> println("nice")
else -> println("fuck")
}
println("==========")
if(3 in arr) {
println("3 in arr!")
}
// for((item, index) in arrList.withIndex()) {
// println("$item 的下标为$index")
// }
arrList.withIndex().forEach{ print(it)}
var obj = hashMapOf("a" to 1, "b" to 2)
println(obj)
return "test kotlin"
}
}
10. java使用Ebean,这里不写services了,直接写一个controller
@GetMapping("/test2")
public String test2() {
Author author = ebeanServer.find(Author.class, 1);
System.out.println(author.getNickName());
return "ok";
}