搜索词>>spring boot 入门 耗时0.0100
  • Spring Boot 入门 (二)属性配置

    spring boot入门,spring boot是一个崭新的spring框架分支项目,本文讲解其属性配置相关项目结构:<br /> <img alt="项目结构" class="img-thumbnail" src="/resources/assist/images/blog/99e7708b-f395-490c-8575-9064f0482cad.jpg" style="height:458px; width:337px" /><br /> SpringBoot的配置都写在application.properties配置文件中<br /> <br /> application.properties:添加端口配置 <pre> <code>#server port server.port=8081 #add project context path server.context-path=/demo</code></pre> 再次启动<br /> <img alt="启动" class="img-thumbnail" src="/resources/assist/images/blog/c7388a42-3b6f-4ce5-93d7-1f0977f42bf8.jpg" style="height:224px; width:1085px" /> 启动完成,可以看见端口已经切换为8081了<br />  访问:<br /> <img alt="new 访问" class="img-thumbnail" src="/resources/assist/images/blog/2f488dc5-bdb3-42d8-aa4b-264e18e6b939.jpg" style="height:198px; width:491px" /><br /> <span style="color:#ff0000"><strong>注意:<br /> 1.由于配置了server.context-path属性,所以访问的时候前面加上<br /> 2.端口必须修改为8081才能正常访问</strong></span><br /> <br /> 切换属性文件为yml文件<br />   1.备份属性文件:application.properties.bk<br />   2.创建application.yml配置文件 <pre> <code>server: port: 8082 context-path: /demo</code></pre> <br /> 注意:冒号后面必须有个空格,这是语法<br /> <img alt="配置" class="img-thumbnail" src="/resources/assist/images/blog/12484e6f-9a6f-4d24-ae64-1b57b66301ad.jpg" style="height:538px; width:1015px" /><br /> <br />  重启应用:<br /> <img alt="重启" class="img-thumbnail" src="/resources/assist/images/blog/a17f0094-5419-4a24-9624-add5e727bf72.jpg" style="height:276px; width:968px" /><br /> 注意:<br /> 重启后端口已经按照yml格式配置文件修改为8082端口<br /> 访问:<br /> <img alt="重启访问" class="img-thumbnail" src="/resources/assist/images/blog/86659e5f-e0ac-4153-a75a-71c9c013b52a.jpg" style="height:210px; width:447px" /><br /> 访问成功<br /> <br /> <span style="color:#ee82ee"><strong>推荐:推荐大家使用yml格式配置文件</strong></span><br />   <h4>获取配置文件中的参数值</h4> <p>1.配置文件添加</p> <pre> <code>server: port: 8080 cupSize: B age: 18 content: "cpuSize:${cupSize},age:${age}"</code></pre> <p>2.java代码</p> <pre> <code class="language-java">package com.example; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController public class HelloController { @Value("${cupSize}")//注意写法,获取配置文件中的cupSize private String cpuSize; @Value("${age}") private int age; @Value("${content}") private String content; @RequestMapping(value="/hello",method=RequestMethod.GET)//写法与springMVC有点相似 public String say(){ return "Hello Spring Boot!"+cpuSize+" "+age+" "+content; } } </code></pre> <p>3.访问结果<br /> <br /> <img alt="结果" class="img-thumbnail" src="/resources/assist/images/blog/88e19920-87f5-485d-be94-b43bfe9749bc.jpg" style="height:297px; width:585px" /><br /> 属性对象方式取值<br /> 1.属性文件<br />  </p> <pre> <code>server: port: 8080 cupSize: B age: 18 content: "cpuSize:${cupSize},age:${age}" persion: name: xqlee age: 18 </code></pre> <p><br /> 2.属性文件里面对象对应的bean</p> <pre> <code class="language-java">package com.example; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "persion") // 这里的person与配置文件一致 public class PersionProperties { private String name; private int age; /** * @return the name */ public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public int getAge() { return age; } /** * @param age * the age to set */ public void setAge(int age) { this.age = age; } } </code></pre> <p>3.controller</p> <pre> <code class="language-java">package com.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController public class HelloController { @Value("${cupSize}")//注意写法,获取配置文件中的cupSize private String cpuSize; @Value("${age}") private int age; @Value("${content}") private String content; @Autowired PersionProperties persionProperties; @RequestMapping(value="/hello",method=RequestMethod.GET)//写法与springMVC有点相似 public String say(){ System.out.println("name:"+persionProperties.getName()+" age:"+persionProperties.getAge()); return "Hello Spring Boot!"+cpuSize+" "+age+" "+content; } } </code></pre> <p>4.执行结果<br /> <img alt="输出结果" class="img-thumbnail" src="/resources/assist/images/blog/d1f50724-d37e-41e0-a031-4c91f9da39da.jpg" style="height:510px; width:1011px" /><br /> <br />  多配置文件方式<br /> 1.复制两份application.yml,分别命名为application-dev.yml application-prod.yml<br /> 2.修改prod配置内容<br />  </p> <pre> <code>server: port: 8081 cupSize: B age: 18 content: "cpuSize:${cupSize},age:${age}" persion: name: xqlee2 age: 182 </code></pre> <p>3配置原本的application.yml<br />  </p> <pre> <code>spring: profiles: active: prod</code></pre> <p>启动:<br /> <img alt="启动" class="img-thumbnail" src="/resources/assist/images/blog/e2253ef8-929c-4f7a-bbba-822db60d05c3.jpg" style="height:165px; width:774px" /><br /> <img alt="" class="img-thumbnail" src="/resources/assist/images/blog/d6c85f4b-ea3b-4b61-bc23-4281c760a275.jpg" style="height:411px; width:868px" /><br /> 由此得出:<br /> 已经启用配置文件application-prod.xml<br /> 同理,修改application.yml中的active: dev则启动application-dev.yml<br /> <br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/64.html" rel="" target="_blank">spring boot 入门(一)hello word</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/65.html" rel="" target="_blank">spring boot入门(二)属性配置</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/66.html" rel="" target="_blank">spring boot入门(三)controller的使用</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/67.html" rel="" target="_blank">spring boot入门(四)数据库操作</a></p>
  • Spring boot 入门(一)环境搭建以及第一个应用

    spring boot又一个spring框架的经典项目,本文讲解spring boot入门的环境配置以及第一个项目,Spring Boot 入门教程<h2>一.Spring boot与spring MVC的关系</h2> 两者没有必然的联系,但是spring boot可以看作为spring MVC的升级版 <h2>二.SpringBoot的特点</h2> 1.化繁为简,简化配置(最大特点)<br /> 2.备受关注,是下一代spring框架<br /> 3.微服务的入门级微框架 <h2>三.环境准备</h2> 打开eclipse安装spring的工具插件STS<br /> 安装方法:<br /> 1.电脑连接网络<br /> 2.依次选择eclipse的 help >Eclipse Marketplace<br /> 3.搜索STS<br /> <img alt="eclipse STS插件" class="img-thumbnail" src="/resources/assist/images/blog/a8bed2d8-ef19-4f83-9820-3b2483e38f7c.jpg" style="height:895px; width:616px" /><br /> 安装上图勾选的STS<br /> <strong><span style="color:#ff0000">注意:安装过程中电脑需要连接网络</span></strong> <h2>四.创建第一个spring boot项目</h2> 1.新建项目,选择Spring Starter Project<br /> <img alt="创建项目" class="img-thumbnail" src="/resources/assist/images/blog/e06cf223-126c-4fc4-a7ce-91adf8daa894.jpg" style="height:500px; width:525px" /><br /> 2.填写项目相关信息<br /> <img alt="项目信息" class="img-thumbnail" src="/resources/assist/images/blog/0a8493c1-3eae-47e2-9eaa-276bc67888ad.jpg" style="height:822px; width:910px" /><br /> 我默认的<br /> <br /> 3.选择Spring Boot版本以及依赖完成项目创建<br /> 版本选择的1.51,依赖选择了一个web,点击finish完成项目的创建<br /> <img alt="版本以及依赖" class="img-thumbnail" src="/resources/assist/images/blog/735b4093-dd69-4c01-b462-8ec61eaa9636.jpg" style="height:822px; width:910px" /><br /> <br /> 4.项目结构<br /> <img alt="项目结构" class="img-thumbnail" src="/resources/assist/images/blog/be08ce18-9a47-4b55-b249-8a6966ae3d1e.jpg" style="height:458px; width:337px" /><br /> 5.删除一些不需要的文件<br />  1>删除 mvnw <br />  2>删除 mvw.cmd<br /> 6.项目说明<br /> 1.默认有个DemoApplication类,里面是spring boot的载入函数<br /> 2.resource目录下有个application.properties文件,这个是Spring boot的配置文件<br /> 3.test目录下有个测试类DemoApplicationTests,这个是spring boot的单元测试<br /> 4.pom.xml文件 <pre> <code class="language-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.example</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.1.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-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> </code></pre> 注意观察<br /> 一个继承spring-boot-starter-parent,两个依赖,spring-boot-starter-web web项目依赖必须,spring-boot-starter-test spring boot项目单元测试依赖<br /> <br /> 7.启动项目<br /> 通过spring boot的启动类,这里是DemoApplication<br /> <img alt="启动" class="img-thumbnail" src="/resources/assist/images/blog/1fc2ffe5-1a04-4366-8eb4-b413b2b2beab.jpg" style="height:282px; width:826px" /><br /> 选择Run As > Spring Boot App<br /> <img alt="启动完成" class="img-thumbnail" src="/resources/assist/images/blog/d16c24c1-29b8-4358-9fc3-46f1d40ff638.jpg" style="height:608px; width:1039px" /><br /> 上面标示启动完成,<br /> tomcat启动在8080端口,http协议,启动花费了1.707秒<br /> 打开浏览器,输入地址:<br /> <img alt="错误" class="img-thumbnail" src="/resources/assist/images/blog/fec5e96d-1df2-4dca-8d83-ceffa8ef9d14.jpg" style="height:338px; width:858px" /><br />  出现上图404错误是正常的,因为我们什么都没写<br /> <br /> 8.编写一个HelloController <pre> <code class="language-java">package com.example; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController public class HelloController { @RequestMapping(value="/hello",method=RequestMethod.GET)//写法与springMVC有点相似 public String say(){ return "Hello Spring Boot!"; } } </code></pre> <br /> 重启应用<br /> <img alt="hello映射" class="img-thumbnail" src="/resources/assist/images/blog/585368fb-27ee-43e8-942b-d453bb956548.jpg" style="height:341px; width:914px" /><br /> 重启发现刚才写的hello已经映射出来了<br /> 访问/hello<br /> <img alt="/hello" class="img-thumbnail" src="/resources/assist/images/blog/85f84416-c48f-4c71-8c20-d9848300e4eb.jpg" style="height:242px; width:480px" /><br /> 这时候已经出来我们写的内容了<br /> <br /> <br /> Spring Boot 第一个项目hello就完成了。<br /> <br /> 推荐: <p><a rel="" target="_blank"href="http://www.leftso.com/blog/65.html" rel="" target="_blank">spring boot入门(二)属性配置</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/66.html" rel="" target="_blank">spring boot入门(三)controller的使用</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/67.html" rel="" target="_blank">spring boot入门(四)数据库操作</a></p> <p> </p>
  • spring boot 入门(四)数据库操作

    spring boot是一个崭新的spring框架分支项目,本文讲解基本的数据库配置<h4>一.pom.xml文件添加相关的两个依赖</h4> <pre> <code class="language-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.example</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.1.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-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 数据库操作依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 数据库操作依赖 --> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> </code></pre> 二.相关配置<br /> 编写配置文件application.yml <pre> <code>spring: profiles: active: prod datasource: driver-class-name: "com.mysql.jdbc.Driver" url: jdbc:mysql://127.0.0.1:3306/test username: root password: root jpa: hibernate: ddl-auto: update show-sql: true</code></pre> <h4><br /> 三.创建一个实体类</h4> <pre> <code class="language-java">package com.example; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; /** *创建一个实体 *这里的使用方法与jpa和hibernate有关 */ @Entity public class Persion { @Id @GeneratedValue private int id; private String name; private int age; public Persion(){ } /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public int getAge() { return age; } /** * @param age the age to set */ public void setAge(int age) { this.age = age; } } </code></pre> <br /> 四.启动项目,观察数据库<br /> <img alt="jpa创建数据库表" class="img-thumbnail" src="/resources/assist/images/blog/906aedcd-c26c-47a0-9992-83a2fa8e4c8c.jpg" style="height:109px; width:526px" /><br /> 这时候JPA已经帮助我们创建好了表<br /> <br /> 推荐:<br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/64.html" rel="" target="_blank">spring boot 入门(一)hello word</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/65.html" rel="" target="_blank">spring boot入门(二)属性配置</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/66.html" rel="" target="_blank">spring boot入门(三)controller的使用</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/67.html" rel="" target="_blank">spring boot入门(四)数据库操作</a>
  • spring boot 入门(三)controller的使用

    spring boot是一个崭新的spring框架分支项目,本文讲解spring boot中controller的常用注解使用<h4>一.常用注解说明</h4> @Controller  处理http请求<br /> @RestController Spring框架4版本之后出来的注解,之前版本返回json数据需要@ResponseBody配合@Controller<br /> @RequestMapping 配置url映射关系<br /> @PathVariable 获取url中的数据<br /> @RequestParam 获取请求参数的值<br /> @GetMapping 组合注解 <h4>二.@RestController 使用</h4> <pre> <code class="language-java">package com.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController public class HelloController { @Value("${cupSize}")//注意写法,获取配置文件中的cupSize private String cpuSize; @Value("${age}") private int age; @Value("${content}") private String content; @Autowired PersionProperties persionProperties; @RequestMapping(value="/hello",method=RequestMethod.GET)//写法与springMVC有点相似 public String say(){ System.out.println("name:"+persionProperties.getName()+" age:"+persionProperties.getAge()); return "Hello Spring Boot!"+cpuSize+" "+age+" "+content; } } </code></pre> <br /> 注解@RestController标记在类上,表示该类处理http请求,并且返回json数据 <h4>三.@RequestMapping注解使用(与SpringMVC中的使用相同)</h4> 如上面代码中的一样,可以作用于方法上,但是也可以作用于类上,作用于类上就相当于给所有的方法添加了一个前缀 <pre> <code class="language-java">package com.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController @RequestMapping("/demo") public class HelloController { @Value("${cupSize}")//注意写法,获取配置文件中的cupSize private String cpuSize; @Value("${age}") private int age; @Value("${content}") private String content; @Autowired PersionProperties persionProperties; @RequestMapping(value="/hello",method=RequestMethod.GET)//写法与springMVC有点相似 public String say(){ System.out.println("name:"+persionProperties.getName()+" age:"+persionProperties.getAge()); return "Hello Spring Boot!"+cpuSize+" "+age+" "+content; } } </code></pre> 上面代码的访问地址为:<br /> <img alt="fw" class="img-thumbnail" src="/resources/assist/images/blog/b802991b-dc1b-42fb-bbf1-5fb777e3e09e.jpg" style="height:256px; width:649px" /> <h4>四.@PathVariable注解使用</h4> <pre> <code class="language-java">package com.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController @RequestMapping("/demo") public class HelloController { @Value("${cupSize}")//注意写法,获取配置文件中的cupSize private String cpuSize; @Value("${age}") private int age; @Value("${content}") private String content; @Autowired PersionProperties persionProperties; @RequestMapping(value="/hello/{name}",method=RequestMethod.GET)//这里也可以写成/{name}/hello public String say(@PathVariable("name") String name){ return "Hello :"+name; } } </code></pre> 注意观察,注解@PathVariable使用需要在url中添加一个大括号对,中间是名字,方法参数里面@PathVariable("name"),中间的name必须与url的一致<br /> 写好后,重启<br /> 浏览器输入地址:<br /> <img alt="浏览" class="img-thumbnail" src="/resources/assist/images/blog/c6469e03-0d70-4027-be66-8f4d957bbbcd.jpg" style="height:343px; width:730px" /><br /> 地址说明:最后的xqlee为传递的参数 <h4>五.@RequestParam注解使用</h4> <pre> <code class="language-java">package com.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController @RequestMapping("/demo") public class HelloController { @Value("${cupSize}")//注意写法,获取配置文件中的cupSize private String cpuSize; @Value("${age}") private int age; @Value("${content}") private String content; @Autowired PersionProperties persionProperties; @RequestMapping(value="/hello",method=RequestMethod.GET) public String say(@RequestParam("name") String myName){ return "Hello :"+myName; } } </code></pre> 访问地址:<br /> <img alt="fw" class="img-thumbnail" src="/resources/assist/images/blog/d77c2ff6-ec05-4432-9115-37b51742cece.jpg" style="height:218px; width:584px" /><br /> 注意:<br /> 1.访问地址中的参数名name一定要和@RequestParam("name")注解中的name一致,后面的参数myName可以不与前面一致 <h4>六.@GetMapping注解使用</h4> 注解@GetMapping,主要是简化@RequestMapping,@GetMapping等同于@RequestMapping设置method=RequestMethod.GET <pre> <code class="language-java">package com.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * create leftso.com */ @RestController @RequestMapping("/demo") public class HelloController { @Value("${cupSize}")//注意写法,获取配置文件中的cupSize private String cpuSize; @Value("${age}") private int age; @Value("${content}") private String content; @Autowired PersionProperties persionProperties; // @RequestMapping(value="/hello",method=RequestMethod.GET) @GetMapping(value="/hello") public String say(@RequestParam("name") String myName){ return "Hello :"+myName; } } </code></pre> 改后同样可以访问,当然同理还有其他方式的mapping<br /> <br /> 推荐:<br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/64.html" rel="" target="_blank">spring boot 入门(一)hello word</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/65.html" rel="" target="_blank">spring boot入门(二)属性配置</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/66.html" rel="" target="_blank">spring boot入门(三)controller的使用</a><br /> <a rel="" target="_blank"href="http://www.leftso.com/blog/67.html" rel="" target="_blank">spring boot入门(四)数据库操作</a>
  • Spring Boot 入门 AOP 日志处理

    Spring Boot 入门 AOP 日志处理,这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring 框架的处理也是一样。综合来讲,本文主要讲解了spring boot aop 拦截 AOP预处理日志/AOP后处理日志/AOP环绕日志和异常日志的处理。<h2>引言</h2>     在Java编程开发中,经常会遇到用户业务日志的记录处理,如果每一个地方都去写大量的日志信息,那么工作量也是惊人的。这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring mvc框架也可以参考。 <h2>一.spring boot 项目结构图</h2> <br /> <br /> <img alt="spring boot 入门项目结构图" class="img-thumbnail" src="/resources/assist/images/blog/793811a6732a41078b2a90b3fee8b7c4.png" /> <h2>二.代码讲解</h2> <h2>2.1 spring boot mavn pom.xml依赖</h2> pom.xml: <pre> <code class="language-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>net.xqlee.project</groupId> <artifactId>demo-springboot-aop-log</artifactId> <version>2.0</version> <packaging>jar</packaging> <name>demo-springboot-aop-log</name> <description>demo project</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-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> </code></pre> 这里只是简单的实现AOP日志功能所以只引入了AOP和web包,实际业务情况可能会有数据库操作。 <h3>2.2 spring boot 配置启用AOP</h3> AspectConfig.java: <pre> <code class="language-java">package net.xqlee.project.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * 启用切面 * * @author xqlee * */ @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) public class AspectConfig { } </code></pre> <h3>2.3 spring boot中自定义一个注解,用于处理日志</h3> <pre> <code class="language-java">package net.xqlee.project.aop.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 系统日志记录 * * @author xqlee * */ @Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ServiceLog { /** * 操作类型,新增用户?删除用户 ?调用xx服务?使用接口?... * * @return */ public String operation(); /** * 日志级别 * * @return */ public LogType level() default LogType.INFO; } </code></pre> <pre> <code class="language-java">package net.xqlee.project.aop.annotation; public enum LogType { INFO, WARN, ERROR } </code></pre> <h3>2.4 spring boot 入门之编写处理AOP日志</h3> <pre> <code class="language-java">package net.xqlee.project.aop.aspect; import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import net.xqlee.project.aop.annotation.ServiceLog; @Component @Aspect public class LogAspect { private static final Logger log = LoggerFactory.getLogger(LogAspect.class); /** * 切入点 */ @Pointcut("@annotation(net.xqlee.project.aop.annotation.ServiceLog) ") public void entryPoint() { // 无需内容 } @Before("entryPoint()") public void before(JoinPoint joinPoint) { log.info("=====================开始执行前置通知=================="); try { String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class<?> targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); String operation = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class<?>[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { operation = method.getAnnotation(ServiceLog.class).operation();// 操作人 break; } } } StringBuilder paramsBuf = new StringBuilder(); for (Object arg : arguments) { paramsBuf.append(arg); paramsBuf.append("&"); } // *========控制台输出=========*// log.info("[X用户]执行了[" + operation + "],类:" + targetName + ",方法名:" + methodName + ",参数:" + paramsBuf.toString()); log.info("=====================执行前置通知结束=================="); } catch (Throwable e) { log.info("around " + joinPoint + " with exception : " + e.getMessage()); } } /** * 环绕通知处理处理 * * @param joinPoint * @throws Throwable */ @Around("entryPoint()") public Object around(ProceedingJoinPoint point) throws Throwable { // 先执行业务,注意:业务这样写业务发生异常不会拦截日志。 Object result = point.proceed(); try { handleAround(point);// 处理日志 } catch (Exception e) { log.error("日志记录异常", e); } return result; } /** * around日志记录 * * @param point * @throws SecurityException * @throws NoSuchMethodException */ public void handleAround(ProceedingJoinPoint point) throws Exception { Signature sig = point.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("该注解只能用于方法"); } msig = (MethodSignature) sig; Object target = point.getTarget(); Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes()); // 方法名称 String methodName = currentMethod.getName(); // 获取注解对象 ServiceLog aLog = currentMethod.getAnnotation(ServiceLog.class); // 类名 String className = point.getTarget().getClass().getName(); // 方法的参数 Object[] params = point.getArgs(); StringBuilder paramsBuf = new StringBuilder(); for (Object arg : params) { paramsBuf.append(arg); paramsBuf.append("&"); } // 处理log。。。。 log.info("[X用户]执行了[" + aLog.operation() + "],类:" + className + ",方法名:" + methodName + ",参数:" + paramsBuf.toString()); } @AfterThrowing(pointcut = "entryPoint()", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, Throwable e) { // 通过request获取登陆用户信息 // HttpServletRequest request = ((ServletRequestAttributes) // RequestContextHolder.getRequestAttributes()).getRequest(); try { String targetName = joinPoint.getTarget().getClass().getName(); String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class<?> targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); String operation = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class<?>[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { operation = method.getAnnotation(ServiceLog.class).operation(); break; } } } StringBuilder paramsBuf = new StringBuilder(); for (Object arg : arguments) { paramsBuf.append(arg); paramsBuf.append("&"); } log.info("异常方法:" + className + "." + methodName + "();参数:" + paramsBuf.toString() + ",处理了:" + operation); log.info("异常信息:" + e.getMessage()); } catch (Exception ex) { log.error("异常信息:{}", ex.getMessage()); } } } </code></pre> <h3>三.测试AOP日志</h3> <h3>3.1 编写一个service来进行日志测试</h3> 接口: <pre> <code class="language-java">package net.xqlee.project.service; import java.util.Map; public interface TestService { public boolean insert(Map<String, Object> params, String id); public boolean update(String name, String id); public boolean delete(String id); public boolean doError(String id); } </code></pre> 实现类: <pre> <code class="language-java">package net.xqlee.project.service; import java.util.Map; import org.springframework.stereotype.Service; import net.xqlee.project.aop.annotation.ServiceLog; import net.xqlee.project.aop.annotation.LogType; @Service public class TestServiceImp implements TestService { @ServiceLog(operation = "新增用户信息测试操作。。。。。") @Override public boolean insert(Map<String, Object> params, String id) { return false; } @ServiceLog(operation = "更新用户信息操作....") @Override public boolean update(String name, String id) { return false; } @ServiceLog(operation = "删除操作。。。。") @Override public boolean delete(String id) { return false; } @ServiceLog(operation = "异常操作测试", level = LogType.ERROR) @Override public boolean doError(String id) { try { @SuppressWarnings("unused") int i = 1 / 0; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } return false; } } </code></pre> <h3>3.2 编写并执行spring boot的测试类</h3> <pre> <code class="language-java">package net.xqlee.project; import java.util.HashMap; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import net.xqlee.project.service.TestService; @RunWith(SpringRunner.class) @SpringBootTest public class DemoSpringbootAopLogApplicationTests { @Autowired TestService testService; @Test public void contextLoads() { Map<String, Object> params = new HashMap<>(); params.put("key1", "v1"); params.put("key2", "v2"); testService.insert(params, "000"); testService.update("name", "id"); testService.delete("leftso"); testService.doError("leftso.com"); } } </code></pre> <br /> 执行核心控制台结果:<br /> <img alt="spring boot aop日志执行结果" class="img-thumbnail" src="/resources/assist/images/blog/688a7889d8d24b3f9e60be0d0c4b11ec.png" />从上图中可以看见,spring boot aop方式的日志已经拦截成功。并且注意观察在异常的时候并没有进行around日志拦截,也证实了代码中的备注。<br /> 综合来讲,本文主要讲解了spring boot aop 拦截 AOP预处理日志/AOP后处理日志/AOP环绕日志和异常日志的处理。
  • spring boot 入门 spring.profiles.active来分区配置

    spring boot 入门 使用spring.profiles.active来分区配置,,在spring boot中可以存在多个环境的配置文件通过配置spring.profiles.active来区分具体使用那个,也可以通过命令来指定使用那个。<h2>spring boot 入门 使用spring.profiles.active来分区配置</h2> <p>很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置</p> <p>spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。</p> <p>profile的配置文件可以按照application.properyies的放置位置一样,放于以下四个位置,</p> <ol> <li>当前目录的 “/config”的子目录下</li> <li>当前目录下</li> <li>classpath根目录的“/config”包下</li> <li>classpath的根目录下</li> </ol> <p>在这里我们就定义俩个profile文件,application-cus1.properties和application-cus2.properties,并在俩个文件中都分别写上变量cusvar=cus1和cusvar=cus2</p> <br /> 我们在application.properyies也写上,并把profile切换到application-cus1.properties的配置文件 <pre> <code>cusvar=cus3 spring.profiles.active=cus1</code></pre> 可以通过这样子来测试 <pre> <code class="language-java"> @RestController @RequestMapping("/task") public class TaskController { @RequestMapping(value = {"/",""}) public String hellTask(@Value("${cusvar}")String cusvar ){ return "hello task !! myage is " + cusvar; } }</code></pre> <p>在这里可以看到spring.profiles.active激活的profile不同,打印出来的结果也不一样。</p> <p>除了可以用profile的配置文件来分区配置我们的环境变量,在代码里,我们还可以直接用@Profile注解来进行配置,例如数据库配置,这里我们先定义一个接口<br />  </p> <pre> <code class="language-java">public interface DBConnector { public void configure(); }</code></pre> <br /> 分别定义俩个实现类来实现它 <pre> <code class="language-java">/** * 测试数据库 */ @Component @Profile("testdb") public class TestDBConnector implements DBConnector { @Override public void configure() { System.out.println("testdb"); } } /** * 生产数据库 */ @Component @Profile("devdb") public class DevDBConnector implements DBConnector { @Override public void configure() { System.out.println("devdb"); } }</code></pre> 通过在配置文件激活具体使用哪个实现类 <pre> <code>spring.profiles.active=testdb</code></pre> 然后就可以这么用了 <pre> <code class="language-java">@RestController @RequestMapping("/task") public class TaskController { @Autowired DBConnector connector ; @RequestMapping(value = {"/",""}) public String hellTask(){ connector.configure(); //最终打印testdb return "hello task !! myage is " + myage; } }</code></pre> 除了spring.profiles.active来激活一个或者多个profile之外,还可以用spring.profiles.include来叠加profile <pre> <code>spring.profiles: testdb spring.profiles.include: proddb,prodmq</code></pre> 以上就是spring boot用profile的作用 <h2>通过命令行设置属性值</h2> <p>相信使用过一段时间Spring Boot的用户,一定知道这条命令:<code>java -jar xxx.jar --server.port=8888</code>,通过使用--server.port属性来设置xxx.jar应用的端口为8888。</p> <p>在命令行运行时,连续的两个减号<code>--</code>就是对<code>application.properties</code>中的属性值进行赋值的标识。所以,<code>java -jar xxx.jar --server.port=8888</code>命令,等价于我们在<code>application.properties</code>中添加属性<code>server.port=8888</code>,该设置在样例工程中可见,读者可通过删除该值或使用命令行来设置该值来验证。</p> <p>通过命令行来修改属性值固然提供了不错的便利性,但是通过命令行就能更改应用运行的参数,那岂不是很不安全?是的,所以Spring Boot也贴心的提供了屏蔽命令行访问属性的设置,只需要这句设置就能屏蔽:<code>SpringApplication.setAddCommandLineProperties(false)</code>。</p> <h2>多环境配置</h2>     以上都不是重点,这才是重点,这才是重点,这才是重点,重要的事情说3遍。我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。<br />     对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。<br />        在Spring Boot中多环境配置文件名需要满足<code>application-{profile}.properties</code>的格式,其中<code>{profile}</code>对应你的环境标识,比如:<br />    application-dev.properties:开发环境<br />    application-test.properties:测试环境<br />    application-prod.properties:生产环境<br />        至于哪个具体的配置文件会被加载,需要在<code>application.properties</code>文件中通过<code>spring.profiles.active</code>属性来设置,其值对应<code>{profile}</code>值。<br /> 如:<code>spring.profiles.active=test</code>就会加载<code>application-test.properties</code>配置文件内容<br /> 下面,以不同环境配置不同的服务端口为例,进行样例实验。<br />  <br />      针对各环境新建不同的配置文件<code>application-dev.properties</code>、<code>application-test.properties</code>、<code>application-prod.properties</code><br />      在这三个文件均都设置不同的<code>server.port</code>属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80<br />      application.properties中设置<code>spring.profiles.active=dev</code>,就是说默认以dev环境设置<br />  <br /> 测试不同配置的加载:<br />      执行java -jar xxx.jar,可以观察到服务端口被设置为8080,也就是默认的开发环境(dev)<br />  <br />      执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为9090,也就是测试环境的配置(test)<br />  <br />      执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为80,也就是生产环境的配置(prod)<br />  <br /> 按照上面的实验,可以如下总结多环境的配置思路:<br />    application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置<br />    application-{profile}.properties中配置各个环境不同的内容<br /> 通过命令行方式去激活不同环境的配置。<br /> <br /> <strong>多环境高级应用</strong><br />        在某些情况下,应用的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设<code>EmailService</code>中包含的<code>send(String email)</code>方法向指定地址发送电子邮件,但是我们仅仅希望在生产环境中才执行真正发送邮件的代码,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。<br />        我们可以借助Spring的注解<code>@Profile</code>实现这样的功能,这样需要定义两个实现<code>EmailService</code>借口的类: <pre> <code class="language-java">/**  * 发送邮件接口.  */ public interface EmailService {     /**发送邮件*/     publicvoid send(); } 发送邮件的具体实现(dev-开发环境的代码): @Service @Profile("dev") //开发环境的时候. public class DevEmailServiceImpl implements EmailService{       @Override     publicvoid send() {        System.out.println("DevEmailServiceImpl.send().开发环境不执行邮件的发送.");     } }</code></pre> <br />  <br />  <br /> 发送邮件的具体实现(prod-生产环境的代码): <pre> <code class="language-java">@Service @Profile("prod") //生产环境. public class ProdEmailServiceImpl2 implements EmailService{         @Override     publicvoid send() {        System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送.");        //具体的邮件发送代码.        //mail.send();     } }  </code></pre> <br /> <code>@Profile("dev")</code>表明只有Spring定义的Profile为<code>dev</code>时才会实例化<code>DevEmailService</code>这个类。那么如何设置Profile呢? <h3>在配置文件中指定</h3>  <br /> 在<code>application.properties</code>中加入: <div> <pre> <code>spring.profiles.active=dev</code></pre> </div>   <h3>通过命令行参数</h3> <div> <pre> <code>java -jar app.jar --spring.profiles.active=dev</code></pre> </div>  
  • Spring boot 入门 使用rome实现RSS 订阅

    在本教程中,学习从spring boot 入门应用程序创建和使用RSS和Atom提要。 您必须在各种网站上(例如我们的RSS提要)以文本或图像按钮的形式看到这一点,邀请您“通过RSS订阅”。RSS是简单的联合API - 通常称为Rich Site Summary。 RSS革新了用户与在线内容交互的方式。<h2>引言</h2>     在本教程中,学习从spring boot应用程序创建和使用RSS和Atom提要。 您必须在各种网站上(例如我们的RSS提要)以文本或图像按钮的形式看到这一点,邀请您“通过RSS订阅”。RSS是简单的联合API - 通常称为Rich Site Summary。 RSS革新了用户与在线内容交互的方式。<br /> <br />     与RSS类似,Atom也是基于XML的Web内容和元数据联合格式,以及用于发布和编辑属于定期更新网站的Web资源的应用程序级协议。 所有Atom提要必须是格式良好的XML文档,应用程序/ atom + xml媒体类型。<br />   <h2>一.概述</h2>     在这个spring boot例子中,我们将使用spring bootAPI公开两个简单的RSS和ATOM端点,我们将看到如何使用java客户端来使用这些订阅。 <h2>二.环境准备</h2> <ul> <li>JDK 1.8, Eclipse, Maven – 开发环境</li> <li>Spring-boot – 底层的应用程序框架</li> <li><a rel="external nofollow" target="_blank" href="https://github.com/rometools/rome">ROME library</a> – 用于发布Feed</li> </ul> <h2>三.如何实现?</h2>     基本上用Spring框架发布RSS或Atom提要非常简单。 在Spring框架中有两个http消息转换器(RssChannelHttpMessageConverter和AtomFeedHttpMessageConverter),可以将spring控制器方法的响应转换为XML feed格式,如果返回类型与任何这些feed有关。<br /> <br />     两个转换器都依赖于ROME库,当它发现类路径中的库时,Spring Framework会自动注册这两个转换器。 我们所要做的就是将ROME库作为依赖添加到我们的pom.xml中。 <h3>3.1 创建spring boot项目</h3> <img alt="创建项目" class="img-thumbnail" src="/resources/assist/images/blog/b8fb228cdff44b8ea65d1e557bf05d2b.png" /><br /> Spring Boot 项目创建可以参考:<a rel="" target="_blank" href="http://www.leftso.com/blog/64.html">Spring Boot 入门 创建项目</a> <h3>3.2添加ROAM依赖</h3> <pre> <code class="language-xml"><dependency> <groupId>com.rometools</groupId> <artifactId>rome</artifactId> <version>1.8.0</version> </dependency></code></pre> <h2>3.2创建一个controller</h2>     现在添加一个Spring Controller,并分别添加两个端点/ rss和/ atom来公开RSS和Atom提要。 正如我们已经提到的,只是添加这个控制器会自动工作的情况下,因为内部弹簧框架将注册两个http消息转换器(RssChannelHttpMessageConverter和AtomFeedHttpMessageConverter),一旦我们在类路径中有ROAM依赖关系,将被注册。<br /> <br />     只有我们需要这样做才能从控制器方法返回适当的Feed类型对象。 在我们的例子中,feed对象的类型是com.rometools.rome.feed.rss.Channel,而Atom则是com.rometools.rome.feed.atom.Feed。 所以在添加Feed的内容和有关频道的其他细节之后,我们的控制器将如下所示。 <pre> <code class="language-java">package net.xqlee.project.controller; import java.util.Collections; import java.util.Date; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.rometools.rome.feed.atom.Category; import com.rometools.rome.feed.atom.Content; import com.rometools.rome.feed.atom.Entry; import com.rometools.rome.feed.atom.Feed; import com.rometools.rome.feed.atom.Link; import com.rometools.rome.feed.atom.Person; import com.rometools.rome.feed.rss.Channel; import com.rometools.rome.feed.rss.Description; import com.rometools.rome.feed.rss.Image; import com.rometools.rome.feed.rss.Item; import com.rometools.rome.feed.synd.SyndPerson; @RestController public class FeedController { @GetMapping(path = "/rss") public Channel rss() { Channel channel = new Channel(); channel.setFeedType("rss_2.0"); channel.setTitle("Leftso Feed"); channel.setDescription("最新技术的不同文章"); channel.setLink("http://www.leftso.com"); channel.setUri("http://www.leftso.com"); channel.setGenerator("在屋里编程"); Image image = new Image(); image.setUrl("/resources/assist/images/blog/b8fb228cdff44b8ea65d1e557bf05d2b.png"); image.setTitle("Leftso Feed"); image.setHeight(32); image.setWidth(32); channel.setImage(image); Date postDate = new Date(); channel.setPubDate(postDate); Item item = new Item(); item.setAuthor("Leftso"); item.setLink("http://www.leftso.com/blog/64.html"); item.setTitle("http://www.leftso.com/blog/64.html"); item.setUri("http://www.leftso.com/blog/64.html"); item.setComments("http://www.leftso.com/blog/64.html"); com.rometools.rome.feed.rss.Category category = new com.rometools.rome.feed.rss.Category(); category.setValue("CORS"); item.setCategories(Collections.singletonList(category)); Description descr = new Description(); descr.setValue( "两者没有必然的联系,但是spring boot可以看作为spring MVC的升级版." + " <a rel=\"nofollow\" href=\"http://www.leftso.com/blog/64.html/\">Spring boot 入门(一)环境搭建以及第一个应用</a>发布在 <a rel=\"nofollow\" href=\"http://www.leftso.com\">Leftso</a>."); item.setDescription(descr); item.setPubDate(postDate); channel.setItems(Collections.singletonList(item)); //Like more Entries here about different new topics return channel; } @GetMapping(path = "/atom") public Feed atom() { Feed feed = new Feed(); feed.setFeedType("atom_1.0"); feed.setTitle("Leftso"); feed.setId("http://www.leftso.com/"); Content subtitle = new Content(); subtitle.setType("text/plain"); subtitle.setValue("最新技术的不同文章"); feed.setSubtitle(subtitle); Date postDate = new Date(); feed.setUpdated(postDate); Entry entry = new Entry(); Link link = new Link(); link.setHref("http://www.leftso.com/blog/64.html"); entry.setAlternateLinks(Collections.singletonList(link)); SyndPerson author = new Person(); author.setName("Leftso"); entry.setAuthors(Collections.singletonList(author)); entry.setCreated(postDate); entry.setPublished(postDate); entry.setUpdated(postDate); entry.setId("http://www.leftso.com/blog/64.html"); entry.setTitle("Spring boot 入门(一)环境搭建以及第一个应用"); Category category = new Category(); category.setTerm("CORS"); entry.setCategories(Collections.singletonList(category)); Content summary = new Content(); summary.setType("text/plain"); summary.setValue("两者没有必然的联系,但是spring boot可以看作为spring MVC的升级版." + " <a rel=\"nofollow\" href=\"http://www.leftso.com/blog/64.html/\">Spring boot 入门(一)环境搭建以及第一个应用</a>发布在 <a rel=\"nofollow\" href=\"http://www.leftso.com\">Leftso</a>."); entry.setSummary(summary); feed.setEntries(Collections.singletonList(entry)); //参加这里关于不同的新话题 return feed; } }</code></pre> <h3>3.3演示</h3> 运行spring boot项目的启动类,启动spring boot项目,默认情况使用的8080端口。<br /> <img alt="启动图" class="img-thumbnail" src="/resources/assist/images/blog/d888cd5c11424690b0c306d9989261f6.png" /><br /> 现在,从浏览器转到http://localhost:8080/rss和http://localhost:8080/atom,您应该可以看到RSS和Atom订阅源,以了解您添加到控制器中的主题。<br /> <br /> <strong>RSS feed:</strong><br /> <br /> <img alt="RSS feed" class="img-thumbnail" src="/resources/assist/images/blog/a71baddcf5fc417db5d2bd6ce43ee913.png" /><br /> <strong>Atom Feed:<br /> <img alt="Atom Feed" class="img-thumbnail" src="/resources/assist/images/blog/f0d18f833e3148048e245bb3c2984063.png" /></strong><br />   <h3>3.5创建RSS Feed阅读器</h3>     我们已经有很多Feed阅读器可用,但是如果您需要以编程方式使用此Feed,则可以通过使用ROAM库的这几行简单代码来完成此操作。 <pre> <code class="language-java">package net.xqlee.project; import java.net.URL; import com.rometools.rome.feed.synd.SyndEntry; import com.rometools.rome.feed.synd.SyndFeed; import com.rometools.rome.io.SyndFeedInput; import com.rometools.rome.io.XmlReader; public class FeedConsumer { public static void main(String[] args) { try { String url = "http://localhost:8080/rss"; try (XmlReader reader = new XmlReader(new URL(url))) { SyndFeed feed = new SyndFeedInput().build(reader); System.out.println(feed.getTitle()); System.out.println("***********************************"); for (SyndEntry entry : feed.getEntries()) { System.out.println(entry); System.out.println("***********************************"); } System.out.println("Done"); } } catch (Exception e) { e.printStackTrace(); } } } </code></pre> 这里的URL是用于RSS提要的,如果将URL更改为Atom提要,同样的代码也可以工作。<br /> 输出<br /> 这里是控制台输出feed client: <pre> <code class="language-html">Leftso Feed *********************************** SyndEntryImpl.comments=http://www.leftso.com/blog/64.html SyndEntryImpl.author=Leftso SyndEntryImpl.wireEntry=null SyndEntryImpl.link=http://www.leftso.com/blog/64.html SyndEntryImpl.description.mode=null SyndEntryImpl.description.type=text/html SyndEntryImpl.description.interface=interface com.rometools.rome.feed.synd.SyndContent SyndEntryImpl.description.value=两者没有必然的联系,但是spring boot可以看作为spring MVC的升级版. <a rel="nofollow" href="http://www.leftso.com/blog/64.html/">Spring boot 入门(一)环境搭建以及第一个应用</a>发布在 <a rel="nofollow" href="http://www.leftso.com">Leftso</a>. SyndEntryImpl.foreignMarkup=[] SyndEntryImpl.updatedDate=null SyndEntryImpl.source=null SyndEntryImpl.title=http://www.leftso.com/blog/64.html SyndEntryImpl.interface=interface com.rometools.rome.feed.synd.SyndEntry SyndEntryImpl.uri=http://www.leftso.com/blog/64.html SyndEntryImpl.enclosures=[] SyndEntryImpl.modules[0].date=Sun Nov 12 11:57:14 CST 2017 SyndEntryImpl.modules[0].formats=[] SyndEntryImpl.modules[0].rightsList=[] SyndEntryImpl.modules[0].sources=[] SyndEntryImpl.modules[0].creators[0]=Leftso SyndEntryImpl.modules[0].subject=null SyndEntryImpl.modules[0].description=null SyndEntryImpl.modules[0].language=null SyndEntryImpl.modules[0].source=null SyndEntryImpl.modules[0].type=null SyndEntryImpl.modules[0].title=null SyndEntryImpl.modules[0].interface=interface com.rometools.rome.feed.module.DCModule SyndEntryImpl.modules[0].coverages=[] SyndEntryImpl.modules[0].descriptions=[] SyndEntryImpl.modules[0].relation=null SyndEntryImpl.modules[0].contributor=null SyndEntryImpl.modules[0].rights=null SyndEntryImpl.modules[0].publishers=[] SyndEntryImpl.modules[0].coverage=null SyndEntryImpl.modules[0].identifier=null SyndEntryImpl.modules[0].creator=Leftso SyndEntryImpl.modules[0].types=[] SyndEntryImpl.modules[0].languages=[] SyndEntryImpl.modules[0].identifiers=[] SyndEntryImpl.modules[0].subjects=[] SyndEntryImpl.modules[0].format=null SyndEntryImpl.modules[0].dates[0]=Sun Nov 12 11:57:14 CST 2017 SyndEntryImpl.modules[0].titles=[] SyndEntryImpl.modules[0].uri=http://purl.org/dc/elements/1.1/ SyndEntryImpl.modules[0].publisher=null SyndEntryImpl.modules[0].contributors=[] SyndEntryImpl.modules[0].relations=[] SyndEntryImpl.contents=[] SyndEntryImpl.links=[] SyndEntryImpl.contributors=[] SyndEntryImpl.publishedDate=Sun Nov 12 11:57:14 CST 2017 SyndEntryImpl.categories[0].taxonomyUri=null SyndEntryImpl.categories[0].name=CORS SyndEntryImpl.categories[0].interface=interface com.rometools.rome.feed.synd.SyndCategory SyndEntryImpl.authors=[] SyndEntryImpl.titleEx.mode=null SyndEntryImpl.titleEx.type=null SyndEntryImpl.titleEx.interface=interface com.rometools.rome.feed.synd.SyndContent SyndEntryImpl.titleEx.value=http://www.leftso.com/blog/64.html *********************************** Done </code></pre> <h2>四.总结</h2>     在这个例子中,我们知道我们可以轻松地将RSS和Atom feed配置到我们的spring引导项目中。 我们也看到了如何从Java代码中使用这些代码。 这就是今天的话题。 我附上完整的eclipse项目供您参考。
  • spring boot 入门之spring session&RESTful APIs

    spring boot 入门之spring session实现restful apis。通过spring boot或者spring mvc整合spring session的方式来实现session的共享达到应用可以水平扩展集群。<h2>一.简介</h2>    spring boot 入门之spring session实现restful apis。通过前面的了解和使用,我们知道可以通过spring boot或者spring mvc整合spring session的方式来实现session的共享达到应用可以水平扩展集群。session默认情况是存了一个cookie在响应的数据里面,然后每次通过cookie来验证session的,但是restful设计中一般不会使用cookie,所以spring session提供了将session id存放在http协议的header中,本文主要讲解如何使用。 <h2>二.编码介绍</h2> <h3>HttpSession & RESTful APIs</h3> 原理:Spring Session 可以允许session在header里面提供来实现RESTful APIs <h3>Spring配置</h3> 在创建一个spring boot项目后,加入相关的依赖。现在我们就可以来进行相关配置。这个配置主要负责创建一个servlet Filter替换原有的HttpSession 使用spring session.主要添加以下spring 相关配置: <pre> <code class="language-java">@Configuration @EnableRedisHttpSession //① public class HttpSessionConfig { @Bean public LettuceConnectionFactory connectionFactory() { return new LettuceConnectionFactory(); //②注意,spring boot项目这里不需要创建一个链接工厂,在application配置文件中配置了相关信息会默认生成一个链接工厂供使用。 } @Bean public HttpSessionStrategy httpSessionStrategy() { return new HeaderHttpSessionStrategy(); //③ } }</code></pre>   ①<code>@EnableRedisHttpSession</code> 注解用来创建一个spring的过滤器类,类的名称为 <code>springSessionRepositoryFilter</code> 这个过滤器用来替换原生的 <code>HttpSession</code> 使用spring session。这个例子中,Spring Session通过Redis来实现存储。<br />   ②创建了一个<code>RedisConnectionFactory</code> 来使Spring Session链接到Redis Server。关于spring data redis相关配置可以参考之前的spring redis整合。(注意,spring boot项目这里不需要创建一个链接工厂,在application配置文件中配置了相关信息会默认生成一个链接工厂供使用。)<br />   ③我们自定义了Spring  Session的HttpSession ,将它整合到了HTTP协议的header里面,替换掉默认的放在cookie中。 <h3>HttpSessionListener 即session监听处理</h3> Spring Session支持<code>HttpSessionListener</code>,通过将<code>SessionDestroyedEvent</code> 和SessionCreatedEvent转换成 <code>HttpSessionEvent</code> 被定义在SessionEventHttpSessionListenerAdapter来实现。需要使用监听,注意以下几点: <ul> <li>确保你所实现的<code>SessionRepository</code> 支持并且配置到启动<code>SessionDestroyedEvent</code> 和SessionCreatedEvent</li> <li>将<code>SessionEventHttpSessionListenerAdapter</code> 配置为spring容器中的一个bean</li> <li>注入每一个<code>HttpSessionListener</code> 到SessionEventHttpSessionListenerAdapter</li> </ul> 如果你使用Redis的方式记录HttpSession,你需要将每一个HttpSessionListener配置为bean。例如,假设你想要支持Spring Security的并发控制,并且需要使用HttpSessionEventPublisher,你可以简单地将HttpSessionEventPublisher添加为一个bean。 在Java配置中,这可能如下所示: <pre> <code class="language-java">@Configuration @EnableRedisHttpSession public class RedisHttpSessionConfig { @Bean public HttpSessionEventPublisher httpSessionEventPublisher() { return new HttpSessionEventPublisher(); } // ... }</code></pre> 或者xml <pre> <code class="language-xml"><bean class="org.springframework.security.web.session.HttpSessionEventPublisher"/></code></pre>
  • Spring boot 入门之CORS 跨域配置详解

    Spring boot 入门之CORS 跨域配置详解,spring 跨域配置详解。<h2>引言</h2>     在Java 编程中,web项目还是经常遇到一些跨域的使用。这里主要记录几种spring框架,spring boot中的一些常见的几种配置跨域的方法。<br /> <br />     CORS(<em>Cross-origin resource sharing-</em>跨源资源共享)允许网页从其他域向浏览器请求额外的资源,例如 字体,CSS或来自CDN的静态图像。 CORS有助于将来自多个域的网页内容提供给通常具有相同安全策略的浏览器。 在这个例子中,我们将学习如何在Spring MVC应用程序的方法和全局级别启用CORS支持。 <h2>一.spring框架中使用@CrossOrigin注解方法级CORS</h2>     Spring MVC提供了@CrossOrigin注解。 这个注释标注了注释的方法或类型,允许跨源请求。<br /> <br />     默认情况下,@CrossOrigin允许所有的来源,所有的头文件,@RequestMapping注解中指定的HTTP方法和30分钟的maxAge。 您可以覆盖这些赋予注释属性值的设置:<br />   <table class="table table-bordered table-hover"> <tbody> <tr> <th>属性</th> <th>说明</th> </tr> <tr> <td><code>origins</code></td> <td>允许的来源列表. 他的值放置在HTTP协议的响应header的<code>Access-Control-Allow-Origin</code> .<br /> – <code>* </code>– 意味着所有的源都是被允许的。<br /> – 如果未定义,则允许所有来源。</td> </tr> <tr> <td><code>allowedHeaders</code></td> <td>实际请求期间可以使用的请求标头列表. 值用于预检的响应header Access-Control-Allow-Headers。<br /> – <code>* </code>– 意味着允许客户端请求的所有头文件。<br /> – 如果未定义,则允许所有请求的headers。</td> </tr> <tr> <td><code>methods</code></td> <td>支持的HTTP请求方法列表。 如果未定义,则使用由RequestMapping注释定义的方法。</td> </tr> <tr> <td><code>exposedHeaders</code></td> <td>浏览器允许客户端访问的响应头列表。 在实际响应报头Access-Control-Expose-Headers中设置值。<br /> – 如果未定义,则使用空的暴露标题列表。</td> </tr> <tr> <td><code>allowCredentials</code></td> <td>它确定浏览器是否应该包含与请求相关的任何cookie。<br /> – <code>false</code> – cookies 不应该包括在内。<br /> – <code>""</code> (空字符串) – 意味着未定义.<br /> – <code>true</code> – 预响应将包括值设置为true的报头Access-Control-Allow-Credentials。<br /> – 如果未定义,则允许所有凭据。</td> </tr> <tr> <td><code>maxAge</code></td> <td>预响应的高速缓存持续时间的最大时间(以秒为单位)。 值在标题Access-Control-Max-Age中设置。<br /> – 如果未定义, 最大时间设置为1800秒(30分钟).</td> </tr> </tbody> </table> <h3>1.1@CrossOrigin Class/Controller Level</h3> <pre> <code class="language-java">@CrossOrigin(origins = "*", allowedHeaders = "*") @Controller public class HomeController { @GetMapping(path="/") public String homeInit(Model model) { return "home"; } }</code></pre> <h3>1.2@CrossOrigin at Method Level</h3> <pre> <code class="language-java">@Controller public class HomeController { @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping(path="/") public String homeInit(Model model) { return "home"; } }</code></pre> <h3>1.3 @CrossOrigin Overridden at Method Level</h3> homeInit()方法只能从域http://example.com访问。 其他方法在HomeController中将可以从所有域访问。 <pre> <code class="language-java">@Controller @CrossOrigin(origins = "*", allowedHeaders = "*") public class HomeController { @CrossOrigin(origins = "http://example.com") @GetMapping(path="/") public String homeInit(Model model) { return "home"; } }</code></pre> <h2>二.Spring框架全局CORS 配置</h2> <h3>2.1Spring MVC CORS 使用WebMvcConfigurerAdapter配置</h3> 要为整个应用程序启用CORS,请使用<code>WebMvcConfigurerAdapter</code> 添加 <code>CorsRegistry</code>。 <pre> <code class="language-java">@Configuration @EnableWebMvc public class CorsConfiguration extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedMethods("GET", "POST"); } }</code></pre> <h3>2.2Spring Boot CORS 使用WebMvcConfigurer配置</h3> 在spring boot应用程序中,建议只声明一个<code>WebMvcConfigurer</code> bean。 <pre> <code class="language-java">@Configuration public class CorsConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }; } }</code></pre> <h3>2.3CORS 使用Spring Security配置</h3> 要通过Spring安全性启用CORS支持,请配置<code>CorsConfigurationSource</code> bean并使用<code>HttpSecurity.cors()</code> 配置。 <pre> <code class="language-java">@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and() //other config } @Bean CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("https://example.com")); configuration.setAllowedMethods(Arrays.asList("GET","POST")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } }</code></pre>
  • spring boot mybatis 整合_spring boot与mybaties的使用

    spring boot mybatis 整合使用讲解介绍,spring boot与mybaties的使用讲解介绍。spring boot mybatis xml mapper方式的入门和通过一个简单的例子带新手入门spring boot整合mybaties基本使用。本文主要讲解在Java编程中,spring boot mybatis xml mapper方式的入门和通过一个简单的例子带新手入门mybaties基本使用。<br /> 项目结构图: <div><img alt="项目结构图" class="img-thumbnail" src="/resources/assist/images/blog/fcb23b60-db2a-4cb6-b44f-663c8ed9c4ea.png" /><br /> 项目结构图<br /> <br /> 代码清单:<br /> <br /> spring boot配置文件application.properties: <pre> <code>#==================DataSource Config Start================== #name #spring.datasource.name=test #url #spring.datasource.url=jdbc:sqlserver://192.168.xxx.xxx;instanceName=sql_03;DatabaseName=edu;integratedSecurity=false spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 #DriverClass #spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource.driver-class-name=com.mysql.jdbc.Driver #DB username spring.datasource.username=root #DB password spring.datasource.password=root #==================DataSource Config End================== #==================mybaties Config Start================== #ORM Bean Package mybatis.type-aliases-package=com.leftso.pojo mybatis.mapper-locations=classpath:/mapper/*.xml #==================mybaties Config End ==================</code></pre> </div> <br /> spring boot log简单配置,用于打印sql日志logback-spring.xml: <pre> <code class="language-xml"><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <!-- 打印sql --> <logger name="com.leftso.mapper" level="DEBUG" /> </configuration></code></pre> <br /> <br /> mybaties Java config 配置MyBatiesConfig.java: <pre> <code class="language-java">package com.leftso.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; /** * mybaties配置扫描mapper路径 * * @author leftso * */ @Configuration @MapperScan(basePackages = { "com.leftso.mapper" }) /** 注意,这个注解是扫描mapper接口不是xml文件,使用xml模式必须在配置文件中添加xml的配置 **/ public class MyBatiesConfig { } </code></pre> <br /> 简单测试的用户pojo对象User.java: <pre> <code class="language-java">package com.leftso.pojo; /** * 用户 * * @author leftso * */ public class User { private Long id; private String userName; private int age; private String sex; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } } </code></pre> <br /> User对象的mapper接口:UserMapper.java: <pre> <code class="language-java">package com.leftso.mapper; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.leftso.pojo.User; @Component("userMapper") public interface UserMapper { // 新增 int add(User user); // 修改 int remove(Long id); // 删除 int update(User user); // 查一个 User findOne(Long id); // 查多个 List<User> findList(Map<String, Object> params); } </code></pre> <br /> mapper对应的xml文件UserMapper.xml: <pre> <code class="language-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.leftso.mapper.UserMapper"> <!-- 创建一个数据库user表与java中user对象关联的返回映射map --> <resultMap type="com.leftso.pojo.User" id="UserMap"> <id column="id" property="id" jdbcType="NUMERIC" /> <result column="user_name" property="userName" jdbcType="VARCHAR" /> <result column="age" property="age" jdbcType="NUMERIC" /> <result column="sex" property="sex" jdbcType="VARCHAR" /> </resultMap> <!-- 新增 --> <insert id="add" parameterType="com.leftso.pojo.User" useGeneratedKeys="true" keyProperty="id"> insert into t_user <trim prefix="(" suffix=")" suffixOverrides=","><!-- 说明:使用trim的方式组合sql,属性suffixOverrides表示去除末端多余的该属性值(这里是,) --> user_name, age, sex </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> #{name,jdbcType=VARCHAR}, #{age,jdbcType=NUMERIC},<!-- 说明:数字类型都是NUMERIC,没有INT,LONG类型;其他对应类型请参照mybaties官方文档 --> #{sex,jdbcType=VARCHAR} </trim> </insert> <!-- 删除 --> <delete id="remove" parameterType="java.lang.Long"> delete from t_user where id=#{id} </delete> <!-- 修改属性 --> <update id="update" parameterType="com.leftso.pojo.User"> update t_user <set> <trim suffixOverrides=","> <if test="null!=name and ''!=name"> user_name=#{name,jdbcType=VARCHAR}, </if> <if test="null!=age"> age=#{age,jdbcType=NUMERIC}, </if> <if test="null!=sex and ''!= sex"> sex=#{sex,jdbcType=VARCHAR}, </if> </trim> </set> where id=#{id,jdbcType=NUMERIC} </update> <!-- 查询一个 --> <select id="findOne" parameterType="java.lang.Long" resultMap="UserMap"> select * from t_user where id=#{id} </select> <!-- 查询多个 --> <select id="findList" parameterType="java.util.Map" resultMap="UserMap"> select * from t_user where 1=1 <if test="null!=name and '' != name"> and user_name like '%${name}%' </if> <if test=" sex != null and '' != sex"> and sex = #{sex} </if> <if test="age > 0"> and age <![CDATA[ >=]]>#{age} <!-- 说明:在xml里面大于小于大于等于需要逆转 --> </if> </select> </mapper></code></pre> <br /> 单元测试类: <pre> <code class="language-java">package com.leftso; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import com.leftso.mapper.UserMapper; import com.leftso.pojo.User; @RunWith(SpringRunner.class) @SpringBootTest public class ApplicationTests { Logger log = LoggerFactory.getLogger(getClass()); @Autowired UserMapper userMapper; // @Test public void add() { try { User user = new User(); user.setUserName("测试用户名"); user.setAge(25); user.setSex("男"); log.info("新增前ID:" + user.getId()); userMapper.add(user); log.info("新增后ID:" + user.getId()); } catch (Exception e) { e.printStackTrace(); } } // @Test public void remove() { try { userMapper.remove(2l); } catch (Exception e) { e.printStackTrace(); } } // @Test public void update() { try { User user = new User(); user.setId(3l); user.setUserName("我是修改"); user.setAge(2); userMapper.update(user); } catch (Exception e) { e.printStackTrace(); } } // @Test public void findOne() { try { User user = userMapper.findOne(3l); log.info("\nName:" + user.getUserName() + "\nAge:" + user.getAge() + "\nSex:" + user.getSex()); } catch (Exception e) { e.printStackTrace(); } } @Test public void findList() { try { Map<String, Object> params = new HashMap<String, Object>(); params.put("name", "我"); params.put("age", 3); List<User> list = userMapper.findList(params); for (User user : list) { log.info("\nName:" + user.getUserName() + "\nAge:" + user.getAge() + "\nSex:" + user.getSex()); } } catch (Exception e) { e.printStackTrace(); } } } </code></pre> <br /> 源码下载:<br /> GitHub:<a href="https://github.com/leftso/demo-spring-boot-mybaties3" rel="external nofollow" target="_blank">https://github.com/leftso/demo-spring-boot-mybaties3</a>