diff --git a/frameworks/Java/solon/pom.xml b/frameworks/Java/solon/pom.xml
index 428d95b35b7..b3485e353e9 100644
--- a/frameworks/Java/solon/pom.xml
+++ b/frameworks/Java/solon/pom.xml
@@ -5,7 +5,7 @@
org.noear
solon-parent
- 3.0.2
+ 3.0.3
hello
@@ -15,24 +15,70 @@
21
+ 1.3.6
org.noear
- solon-boot-smarthttp
+ solon-web
org.noear
solon-serialization-jackson
+
+
+ org.noear
+ solon-data-sqlutils
+
+
+
+ io.jstach
+ jstachio
+ ${jstachio.version}
+
+
+
+ io.jstach
+ jstachio-apt
+ ${jstachio.version}
+ provided
+ true
+
+
+
+ com.zaxxer
+ HikariCP
+ 6.0.0
+
+
+
+ org.postgresql
+ postgresql
+ 42.7.4
+
${project.artifactId}
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+ io.jstach
+ jstachio-apt
+ ${jstachio.version}
+
+
+
+
+
org.apache.maven.plugins
maven-assembly-plugin
diff --git a/frameworks/Java/solon/src/main/java/hello/Main.java b/frameworks/Java/solon/src/main/java/hello/Main.java
index 0746f86be45..75fd11bfc36 100644
--- a/frameworks/Java/solon/src/main/java/hello/Main.java
+++ b/frameworks/Java/solon/src/main/java/hello/Main.java
@@ -2,10 +2,6 @@
import org.noear.solon.Solon;
-/**
- * @author pmg1991
- * @version V1.0
- */
public class Main {
public static void main(String[] args) {
Solon.start(Main.class, args);
diff --git a/frameworks/Java/solon/src/main/java/hello/Utils.java b/frameworks/Java/solon/src/main/java/hello/Utils.java
new file mode 100644
index 00000000000..162f89cc79c
--- /dev/null
+++ b/frameworks/Java/solon/src/main/java/hello/Utils.java
@@ -0,0 +1,17 @@
+package hello;
+
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.stream.IntStream;
+
+abstract public class Utils {
+ private static final int MIN_WORLD_NUMBER = 1;
+ private static final int MAX_WORLD_NUMBER_PLUS_ONE = 10_001;
+
+ public static int randomWorldNumber() {
+ return ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE);
+ }
+
+ public static IntStream randomWorldNumbers() {
+ return ThreadLocalRandom.current().ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER_PLUS_ONE).distinct();
+ }
+}
diff --git a/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java b/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java
deleted file mode 100644
index 77049043e97..00000000000
--- a/frameworks/Java/solon/src/main/java/hello/controller/HelloController.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package hello.controller;
-
-import org.noear.solon.annotation.Controller;
-import org.noear.solon.annotation.Get;
-import org.noear.solon.annotation.Mapping;
-import hello.model.Message;
-
-/**
- * @author noear
- * @version V1.0
- */
-@Controller
-public class HelloController {
- @Get
- @Mapping("plaintext")
- public String plaintext() {
- return "Hello, World!";
- }
-
- @Get
- @Mapping("json")
- public Message json() {
- return new Message("Hello, World!");
- }
-}
diff --git a/frameworks/Java/solon/src/main/java/hello/model/Fortune.java b/frameworks/Java/solon/src/main/java/hello/model/Fortune.java
new file mode 100644
index 00000000000..f7b5769ef28
--- /dev/null
+++ b/frameworks/Java/solon/src/main/java/hello/model/Fortune.java
@@ -0,0 +1,16 @@
+package hello.model;
+
+public final class Fortune implements Comparable{
+ public final int id;
+ public final String message;
+
+ public Fortune(int id, String message) {
+ this.id = id;
+ this.message = message;
+ }
+
+ @Override
+ public int compareTo(final Fortune other) {
+ return message.compareTo(other.message);
+ }
+}
diff --git a/frameworks/Java/solon/src/main/java/hello/model/Message.java b/frameworks/Java/solon/src/main/java/hello/model/Message.java
deleted file mode 100644
index 1df5276ca8d..00000000000
--- a/frameworks/Java/solon/src/main/java/hello/model/Message.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package hello.model;
-
-/**
- * @author pmg1991
- * @version V1.0
- */
-public class Message {
- private String message;
-
- public Message(String message) {
- this.message = message;
- }
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-}
diff --git a/frameworks/Java/solon/src/main/java/hello/model/World.java b/frameworks/Java/solon/src/main/java/hello/model/World.java
new file mode 100644
index 00000000000..ec6fc5b3abf
--- /dev/null
+++ b/frameworks/Java/solon/src/main/java/hello/model/World.java
@@ -0,0 +1,12 @@
+package hello.model;
+
+
+public final class World {
+ public int id;
+ public int randomNumber;
+ public World(int id, int randomNumber) {
+ this.id = id;
+ this.randomNumber = randomNumber;
+ }
+
+}
\ No newline at end of file
diff --git a/frameworks/Java/solon/src/main/java/hello/repository/DbRepository.java b/frameworks/Java/solon/src/main/java/hello/repository/DbRepository.java
new file mode 100644
index 00000000000..e5445184077
--- /dev/null
+++ b/frameworks/Java/solon/src/main/java/hello/repository/DbRepository.java
@@ -0,0 +1,15 @@
+package hello.repository;
+
+import hello.model.Fortune;
+import hello.model.World;
+
+import java.util.List;
+
+public interface DbRepository {
+
+ World getWorld(int id) throws Exception;
+
+ void updateWorlds(List worlds) throws Exception;
+
+ List fortunes() throws Exception;
+}
diff --git a/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java b/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java
new file mode 100644
index 00000000000..6e58090c32a
--- /dev/null
+++ b/frameworks/Java/solon/src/main/java/hello/repository/JdbcDbRepository.java
@@ -0,0 +1,46 @@
+package hello.repository;
+
+import hello.model.Fortune;
+import hello.model.World;
+import org.noear.solon.annotation.Component;
+import org.noear.solon.annotation.Inject;
+import org.noear.solon.data.sql.SqlUtils;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class JdbcDbRepository implements DbRepository {
+ @Inject
+ SqlUtils sqlUtils;
+
+ @Override
+ public World getWorld(int id) {
+ try {
+ return sqlUtils.sql("SELECT id, randomnumber FROM world WHERE id = ?", id)
+ .queryRow()
+ .toBean(World.class, (r, t) -> new World((int) r.getObject(1), (int) r.getObject(2)));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ @Override
+ public void updateWorlds(List worlds) throws SQLException {
+ List