优秀的编程知识分享平台

网站首页 > 技术文章 正文

用idea创建spring boot+mybatis项目(定时器+httpclient实例)

nanyue 2024-08-03 18:12:20 技术文章 6 ℃

一、java web开发环境搭建

网上有很多教程,参考教程:http://www.cnblogs.com/Leo_wl/p/4752875.html

二、Spring boot搭建

1、Intellij idea(采用旗舰版)菜单栏File->new->project。

 2、选择左侧栏中spring initializr,右侧选择jdk版本,以及默认的Service URL,点击next。

3、然后填写项目的Group、Artifact等信息,helloworld阶段选默认就可以了,点击next。

4、左侧点击Web,中间一侧选择Web,然后左侧选择SQL,中间一侧选择JPA、Mybatis、MYSQL(LZ数据库用的是mysql,大家可以选择其他DB),点击next。

5、填写Project name 等信息,然后点击Finish。

至此,一个maven web项目就创建好了,目录结构如下:

这样,Spring boot就搭建好了,pom.xml里已经有了Spring boot的jar包,包括我们的mysql数据连接的jar包。Spring boot内置了类似tomcat这样的中间件,所以,只要运行DemoApplication中的main方法就可以启动项目了。我们测试一下。

在src/main/java下新建目录com/demo/entity/User。

package com.demo.entity;
public class User {
 private String name;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
}

相同目录下新建com/demo/controller/TestBootController。

package com.demo.controller;
import com.demo.entity.User;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
@RequestMapping("/testboot")
public class TestBootController {
 @RequestMapping("getuser")
 public User getUser() {
 User user = new User();
 user.setName("test");
 return user;
 }
}

spring boot启动DemoAplication是需要扫描它下面的Controller等类的,所以将DemoApplication移动到com/demo目录下。还有就是Spring boot启动默认是要加载数据源的,所以我们在src/main/resources下新建application.yml:

#默认使用配置
spring:
 profiles:
 active: dev
#公共配置与profiles选择无关
mybatis:
 typeAliasesPackage: com.xdd.entity
 mapperLocations: classpath:mapper/*.xml
---
#开发配置
spring:
 profiles: dev
 datasource:
 url: jdbc:mysql://localhost:3306/test
 username: root
 password: root
 driver-class-name: com.mysql.jdbc.Driver

或者将pom.xml中加载数据源的jar包先注释掉也可以。

/*<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.0</version>
</dependency>*/

最终的目录结构如下,

启动DemoApplication的main方法,访问http://localhost:8080/testboot/getuser即可。

三、整合Mybatis

1、集成druid,使用连接池。pom.xml中添加:

<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>1.1.0</version>
</dependency>

最终的pom.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>
 <groupId>com.arm</groupId>
 <artifactId>demo</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>
 <name>demo</name>
 <description>Demo project for Spring Boot</description>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.5.8.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
 </dependency>
 <dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.1</version>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>1.1.0</version>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>
</project>

在application.yml中添加数据源、Mybatis的实体和配置文件位置。

#默认使用配置
spring:
 profiles:
 active: dev
