随堂笔记第二阶段

一、数据库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 {  }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值