一、数据库Mysql
增删改查
create(table)
select(from)
insert(into)
update(set)
delete
怎么书写高质量 SQL
1、查询 SQL 尽量不要使用 select *,而是 select 具体字段。
2、如果知道查询结果只有一条或者只要最大/最小一条记录,建议用 limit 1
3、应尽量避免在 where 子句中使用 or 来连接条件,这样会全表扫描
4、优化你的 like 语句,把%写在后边
5、尽量避免在索引列上使用 mysql 的内置函数
6、应尽量避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫
7、关联查询 Inner join 、left join、right join,优先使用 Inner join,如果是 left join,左边表结果尽量小
8、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
9、使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则
10、如果插入数据过多,考虑批量插入
二、JDBC
六部曲:
1+2:获取字节码对象+通过用户名和密码获取连接器
Collection c = JDBCUtils.getConnection();
3.创建SQL语句,交于字符串类型保存sql值 String sql = "SQL语句";
4.获取传输器:PreparedStatement p = c.PreparedStatement(sql)
5.执行SQL语句:1)查询:resultSet r = p.executeQuery(sql) if(r.next()){ }else{ }
2)增删改:int row = p.executeUpdate();
6.释放资源 close();
优化:
将1和2步骤的重复代码放到一个单独类中,便于之后直接调用
问题:
SQL攻击:特殊符号#等的出现,导致SQL语义发生改变,注释掉了后面的条件
解决方案:替换传输器 Statement这种低级低效不安全的传输器
使用新的传输器PreparedStatement(sql)高级安全的
SQL骨架:用?代替参数的位置,?叫做占位符
String sql = "select * from tb_user where name=? and password=?";
先执行SQL骨架,再给SQL依次给参数赋值
s.setString(1,a);给第一个?设置值a
s.setString(2,b);给第二个?设置值b
executeQuery():用来执行查询SQL语句,且返回结果集ResultSet;
executeUpdate():用来执行增删改的SQL语句,且返回影响的行数;
.close()用来释放资源。
三、前端(了解)
html
css
JavaScript
VUE
开发工具:前端--HBuilderX,后端--idea;
项目管理:前端--npm,webpack; 后端--Maven,SpringBoot;
web中间件:前端--NodeJS, 后端--Tomcat
四、三大框架SSM
1.Maven: 发明pom模型(project object model)pom.xml
四大特征:1)仓库repository---中央仓库、镜像仓库、本地仓库
2)依赖dependency:每个核心jar包形成一个依赖,maven底层进行它相关的jar的自 动导入
<dependency>
<groupId>mysql</groupId>//分组
<artifactId>mysql-connector-java</artifactId>//项目or模块
<version>5.1.32</version>//版本
</dependency>
3)坐标coorinate 唯一标识
4)命令mvn cmd
2.SpringBoot 是Maven的延伸
创建独立的Spring应用程序
嵌入了Tomcat 自动配置Spring
相关注解:@SpringBootApplication启动服务器
3.SpringMVC:
Spring框架提供了构建Web应用程序的全功能MVC模块(Model View Controller)
数据处理模型(Model),POJO就是Model层
相关注解:类上--@RestController 类里方法外--@RsquestMapping("")
五、工作原理
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回给ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
经典的业务请求过程:
前端页面发起请求,访问SpringMVC框架的控制层,SpringMVC框架解析请求,找到要调用的Controller,找到其中的方法,同时把请求提交的参数封装到java对象中;之后控制层把请求传递给Spring框架的service业务层,service业务层把请求传递给Mybatis框架的Mapper持久层,Mapper访问MySQL数据库进行数据库表的查询,将查询结果返回给Mapper层,Mapper-->Service层-->Controller,控制层把java数据转换成json字符串,返回给ajax调用,ajax进行回调并把json字符串转换为js对象,再在页面中可以通过js/vue解析js对象,最终把数据展示到html页面中。
六、处理请求参数的方式
1.Get方式访问:
类似于此链接:http://localhost:8080/car/obj?id=100&name=BMW&color=red
2.优化GET传参的restful方式:
http://localhost:8080/car/insert/1/张三/18
restful配合@PathVariable(标识接收单个参数)注解一起用,使用{资源名}获取传过来的值
3.处理Post请求的参数:表单提交
七、Demo
1.Springmvc的服务器启动
@SpringBootApplication
public class RunApp{
public static void main(String[] args){
SpringApplication.run(RunApp.class,args)
}
}
2.Student类用来封装数据,记录数据的(pojo层)
public class Student{
private String user;
private Integer age;
private Integer sex;
private String[] hobby;//此数据是多选框,有多值且是字符串,因此定义为引用类型数组
private Integer edu;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date intime;
public String setUser(String user){ this.user = user;}
public String getUser(){ return user;}
public String setAge(String age){ this.age = age;}
public String getAge(){ return age;}
public String setSex(String sex){ this.sex = sex;}
public String getSex(){ return sex;}
public String setHobby(String hobby){ this.hobby = hobby;}
public String getHobby(){ return hobby;}
public String setEdu(String edu){ this.edu = edu;}
public String getEdu(){ return edu;}
public Date getIntime() { return intime;}
public void setIntime(Date intime) { this.intime = intime;}
@Override
public String toString(){
return "Student{"+"User=' "+user+'\''+",age="+age+",sex="+sex+",
hobby='+Arrays.tostring(hobby)+",edu="+edu+",intime="+intime+'}';
}
}
3.StudentController控制层
@RestController
@RsquestMapping("student")
public class StudentController{
@RequestMapping("save")
public String save(Student s) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
String user="root";
String pwd="root";
Connection c = DriverManager.getConnectiion(url,user,pwd);
String sql="insert into tb_students values(null,?,?,?,?,?,?);
PreparedStatement ps = c.PrepareStatement(sql);
ps.setString(1,s.getUser());
ps.setObject(2,s.getAge());
ps.setObject(3,s.getSex());
ps.setObject(4,Arrays.toString(s.getHobby()));
ps.setObject(5,s.getEdu());
ps.setObject(6,getIntime());
ps.ExecuteUpdate();
System.out.println("数据入库成功");
return "访问成功"+s;
}
}
八、Spring工程四大特点
1.修改服务器的端口号(默认的是8080)
在resources里面创建application.yml文件(文件名固定)
server:
port: 6666
2.创建配置文件spring.xml
1)IOC控制反转 Spring框架会帮你创建对象,你来获取对象
有两种创建对象的方式:
a: bean标签
<bean id="hello" class="cn.tedu.spring.Hello"></bean>
其中key是id的值(类名) value是通过反射创建的对象
b: 包扫描机制
只要在扫描范围内的包且添加了spring提供的@Component注解
<context:component-scan base-package="cn.tedu.spring"></context:component-scan>
其中base-package是指定包的路径
测试的步骤一就是读取配置文件
ClassPathXmlAoolicationContext spring = new ClassPathXmlAoolicationContext("spring.xml");
步骤二是获取对象
spring.getBean("类名小写")
3.DI依赖注入
是描述两个类之间的依赖的关系,把对方当做成员变量
@Autowired
对方类名 对象名;
可以直接使用依赖的对方来调用其对象的属性和方法
4.AOP面向切面编程
提取共性代码形成切面Aspect类 聚焦了程序员的关注点,只关注业务本身.
使用步骤
1)添加jar包的坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2)创建切面类,在类外需添加2个注解@Component、@Aspect
由通知(就是方法) 和 切点组成
//切点:什么时候要触发通知的功能
//方法返回值 包名 类名 方法名(参数列表)
@Pointcut("execution(* cn.tedu.controller.*.*(..))")
public void pointcut(){ }
i: 前置通知,在调用目标方法前 触发执行
@Before("pointcut()")
ii: 这是后置通知,在调用目标方法后 触发执行
@After("pointcut()")
public void afterMethod(JoinPoint joinPoint){ }
iii: @Around("pointcut()")
public Object aroundMethod(ProceedingJoinPoint joinPoint)
throws Throwable { }