Skip to content

Commit 8e1176e

Browse files
author
vison.cao
committed
integration mybatis
c r操作
1 parent 0474f39 commit 8e1176e

File tree

11 files changed

+297
-26
lines changed

11 files changed

+297
-26
lines changed

pom.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,27 @@
6666
<artifactId>pebble</artifactId>
6767
<version>3.1.4</version>
6868
</dependency>
69+
<!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
70+
<dependency>
71+
<groupId>javax.persistence</groupId>
72+
<artifactId>javax.persistence-api</artifactId>
73+
<version>2.2</version>
74+
<scope>compile</scope>
75+
</dependency>
76+
<dependency>
77+
<groupId>mysql</groupId>
78+
<artifactId>mysql-connector-java</artifactId>
79+
<version>5.1.26</version>
80+
</dependency>
81+
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
82+
<dependency>
83+
<groupId>org.mybatis</groupId>
84+
<artifactId>mybatis</artifactId>
85+
<version>3.5.6</version>
86+
</dependency>
87+
88+
89+
6990
</dependencies>
7091

7192
<build>

src/main/java/com/vison/webmvc/config/App.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.vison.webmvc.config;
22

3+
import org.reflections.Reflections;
4+
35
/**
46
*
57
* @author vison.cao <visonforcoding@gmail.com>
@@ -9,4 +11,5 @@ public class App {
911
public static final String SESSION_USER = "user"; // 用户对象
1012
public static String _uniq_req_no = null;
1113
public static String OrderNoIncKey = ":order:no";
14+
public static Reflections f;
1215
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.vison.webmvc.config;
2+
3+
import java.util.Properties;
4+
import javax.sql.DataSource;
5+
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
6+
7+
/**
8+
*
9+
* @author vison.cao <visonforcoding@gmail.com>
10+
*/
11+
public class DatabaseConfig {
12+
13+
static String driver = "com.mysql.jdbc.Driver";
14+
static String url = "jdbc:mysql://localhost:3306/db_itdoc?useSSL=false";
15+
static String username = "root";
16+
static String password = "12345678";
17+
18+
public static DataSource getDataSource() {
19+
Properties properties = new Properties();
20+
properties.setProperty("driver", driver);
21+
properties.setProperty("url", url);
22+
properties.setProperty("username", username);
23+
properties.setProperty("password", password);
24+
UnpooledDataSourceFactory unpooledDataSourceFactory = new UnpooledDataSourceFactory();
25+
unpooledDataSourceFactory.setProperties(properties);
26+
DataSource dataSource = unpooledDataSourceFactory.getDataSource();
27+
return dataSource;
28+
}
29+
30+
}

src/main/java/com/vison/webmvc/controller/UserController.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@
44
import com.vison.webmvc.framework.GetMapping;
55
import com.vison.webmvc.Response;
66
import com.vison.webmvc.config.Log;
7+
import com.vison.webmvc.dao.UserMapper;
8+
import com.vison.webmvc.framework.MybatisLoader;
9+
import com.vison.webmvc.framework.PostMapping;
710
import javax.servlet.http.HttpServletRequest;
811
import javax.servlet.http.HttpServletResponse;
12+
import org.apache.ibatis.session.SqlSession;
13+
//import org.hibernate.Session;
14+
//import org.hibernate.Transaction;
915