#公共配置与profiles选择无关 mapperLocations指的路径是src/main/resources
mybatis:
 typeAliasesPackage: com.xdd.entity
 mapperLocations: classpath:mapper/*.xml
---
#开发配置
spring:
 profiles: dev
 datasource:
 url: jdbc:mysql://localhost:3306/test
 username: root
 password: root
 driver-class-name: com.mysql.jdbc.Driver
 # 使用druid数据源
 type: com.alibaba.druid.pool.DruidDataSource

就这样就整合完成了!我们测试一下。

用MyBatis Generator自动生成代码,参考博文:http://blog.csdn.net/zhshulin/article/details/23912615 这里列一下自动生成的代码。

import com.xdd.entity.User;
import org.springframework.stereotype.Component;
public interface UserDao {
 int deleteByPrimaryKey(Integer id);
 int insert(User record);
 int insertSelective(User record);
 User selectByPrimaryKey(Integer id);
 int updateByPrimaryKeySelective(User record);
 int updateByPrimaryKey(User record);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.xdd.dao.UserDao" >
 <resultMap id="BaseResultMap" type="com.xdd.entity.User" >
 <id column="id" property="id" jdbcType="INTEGER" />
 <result column="user_name" property="userName" jdbcType="VARCHAR" />
 <result column="password" property="password" jdbcType="VARCHAR" />
 <result column="age" property="age" jdbcType="INTEGER" />
 </resultMap>
 <sql id="Base_Column_List" >
 id, user_name, password, age
 </sql>
 <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
 select
 <include refid="Base_Column_List" />
 from user_t
 where id = #{id,jdbcType=INTEGER}
 </select>
 <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
 delete from user_t
 where id = #{id,jdbcType=INTEGER}
 </delete>
 <insert id="insert" parameterType="com.xdd.entity.User" >
 insert into user_t (id, user_name, password,
 age)
 values (#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
 #{age,jdbcType=INTEGER})
 </insert>
 <insert id="insertSelective" parameterType="com.xdd.entity.User" >
 insert into user_t
 <trim prefix="(" suffix=")" suffixOverrides="," >
 <if test="id != null" >
 id,
 </if>
 <if test="userName != null" >
 user_name,
 </if>
 <if test="password != null" >
 password,
 </if>
 <if test="age != null" >
 age,
 </if>
 </trim>
 <trim prefix="values (" suffix=")" suffixOverrides="," >
 <if test="id != null" >
 #{id,jdbcType=INTEGER},
 </if>
 <if test="userName != null" >
 #{userName,jdbcType=VARCHAR},
 </if>
 <if test="password != null" >
 #{password,jdbcType=VARCHAR},
 </if>
 <if test="age != null" >
 #{age,jdbcType=INTEGER},
 </if>
 </trim>
 </insert>
 <update id="updateByPrimaryKeySelective" parameterType="com.xdd.entity.User" >
 update user_t
 <set >
 <if test="userName != null" >
 user_name = #{userName,jdbcType=VARCHAR},
 </if>
 <if test="password != null" >
 password = #{password,jdbcType=VARCHAR},
 </if>
 <if test="age != null" >
 age = #{age,jdbcType=INTEGER},
 </if>
 </set>
 where id = #{id,jdbcType=INTEGER}
 </update>
 <update id="updateByPrimaryKey" parameterType="com.xdd.entity.User" >
 update user_t
 set user_name = #{userName,jdbcType=VARCHAR},
 password = #{password,jdbcType=VARCHAR},
 age = #{age,jdbcType=INTEGER}
 where id = #{id,jdbcType=INTEGER}
 </update>
</mapper>
public class User {
 private Integer id;
 private String userName;
 private String password;
 private Integer age;
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
 public String getUserName() {
 return userName;
 }
 public void setUserName(String userName) {
 this.userName = userName == null ? null : userName.trim();
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password == null ? null : password.trim();
 }
 public Integer getAge() {
 return age;
 }
 public void setAge(Integer age) {
 this.age = age;
 }
}

最后将DemoApplication.java修改一下,让其扫描dao层接口。

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer;
@SpringBootApplication
@MapperScan("com.xdd.dao")
public class DemoApplication extends SpringBootServletInitializer{
 public static void main(String[] args) {
 SpringApplication.run(DemoApplication.class,args);
 }
}

自己添加controller和service

import java.util.List;
import java.util.Map;
public interface UserService {
 public User getUserById(int userId);
 boolean addUser(User record);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service("userService")
public class UserServiceImpl implements UserService {
 @Resource
 private UserDao userDao;
 public User getUserById(int userId) {
 return userDao.selectByPrimaryKey(userId);
 }
 public boolean addUser(User record){
 boolean result = false;
 try {
 userDao.insertSelective(record);
 result = true;
 } catch (Exception e) {
 e.printStackTrace();
 }
 return result;
 }
}
@Controller
@RequestMapping("/user")
public class UserController {
 @Resource
 private UserService userService;
 @RequestMapping("/showUser")
 @ResponseBody
 public User toIndex(HttpServletRequest request, Model model){
 int userId = Integer.parseInt(request.getParameter("id"));
 User user = this.userService.getUserById(userId);
 return user;
 }
}

浏览器访问http://localhost:8080/user/showUser?id=1

接着我们来创建定时任务:

配置定时任务网站(http://cron.qqe2.com/)

开启定时任务

1.在程序的入口类中添加@EnableScheduling注解

2.接着创建定时类:

@Component
public class Scheduler {
 @Autowired
 SchedulerController schedulerController;
 private final Logger logger = LoggerFactory.getLogger(this.getClass());
 @Scheduled(cron="0 0 6 1/1 * ? ") //每天的6点钟跑
 public void statusCheck() {
 schedulerController.getlinkAPPjzcx();
 logger.info("每天6点执行一次。开始……");
 //statusTask.healthCheck();
 logger.info("没天6点执行一次。结束。");
 }
 @Scheduled(fixedRate=20000)
 public void testTasks() {
 // schedulerController.getUser(ticket);
 // schedulerController.getlinkAPPjzcx();
 // schedulerController.getlinkAPPjzcx();
 //schedulerController.getlinkAPPjzcx();
 logger.info("每20秒执行一次。开始……");
 logger.info("每20秒执行一次。结束。");
 // List<Jzcx> list=map.get("data");
 // logger.info("每20秒执行一次。开始……");
 //statusTask.healthCheck();
 // logger.info("每20秒执行一次。结束。");
 }
}

3.@Scheduled的几种用法

@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行

@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行

@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

@Scheduled(cron="*/5 * * * * *") :通过cron表达式定义规则

