浅谈spring boot+MVC:
application.properties
server.port=10000//spring.data.mongodb.uri=mongodb://localhost:27017/db2
spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.username=rootspring.datasource.password=123456spring.datasource.url=jdbc:mysql://localhost:3306/db7?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
service:
注解:@service
@Service
public class UserServiceImpl implements UserService {
// @Autowired
private UserDao userDao = new UserMysqlDaoImpl();
@Override
public User insert(User user) {
return userDao.insert(user);
}
}
dao层数据库:
@Component
public class UserDaoImpl implements UserDao {
@Autowired //注入mongodb的使用
private MongoTemplate template;
@Override
public User insert(User user) {
//注意:这里的集合的名字
//如果是第一次添加会直接在数据库中创建一个与当前的模型一样名字的集合.
//第二次直接将数据添加到这个集合中
User user1 = template.save(user);
return user1;
}
//根据名字查询数据
public List<User> findUserByName(String name) {
Query query=new Query(Criteria.where("name").is("bing"));
//这里查找到后,会将数据库中数据删除
List<User> userlist = template.findAllAndRemove(query , User.class);
System.out.println("findUsers:"+userlist);
return userlist;
}
}
//@Component
public class UserMysqlDaoImpl implements UserDao {
@Autowired
private JdbcTemplate template;
@Override
public User insert(User user) {
int value = template.update("insert into user values (?,?,?,?)",user.getId(),user.getName(),user.getPassword(),user.getAge());
System.out.println("添加成功!"+value);
return null;
}
}
servlet
@RequestMapping
@RestController
@PostMapping
@GetMapping
@Autowired
private UserService userService;
private static Logger logger = Logger.getLogger(MongoDBController.class);
@RequestMapping("register")
public String insert(User user){
System.out.println("haha:"+user);
User user1 = userService.insert(user);
logger.info(user1);
return "恭喜:"+user1.getName()+",注册成功!";
}
注解功能:
1.生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等;
2.跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;
3.在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;
4.自定义注解:可以应用到反射中,如实现实体类某些属性不自动赋值,或者验证某个对象属性完整性等
1.applications.properties中
spring.data.mongodb.uri=mongodb://localhost:27017/db1
这里只需指定数据库,如果设置了账号,密码
spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test,其中name是用户名,pass是密码
如果要配置多个数据库,则中间用","分割,例如
spring.data.mongodb.uri=mongodb://192.168.1.1:20000,192.168.1.2:20000,192.168.252.12:20000/test
2.pom.xml中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
注意:这里不需要导入jdbctemplate依赖,我们直接使用mongodbtemplate
3.创建完整的mvc架构
--dao包
--controller包
--service包
--bean包
在bean中
注意:创建的模型中的字段要与数据库集合中的字段完全一致,否则会失败
对于id:private String id; //如果我们自己指定了id,集合中会用我们的,如果不指定,会自动生成.默认是id不是_id
在dao中
执行增加操作:
@Component
public class UserDaoImpl implements UserDao {
@Autowired //注入mongodb的使用
private MongoTemplate template;
@Override
public int insert(User user) {
//注意:这里的集合的名字
//如果是第一次添加会直接在数据库中创建一个与当前的模型一样名字的集合.
//第二次直接将数据添加到这个集合中
template.save(user);
return 0;
}
public List<User> findUserByName(String name) {
Query query=new Query(Criteria.where("name").is(name));
//这里查找到后,会将数据库中数据删除
List<User> userlist = template.findAllAndRemove(query , User.class);
System.out.println("findUsers:"+userlist);
return userlist;
}
public List<User> findUserByCollection(String CollectionName,String age) {
Query query=new Query(Criteria.where("age").is(age));
List<User> userlist = template.findAllAndRemove(query , User.class,CollectionName);
return userlist;
}
/**
* 根据用户名查询对象
* @param userName
* @return
*/
public User findUserByUserName(String userName) {
Query query=new Query(Criteria.where("name").is(userName));
User user = template.findOne(query , User.class);
return user;
}
/**
* 更新对象
* @param user
*/
public void updateUser(User user) {
Query query=new Query(Criteria.where("id").is(user.getId()));
Update update= new Update().set("name", user.getName()).set("age", user.getAge());
//更新查询返回结果集的第一条
template.updateFirst(query,update,User.class);
//更新查询返回结果集的所有
// template.updateMulti(query,update,User.class);
}
/**
* 删除对象
* @param id
*/
public void deleteUserById(String id) {
Query query=new Query(Criteria.where("id").is(id));
template.remove(query,User.class);
}
}
在controller中
@RestController
public class UserController {
@Autowired
private UserService service;
@RequestMapping(value = "/addUser",method = {RequestMethod.GET,RequestMethod.POST},produces = "application/json;charset=UTF-8")
public String getInfo(User user){
User user1 = new User();
user1.setName("shutong");
user1.setId("20");
user1.setAge("30");
user1.setSex("famale");
int result = service.insert(user1);
return "haha"+result;
}
@RequestMapping(value = "/findUserByName",method = {RequestMethod.GET,RequestMethod.POST},produces = "application/json;charset=UTF-8")
public String findUserByName(User user) {
System.out.println(user.getName());
List<User> list = service.findUserByName(user.getName());
System.out.println("成功!"+list);
return "";
}
@RequestMapping(value = "/updateUser",method = {RequestMethod.GET,RequestMethod.POST},produces = "application/json;charset=UTF-8")
public void updateUser(User user){
service.updateUser(user);
System.out.println("成功!");
}
@RequestMapping(value = "/deleteUserById",method = {RequestMethod.GET,RequestMethod.POST},produces = "application/json;charset=UTF-8")
public void deleteUserById(User user){
service.deleteUserById(user.getId());
System.out.println("成功!");
}
@RequestMapping(value = "/findUserByCollection",method = {RequestMethod.GET,RequestMethod.POST},produces = "application/json;charset=UTF-8")
public String findUserByCollection(User user){
service.findUserByCollection("user",user.getAge());
System.out.println("成功!");
return "";
}
}
测试:
在浏览器中输入 http://localhost:8888/addUser
http://localhost:8888/deleteUserById?id=20
进行测试
a:安装好数据库,创建好表
b:设置springboot
1)导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot整合jdbctemplate -->
jdbctemplate的可以暂时不用导入,springboot的web包中有默认的
<!-- mysql的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2)使用jdbctemplate访问数据库
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private JdbcTemplate jdbcTemplate;
public int insert(Emp emp){
int value = jdbcTemplate.update("insert into emp set empno=?,ename=?,job=?",emp.getEmpno(),emp.getEname(),emp.getJob());
System.out.println("添加成功!");
return value;
}
}
<?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>
<parent><!-- 父工程用于管理依赖包的版本等信息 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- GAV -->
<groupId>sbGrouop</groupId>
<artifactId>com.qf.bike</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>com.qf.bike</name>
<description>Demo project for Spring Boot</description>
<!-- javajdk版本 -->
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 添加的依赖,注意虽然我们只添加了几个依赖,但是我们有依赖传递,他会自动将相关的包都导入进来 -->
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
<!-- 建立的工程是基于maven的 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
spring boot注解
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
@SpringBootApplication:申明让spring boot自动给程序进行必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。
@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration 自动配置。
@ComponentScan 组件扫描,可自动发现和装配一些Bean。
@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
@ResponseBody:表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。示例代码:(json数据)
@RequestMapping(“/test”)
@ResponseBody
public String test(){
return”ok”;
}
@Autowired自动导入。
@PathVariable获取参数。
@JsonBackReference解决嵌套外链问题。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
@Controller:用于定义控制器类,在spring 项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。示例代码:
@Controller
@RequestMapping(“/demoInfo”)
publicclass DemoController {
@Autowired
private DemoInfoService demoInfoService;
@RequestMapping("/hello")
public String hello(Map<String,Object> map){
System.out.println("DemoController.hello()");
map.put("hello","from TemplateController.helloHtml");
//会使用hello.html或者hello.ftl模板进行渲染显示.
return"/hello";
}
}
@RestController:用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。示例代码:
package com.kfit.demo.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(“/demoInfo2”)
publicclass DemoController2 {
@RequestMapping("/test")
public String test(){
return"ok";
}
}
@PathVariable :
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
@RequestBody和@RequestParam
两个注解都是用于方法中接收参数使用的,两者也有一定的区别。
@RequestBody这个一般处理的是在ajax请求中声明contentType: “application/json; charset=utf-8”时候。也就是json数据或者xml(我没用过这个,用的是json)
@RequestParam这个一般就是在ajax里面没有声明contentType的时候,为默认的。。。urlencode格式时,用这个。
@RequestBody可以直接将页面中的参数封装成实体类中的数据传输给后天
@PostMapping @GetMapping @RequestMapping
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
@PostMapping是一个非 组合注解,需要自定义请求方式。
@RestController和@Controller
RestController相当于Controller+ResponseBody注解
如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 ,也就是相当于在方法上面自动加了ResponseBody注解,所以没办法跳转并传输数据到另一个页面,所以InternalResourceViewResolver也不起作用,返回的内容就是Return 里的内容,即数据直接甩在当前请求的页面上,适用于ajax异步请求。