1016
/**
1117
*
@@ -24,11 +30,26 @@ public String profile(HttpServletRequest request, HttpServletResponse response)
2430

2531
@GetMapping(path = "/user")
2632
public Response user() {
27-
User user = new User();
28-
user.setEmail("visonforcoding@gmail.com");
29-
user.setName("曹麦穗");
30-
Log.debug("request user", user);
33+
User user = null;
34+
SqlSession session = MybatisLoader.getSqlSessionFactory().openSession();
35+
UserMapper mapper = session.getMapper(UserMapper.class);
36+
user = mapper.selectUser(1);
37+
3138
return new Response(0, "获取成功", user);
3239
}
3340

41+
@PostMapping(path = "/user/add")
42+
public Response add(User user) {
43+
Log.info("request user", user);
44+
try {
45+
// EntityManagerFactory emf = Persistence.createEntityManagerFactory("itdoc");
46+
// Session session = HibernateLoader.sessionFactory.openSession();
47+
// EntityManager entityManager = emf.createEntityManager();
48+
// session.save(user);
49+
} catch (Exception e) {
50+
Log.error("保存失败", e);
51+
}
52+
53+
return new Response(0, "获取成功", user);
54+
}
3455
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.vison.webmvc.dao;
2+
3+
import com.vison.webmvc.entity.User;
4+
import org.apache.ibatis.annotations.Select;
5+
6+
/**
7+
*
8+
* @author vison.cao <visonforcoding@gmail.com>
9+
*/
10+
public interface UserMapper {
11+
12+
@Select("SELECT * FROM user WHERE id = #{id}")
13+
User selectUser(int id);
14+
15+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.vison.webmvc.framework;
2+
3+
import com.vison.webmvc.config.App;
4+
import com.vison.webmvc.config.Log;
5+
import javax.servlet.ServletContextEvent;
6+
import javax.servlet.ServletContextListener;
7+
import javax.servlet.annotation.WebListener;
8+
import org.reflections.Reflections;
9+
import org.reflections.scanners.MethodAnnotationsScanner;
10+
import org.reflections.util.ClasspathHelper;
11+
import org.reflections.util.ConfigurationBuilder;
12+
import org.reflections.util.FilterBuilder;
13+
14+
/**
15+
* Web application lifecycle listener.
16+
*
17+
* @author vison.cao <visonforcoding@gmail.com>
18+
*/
19+
@WebListener
20+
public class ContextServletListener implements ServletContextListener {
21+
22+
@Override
23+
public void contextInitialized(ServletContextEvent sce) {
24+
Log.info("应用程序启动...");
25+
String packageName = "com.vison.webmvc.controller";
26+
ConfigurationBuilder config = new ConfigurationBuilder();
27+
config.filterInputsBy(new FilterBuilder().includePackage(packageName));
28+
config.addUrls(ClasspathHelper.forPackage(packageName));
29+
config.setScanners(new MethodAnnotationsScanner());
30+
App.f = new Reflections(config);
31+
MybatisLoader.getSqlSessionFactory();
32+
}
33+
34+
@Override
35+
public void contextDestroyed(ServletContextEvent sce) {
36+
}
37+
}

src/main/java/com/vison/webmvc/framework/DispatchServlet.java

Lines changed: 101 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package com.vison.webmvc.framework;
22

33
import com.google.gson.Gson;
4+
import com.vison.webmvc.config.App;
45
import com.vison.webmvc.config.Log;
56
import com.vison.webmvc.framework.exception.NullRouteException;
7+
import java.io.BufferedReader;
68
import java.io.IOException;
9+
import java.lang.annotation.Annotation;
10+
import java.lang.reflect.InvocationTargetException;
711
import java.lang.reflect.Method;
812
import java.lang.reflect.Parameter;
913
import java.util.Set;
14+
import java.util.logging.Level;
15+
import java.util.logging.Logger;
1016
import javax.servlet.ServletException;
1117
import javax.servlet.annotation.WebServlet;
1218
import javax.servlet.http.HttpServlet;
@@ -26,34 +32,66 @@
2632
@WebServlet(name = "DispatchServlet", urlPatterns = {"/"})
2733
public class DispatchServlet extends HttpServlet {
2834

35+
private Reflections f;
36+
2937
@Override
3038
public void init() throws ServletException {
3139
ViewEngine.load(this.getServletContext());
40+
f = App.f;
41+
3242
}
3343

3444
@Override
3545
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
3646
throws ServletException, IOException {
47+
try {
48+
process(req, resp, RequestMethod.GET);
49+
} catch (NullRouteException ex) {
50+
Logger.getLogger(DispatchServlet.class.getName()).log(Level.SEVERE, null, ex);
51+
}
52+
}
53+
54+
@Override
55+
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
56+
throws ServletException, IOException {
57+
try {
58+
process(req, resp, RequestMethod.POST);
59+
} catch (NullRouteException ex) {
60+
Logger.getLogger(DispatchServlet.class.getName()).log(Level.SEVERE, null, ex);
61+
}
62+
63+
}
64+
65+
private void process(HttpServletRequest req, HttpServletResponse resp, RequestMethod requestMethod)
66+
throws NullRouteException, IOException {
3767
resp.setContentType("text/html");
3868
resp.setCharacterEncoding("UTF-8");
3969
String path = req.getRequestURI().substring(req.getContextPath().length());
40-
Object res;
70+
Object res = null;
4171
try {
42-
res = dispatch(path, req, resp);
72+
Method invokeMethod = this.getMaps(path, requestMethod);
73+
switch (requestMethod) {
74+
case GET:
75+
res = getDispatch(req, resp, invokeMethod);
76+
break;
77+
case POST:
78+
res = postDispatch(req, resp, invokeMethod);
79+
break;
80+
}
4381
} catch (NullRouteException ex) {
4482
res = "404 Not Found";
83+
} catch (Exception e) {
84+
Log.error("捕获错误", e);
4585
}
4686
String responseBody = this.handInvokeRes(res);
47-
Log.info("返回信息", responseBody);
4887
resp.getWriter().write(responseBody);
4988
resp.getWriter().flush();
5089
}
5190

52-
private Object dispatch(String path, HttpServletRequest request, HttpServletResponse response)
53-
throws NullRouteException {
54-
Method method = this.getMaps(path);
91+
private Object getDispatch(HttpServletRequest request, HttpServletResponse response, Method invokeMethod) {
92+
5593
Object res = null;
56-
Parameter[] parameters = method.getParameters();
94+
Parameter[] parameters = invokeMethod.getParameters();
5795
Object[] arguments = new Object[parameters.length];
5896
for (int i = 0; i < parameters.length; i++) {
5997
Parameter parameter = parameters[i];
@@ -80,12 +118,48 @@ private Object dispatch(String path, HttpServletRequest request, HttpServletResp
80118
}
81119
Object obj;
82120
try {
83-
obj = method.getDeclaringClass().getDeclaredConstructor().newInstance();
84-
res = method.invoke(obj, arguments);
121+
obj = invokeMethod.getDeclaringClass().getDeclaredConstructor().newInstance();
122+
res = invokeMethod.invoke(obj, arguments);
123+
} catch (Exception e) {
124+
InvocationTargetException targetEx = (InvocationTargetException) e;
125+
Throwable trowEx = targetEx.getTargetException();
126+
Log.error("方法invoke失败", trowEx);
127+
}
128+
return res;
129+
}
130+
131+
private Object postDispatch(HttpServletRequest request, HttpServletResponse response, Method invokeMethod)
132+
throws IOException {
133+
Object res = null;
134+
Parameter[] parameters = invokeMethod.getParameters();
135+
Object[] arguments = new Object[parameters.length];
136+
for (int i = 0; i < parameters.length; i++) {
137+
Parameter parameter = parameters[i];
138+
Log.info("参数类型", parameter.getType());
139+
Class<?> parameterClass = parameter.getType();
140+
if (parameterClass == HttpServletRequest.class) {
141+
arguments[i] = request;
142+
} else if (parameterClass == HttpServletResponse.class) {
143+
arguments[i] = response;
144+
} else if (parameterClass == HttpSession.class) {
145+
arguments[i] = request.getSession();
146+
} else {
147+
// 读取JSON并解析为JavaBean:
148+
request.setCharacterEncoding("UTF-8");
149+
BufferedReader reader = request.getReader();
150+
Gson gson = new Gson();
151+
arguments[i] = gson.fromJson(reader, parameterClass);
152+
}
153+
}
154+
Object obj;
155+
try {
156+
obj = invokeMethod.getDeclaringClass().getDeclaredConstructor().newInstance();
157+
res = invokeMethod.invoke(obj, arguments);
85158
} catch (Exception e) {
86159
Log.error("方法invoke失败", e);
87160
}
88161
return res;
162+
89163
}
90164

91165
private String getOrDefault(HttpServletRequest request, String name, String defaultValue) {
@@ -108,22 +182,27 @@ private String handInvokeRes(Object obj) {
108182
return jsonRes;
109183
}
110184

111-
private Method getMaps(String path) throws NullRouteException {
112-
113-
String packageName = "com.vison.webmvc.controller";
114-
ConfigurationBuilder config = new ConfigurationBuilder();
115-
config.filterInputsBy(new FilterBuilder().includePackage(packageName));
116-
config.addUrls(ClasspathHelper.forPackage(packageName));
117-
config.setScanners(new MethodAnnotationsScanner());
118-
Reflections f = new Reflections(config);
119-
Set<Method> resources = f.getMethodsAnnotatedWith(GetMapping.class);
185+
private Method getMaps(String path, RequestMethod requestMethod) throws NullRouteException {
120186

121-
for (Method method : resources) {
122-
GetMapping annotation = method.getAnnotation(GetMapping.class);
123-
if (path.equals(annotation.path())) {
124-
return method;
187+
if (requestMethod == RequestMethod.GET) {
188+
Set<Method> resources = f.getMethodsAnnotatedWith(GetMapping.class);
189+
for (Method method : resources) {
190+
GetMapping annotation = method.getAnnotation(GetMapping.class);
191+
if (annotation.path().equals(path)) {
192+
return method;
193+
}
125194
}
126195
}
196+
if (requestMethod == RequestMethod.POST) {
197+
Set<Method> resources = f.getMethodsAnnotatedWith(PostMapping.class);
198+
for (Method method : resources) {
199+
PostMapping annotation = method.getAnnotation(PostMapping.class);
200+
if (annotation.path().equals(path)) {
201+
return method;
202+
}
203+
}
204+
}
205+
127206
throw new NullRouteException();
128207
}
129208
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.vison.webmvc.framework;
2+
3+
import com.vison.webmvc.config.DatabaseConfig;
4+
import com.vison.webmvc.dao.UserMapper;
5+
import javax.sql.DataSource;
6+
import org.apache.ibatis.mapping.Environment;
7+
import org.apache.ibatis.session.SqlSessionFactory;
8+
import org.apache.ibatis.transaction.TransactionFactory;
9+
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
10+
import org.apache.ibatis.session.Configuration;
11+
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
12+
13+
/**
14+
*
15+
* @author vison.cao <visonforcoding@gmail.com>
16+
*/
17+
public class MybatisLoader {
18+
19+
static SqlSessionFactory sqlSessionFactory = null;
20+
21+
public static SqlSessionFactory getSqlSessionFactory() {
22+
if (sqlSessionFactory == null) {
23+
DataSource dataSource = DatabaseConfig.getDataSource();
24+
TransactionFactory transactionFactory
25+
= new JdbcTransactionFactory();
26+
Environment environment
27+
= new Environment("development", transactionFactory, dataSource);
28+
Configuration configuration = new Configuration(environment);
29+
configuration.addMapper(UserMapper.class);
30+
sqlSessionFactory
31+
= new SqlSessionFactoryBuilder().build(configuration);
32+
}
33+
return sqlSessionFactory;
34+
}
35+
36+
}

0 commit comments

Comments
 (0)