一、springboot
1、概念:前后端交互用的,运行后不会停止,除非手动停止。
通过注解的方式实现前后端数据的传输。
spring会自动扫描包下面的所有的类,如果这个类上面有注解,spring会通过反射创建当前类的对象(做了实例化创建)
2、注解1:通过注解把后台数据返回个前端页面
(1)RestController:通过反射把一个类和一个ip地址绑定(本地ip地址http://localhost:8080),把返回值当做数据传输给前端。
(2)GetMaping(“/str”):映射一个类中的方法,如果想运行该类中的方法,在ip地址后加上/str
@RestController
public class TestController {
public TestController() { //无参构造方法,spring自动对注解的类进行实例化对象
System.out.println("实例化");
}
@GetMapping("/test")
public String test(){
return "ok";
}
@GetMapping("/show")
public String show(){
return "show";
}
}
spring会把kv(HashMap,list,自定义的类...)自动转化为json数据
3、注解2:注解后通过后台返回到一个前端页面
@controller:把返回值当做映射关系—去查找项目中有没有一个页面名字和返回值相同。
在templates目录下创建html文件
@Controller
public class HTMLController {
@GetMapping("/login")
public String login(){
return "login";
}
}
并在application.properties下配置一下
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
在pom.xml文件下下一个插件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
@controller注解的类中,只能映射页面,在方法上@getMaping下加上@ResponseBody表示返回值是数据,不是映射页面了。
二、mvc框架
1、各个分层结构
表现层(presentation):前后端交互 代码中包名通常为为controller
业务层(business) :查询数据库的代码(service)
持久层(persistence) :查询数据之前 前后端交互之后的逻辑判断(判断用户名和密码是否符合规则)(dao)
数据库(database)
这其实也是最常见的 MVC 架构了。
2、面向接口开发
接口 API 数据接口:spring中加了注解的方法
spring中加了注解的方法:会绑定一个前端的地址,所有人都可以访问
1.为了保证数据的安全性,应该给API加个验证 String key
@GetMapping("/API/login") public String login(String username,String password,String key){}
面向接口开发->分层
3、连接池导包
连接池:提供'接口'用于连接数据库,可以提供指定数量的连接'接口',当用户使用多于'接口'数量时,其他用户处于等待状态。
普通连接数据库时,在程序运行过程中,若连接断开,运行报错,只能关闭程序,重新连接,
而连接池,可以不用关闭程序,可以自动重新连接。
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
(1)dbcp建立连接池
import org.apache.commons.dbcp.BasicDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Demo01DBCP {
public static void main(String[] args) throws Exception {
/**
* 1.创建线程池
* 2.指定连接属性
*/
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUrl("jdbc:mysql://master:3306/shujia");
basicDataSource.setUsername("root");
basicDataSource.setPassword("123456");
/**
* 创建连接池中,连接数量为2
*/
basicDataSource.setInitialSize(2);
/**
* 允许每个连接的最大连接数量,总共能连接10下,可以在连接过后关闭连接,可以使后面的连接不在等待。
*/
basicDataSource.setMaxActive(5);
/**
* 超时时间
*/
basicDataSource.setMaxIdle(10);
Connection conn = basicDataSource.getConnection();
String sql = "select * from user";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
conn.close();
}
}
(2)c3p0建立连接池
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Demo02C3P0 {
public static void main(String[] args) throws Exception {
/**
* 1.创建连接池
* 2.指定连接信息
*/
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://master:3306/shujia");
ds.setUser("root");
ds.setPassword("123456");
ds.setInitialPoolSize(2);
Connection conn = ds.getConnection();
String sql = "select * from user";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
}
}