注意,这里的时间,单位是毫秒,1秒=1000毫秒

4.效果:

开启httpclient远程调用:

添加依赖

<dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpclient</artifactId>
 <version>4.5.5</version>
</dependency>

HttpClient客户端

可以传输json和map数据,可以使用get和post请求,详情见备注

package http;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
/**
 * http客户端
 * 
 * 
 * @author:WangYuanJun
 * @date:2017年12月20日 下午8:26:51
 */
public class HttpClientTest {
 /**
 * post请求传输map数据
 * 
 * @param url
 * @param map
 * @param encoding
 * @return
 * @throws ClientProtocolException
 * @throws IOException
 */
 public static String sendPostDataByMap(String url, Map<String, String> map, String encoding) throws ClientProtocolException, IOException {
 String result = "";
 // 创建httpclient对象
 CloseableHttpClient httpClient = HttpClients.createDefault();
 // 创建post方式请求对象
 HttpPost httpPost = new HttpPost(url);
 // 装填参数
 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
 if (map != null) {
 for (Entry<String, String> entry : map.entrySet()) {
 nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
 }
 }
 // 设置参数到请求对象中
 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, encoding));
 // 设置header信息
 // 指定报文头【Content-type】、【User-Agent】
 httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
 httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
 // 执行请求操作,并拿到结果(同步阻塞)
 CloseableHttpResponse response = httpClient.execute(httpPost);
 // 获取结果实体
 // 判断网络连接状态码是否正常(0--200都数正常)
 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
 result = EntityUtils.toString(response.getEntity(), "utf-8");
 }
 // 释放链接
 response.close();
 return result;
 }
 /**
 * post请求传输json数据
 * 
 * @param url
 * @param json
 * @param encoding
 * @return
 * @throws ClientProtocolException
 * @throws IOException
 */
 public static String sendPostDataByJson(String url, String json, String encoding) throws ClientProtocolException, IOException {
 String result = "";
 // 创建httpclient对象
 CloseableHttpClient httpClient = HttpClients.createDefault();
 // 创建post方式请求对象
 HttpPost httpPost = new HttpPost(url);
 // 设置参数到请求对象中
 StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
 stringEntity.setContentEncoding("utf-8");
 httpPost.setEntity(stringEntity);
 // 执行请求操作,并拿到结果(同步阻塞)
 CloseableHttpResponse response = httpClient.execute(httpPost);
 // 获取结果实体
 // 判断网络连接状态码是否正常(0--200都数正常)
 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
 result = EntityUtils.toString(response.getEntity(), "utf-8");
 }
 // 释放链接
 response.close();
 return result;
 }
 /**
 * get请求传输数据
 * 
 * @param url
 * @param encoding
 * @return
 * @throws ClientProtocolException
 * @throws IOException
 */
 public String sendGetData(String url, String encoding) throws ClientProtocolException, IOException {
 String result = "";
 // 创建httpclient对象
 CloseableHttpClient httpClient = HttpClients.createDefault();
 // 创建get方式请求对象
 HttpGet httpGet = new HttpGet(url);
 httpGet.addHeader("Content-type", "application/json");
 // 通过请求对象获取响应对象
 CloseableHttpResponse response = httpClient.execute(httpGet);
 // 获取结果实体
 // 判断网络连接状态码是否正常(0--200都数正常)
 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
 result = EntityUtils.toString(response.getEntity(), "utf-8");
 }
 // 释放链接
 response.close();
 return result;
 }
 @Test
 public void testSendPostDataByMap() throws ClientProtocolException, IOException {
 String url = "http://localhost:8080/httpService/sendPostDataByMap";
 Map<String, String> map = new HashMap<String, String>();
 map.put("name", "wyj");
 map.put("city", "南京");
 String body = sendPostDataByMap(url, map, "utf-8");
 System.out.println("响应结果:" + body);
 }
 @Test
 public void testSendPostDataByJson() throws ClientProtocolException, IOException {
 String url = "http://localhost:8080/httpService/sendPostDataByJson";
 Map<String, String> map = new HashMap<String, String>();
 map.put("name", "wyj");
 map.put("city", "南京");
 String body = sendPostDataByJson(url, JSON.toJSONString(map), "utf-8");
 System.out.println("响应结果:" + body);
 }
 @Test
 public void testSendGetData() throws ClientProtocolException, IOException {
 String url = "http://localhost:8080/httpService/sendGetData?name=wyj&city=南京";
 String body = sendGetData(url, "utf-8");
 System.out.println("响应结果:" + body);
 }
}

HttpClient服务端

package com.wyj.http;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

/**
 * http服务端
 * 
 * 
 * @author:WangYuanJun
 * @date:2017年12月21日 下午8:27:08
 */
@RestController
@RequestMapping("/httpService")
public class HttpServiceTest {
 @RequestMapping(value = "/sendPostDataByMap", method = RequestMethod.POST)
 public String sendPostDataByMap(HttpServletRequest request, HttpServletResponse response) {
 String result = "调用成功:数据是 " + "name:" + request.getParameter("name") + " city:" + request.getParameter("city");
 return JSON.toJSONString(result);
 }
 @RequestMapping(value = "/sendPostDataByJson", method = RequestMethod.POST)
 public String sendPostDataByJson(HttpServletRequest request, HttpServletResponse response, @RequestBody String requestBody) {
 JSONObject jsonObject = JSONObject.parseObject(requestBody);
 String result = "调用成功:数据是 " + "name:" + jsonObject.getString("name") + " city:" + jsonObject.getString("city");
 return JSON.toJSONString(result);
 }
 @RequestMapping(value = "/sendGetData", method = RequestMethod.GET)
 public String sendGetData(HttpServletRequest request, HttpServletResponse response) {
 String result = "调用成功:数据是 " + "name:" + request.getParameter("name") + " city:" + request.getParameter("city");
 return JSON.toJSONString(result);
 }
}

调用后返回结果输出为

最近发表
标签列表