1.注册驱动
2.获取连接
static Connection
getconnection (string url,string user,string password)
参数
url:连接路径
语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对
2示例: jdbc:mysql://127.0.0.1:3306/db1
细节:
如果连接的是本机mysql服务器,并且mysqlI服务默认端口是3306,则uri可以简写为: jdbc:mysql.//数据库名称?参数键值对
·配置useSSL=false参数,禁用安全连接方式,解决警告提示
user:用户名
password:密码
//2.获取连接:如果连接的是本机mysql并且端口是默认的3306可以简化书写
String url = "jdbc:mysql:///db1?useSSL=false";
·预编译SQL的执行SQL对象:防止SQL注入PreparedStatement prepareStaltement (sql)
·执行存储过程的对象CallableStatement prepareCall (sql)
MySQL默认自动提交事务
. JDBC事务管理:Connection接口中定义了3个对应的方法
举例
try{
conn.setAutocommit(false);
conn.commit();
}catch (Exception throwables) {
//回滚事务
conn.rollback();
throwables.printStackTrace();
}
.Statement作用:
1.执行SQL语句
·执行SQL语句
int executeUpdate(sql):执行DML、DDL语句
返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql):执行DQL语句
返回值: ResultSet结果集对象
. ResultSet(结果集对象)作用:
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
·获取查询结果
boolean next(): (1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行
返回值:
true:有效行,当前行有数据.
false:无效行,当前行没有数据
xxxgetXxx(参数):获取数据
XXX:数据类型;如: int getInt(参数); String getString(参数)参数:
.int:列的编号,从1开始
. String:列的名称
. PreparedStatement作用:
1.预编译SQL语句并执行:预防SQL注入问题
. SQL注入
.SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
- 获取PreparedStatement 对象
//SQL语句中的参数值,使用?占位符替代
String sql = “select * from user where username = ? and password = ?”;
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
- 设置参数值
PreparedStatement对象: setXxx(参数1,参数2):给﹖赋值
Xxx:数据类型;如setlnt(参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:? 的值
- 执行SQL
executeUpdate(); / executeQuery();:不需要再传递sql
//定义sql
String sql = "select * from tb_user where username = ? and password = ?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置?的值
pstmt.setString( parameterIndex: 1, name);
pstmt.setString( parameterIndex: 2, pwd);
//执行squl
Resultset rs= pstmt.executeQuery();
数据库连接池简介
打印当前的路径System.out.println(System.getProperty(“user.dir”));
Driud使用步骤
. Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
提供了一套标准化的项目结构
提供了一套标准化的构建流程(编译,测试,打包,发布…….)
提供了一套依赖管理机制
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:
如果有,则在项目直接引用;
如果没有,则去中央仓库中下载对应的jar包到本地仓库。
Maven生命周期
Maven构建项目生命周期描述的是一次构建过程经历经历了多少个事件Maven对项目构建的生命周期划分为3套
clean:清理工作
default:核心工作,例如编译,测试,打包,安装等>site:产生报告,发布站点等
什么是MyBatis?
MyBatis是一款优秀的持久层框架,用于简化JDBC开发
MyBatis本是 Apache的一个开源项目iBatis, 2010年这个项目由apache softwarefoundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github官网: https://mybatis.org/mybatis-3/zh/index.html
持久层
负责将数据到保存到数据库的那一层代码JavaEE三层架构:
表现层、业务层、持久层
框架
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
心
在框架的基础之上构建软件编写更加高效、规范、通用、
可扩展
查询user表中所有数据
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
2.设置SQL映射文件的namespace属性为Mapper接口全限定名
3.在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值
类型一致
4.编码
数据库表的字段名称和实体类的属性名称不一样,则不能自动封装数据
起别名:对不一样的列名起别名,让别名和实体类的属性名一样
缺点:每次查询都要定义一次别名
sql片段
缺点:不灵活
*参数占位符:
1.#{∶会将其替换为?,为了防止SQL注入
2.$:拼sql。会存在SQL注入问题I
2.parameterType:
用于设置参数类型,该参数可以省略
3.SQL语句中特殊字符处理:
查询:@Select添加:@Insert修改:@Update删除:@Delete
c注解完成简单功能配置文件完成复杂功能
JavaWeb技术栈
B/S架构: Browser/Server,浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可
静态资源:HTML、CSS、JavaScript、图片等。负责页面展现
动态资源: Servlet、JSP等。负责逻辑处理
数据库:负责存储数据
HTTP协议:定义通信规则
Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据
1.基于TCP协议:面向连接,安全
2.基于请求-响应模型的:一次请求对应一次响应
3. HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
·缺点:多次请求间不能共享数据。
优点:速度快
请求数据分为3部分:
1.GET请求请求参数在请求行中,没有请求体。
POST请求请求参数在请求体中
2.GET请求请求参数大小有限制,POST没有
响应数据分为3部分:
1.响应行:响应数据的第一行。其中HTTP/1.1表示协议版
本,200表示响应状态码,OK表示状态码描述
2.响应头:第二行开始,格式为key: value形式3.响应体:最后一部分。存放响应数据
常见的HTTP响应头:
Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
Servlet由web服务器创建,Servlet方法由web服务器调用。
因为我们自定义的Servlet,必须实现servlet接口并复写其
方法,而servlet接口中有service方法
Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
Servlet urlPattern配置
Servlet要想被访问,必须配置其访问路径(urlPattern)
1.一个Servlet,可以配置多个urlPattern
@WebServlet(urlPatterns = { "/demo1", " /demo2"})
2.urlPattern配置规则
/和/*区别:
当我们的项目中的Servlet配置了“/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet
当我们的项目中配置了“/*”,意味着匹配任意访问路径
Request 获取请求数据
请求数据分为3部分:
1.请求行:
GET /request-demo/req1?username=zhangsan HTTP/1.1
. String getMethod():获取请求方式:GET
. String getContextPath():获取虚拟目录(项目访问路径): /request-demo
. StringBuffer getRequestURL():获取URL(统一资源定位符):
http:;//localhost:8080/request-demo/req1
. String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
. Strina qetQueryString():获取请求参数(GET方式): username=zhangsan&password=123
2.请求头:
User-Agent: Mozilla/5.0 Chrome/91.0.4472.106
. String getHeader(String name):根据请求头名称,获取值
3.请求体:
username=superbaby&password=123
. ServletInputStream getlnputStream():获取字节输入流.BufferedReader getReader():获取字符输入流
. Map
. String[ ] getParameterValues(String name):根据名称获取参数值(数组)
. String getParameter(String name):根据名称获取参数值(单个值)
//1.解决乱码:POST. getReader ()
request.setcharacterEncoding(“UTF-8”);/设置字符输入流的编码
//2.获取username
String username = request.getParameter( name: “username” );system.out.println(username);
//3.转换为字节数据,编码
byte[ ] bytes = decode.getBytes( charsetName: “ISO-8859-1”);for (byte b : bytes) {
system.out.print(b + " ");}*/
//4.将字节数组转为字符串,解码
string s = new string(bytes,charsetName: “utf-8”);
system.out.println(s);
//3. GET,获取参数的方式: getQuerystring
乱码原因: tomcat进行URL解码,默认的字符集IS0-8859-1
通用:
//3.1先对乱码数据进行编码:转为字节数组
byte[] bytes = username.getBytes(StandardCharsets.IS0_8859_1);
//3.2字节数组解码
username = new string(bytes,standardCharsets.UTF_8);
system.out.println(“解决乱码后:”+username);
请求转发(forward):一种在服务器内部的资源跳转方式
实现方式:
req.getRequestDispatcher(“资源B路径”).forward(req,resp);请求转发资源间共享数据:使用Request对象
void setAttribute(String name, Object o):存储数据到request域中
心
Object getAttribute(String name):根据key,获取值
void removeAttribute(String name):根据key,删除该键值对
是一个用于唯一标识和定位网络资源的地址。它是一个字符串形式的网址,用于在互联网上定位到特定的资源。URL由多个部分组成,包括协议、主机名、端口、路径和查询参数等。
URL的格式通常如下:
protocol://hostname[:port]/path?query
例如,URL “https://www.example.com:8080/products?category=electronics” :
响应数据分为3部分:
1.响应行:HTTP/1.1200 OK
void setStatus(int sc):设置响应状态码
2.响应头:
Content-Type: text/html
void setHeader(String name, String value):设置响应头键值对
3.响应体:
head>
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
重定向
1.设置响应状态码302response.setstatus(302);
2.设置响应头 Location
response.setHeader( “Location” , " /request-demo/resp2" ) ;
/简化方式完成重定向
response.sendRedirect( location: “/request-demo/resp2”);
重定向特点:
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部、外部均可)两次请求,不能在多个资源使用request共享数据
注意:
·该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
·中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
resp.setContentType("text/html;charset=utf-8");
JSP快速入门
1.导入JSP坐标
2.创建JSP文件
3.编写HTML标签和Java代码
JSP原理
概念: Java Server Pages,Java服务端页面
JSP = HTML + Java,用于简化开发的
JSP本质上就是一个 Servlet
JSP脚本用于在JSP页面内定义Java代码JSP脚本分类:
<%…%>:内容会直接放到_jspService()方法之中
<%=…%>:内容会放到out.print()中,作为out.print()的参数
<%!.…%>:内容会放到_jspService()方法之外,被类直接包含
由于JSP页面内,既可以定义HTML标签,又可以定义Java代码,造成了以下问题:
1.书写麻烦:特别是复杂的页面
2阅读麻烦
3.复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE…
4.占内存和磁盘:JSP会自动生成java和.class文件占磁盘
运行的是.class文件占内存
5.调试困难:出错后,需要找到自动生成的.java文件进行调试
6.不利于团队协作:前端人员不会Java,后端人员不精HTML7…
Expression Language表达式语言,用于简化JSP页面内的Java代码
主要功能:获取数据
语法:
${expression}${brands}︰获取域中存储的key为brands的数据
JavaWeb中的四大域对象:
1.导入坐标
jstl
jstl
1.2
taglibs
standard
1.1.2
2.在JSP页面上引入JSTL标签库
<%@taglib prefix="c" uri="http://java.sun.com/jspljstl/core"%>
3.使用
:相当于for循环
items:被遍历的容器
var:遍历产生的临时变量
MVC是一种分层开发的模式,其中:
M: Model,业务模型,处理业务
V: View,视图,界面展示
C: Controller,控制器,处理请求,调用模型和视图
创建新的模块 brand_demo,引入坐标
创建三层架构的包结构
数据库表tb_brand
实体类 Brand
MyBatis 基础环境
.Mybatis-config
. xmlBrandMapper. xml.
Br andMapper接口
是写在xml文件里面吗
如何配合注解使用
是的,标签是写在MyBatis的映射文件(通常是以.xml为扩展名的文件)中的。
要配合注解使用标签,可以在注解中引用映射文件中定义的标签。
首先,在映射文件中定义标签:
```xml
然后,在注解中使用@ResultMap注解引用上述的
标签:
// UserMapper.java
@Select("SELECT * FROM users")
@ResultMap("com.example.mapper.UserMapper.userResultMap")
List<User> getUsers();
在这个例子中,@ResultMap注解引用了映射文件中id为"userResultMap"的
标签。它告诉MyBatis使用这个结果映射来将查询结果映射到User对象上。
通过这种方式,可以将注解和映射文件中定义的
标签结合起来使用,以获取更灵活的映射配置方式。
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享
实现方式:
1.客户端会话跟踪技术:Cookie
2.服务端会话跟踪技术: Session
创建
1. 创建Cookie对象,设置数据
Coqkie cookie = new Cookie("key" ,"value");
2.发送Cookie到客户端:使用response对象
response.addCookie(cookie);
获取
3.获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
4.遍历数组,获取每一个Cookie对象: for5.使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
Cookie的实现是基于HTTP协议的
响应头: set-cookie
请求头: cookie
Cookie存活时间
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
setMaxAge(int seconds):设置Cookie存活时间
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
使用:
1.获取Session对象
HttpSession session = request.getSession();2. Session对象功能:
void setAttribute(String name, Object o):存储数据到session域中Object getAttribute(String name):根据key,获取值
void gemoveAttribute(String name):根据key,删除该键值对
Session钝化、活化:
服务器重启后,Session中的数据是否还在?
钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到Session中
Cookie和Session都是来完成一次会话内多次请求间数据共享的区别:
存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
安全性:Cookie 不安全,Session安全
数据大小: Cookie 最大3KB,Session无大小限制·
存储时间:Cookie可以长期存储,Session默认30分钟
服务器性能:Cookie不占服务器资源,Session占用服务器资源
概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作,
比如:权限控制、统一编码处理、敏感字符处理等
概念: Listener表示监听器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
监听器可以监听就是在application,session,tequest
三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件
Listener分类: JavaWeb中提供了8个监听器
概念:AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XMLAJAX作用:
1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据
使用了AJAX和服务器进行通信,就可以使用HTML+AJAX来替换JSP页面了
2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术
如∶搜索联想、用户名是否可用校验,等等.
1.编写AjaxServlet,并使用response输出字符串
2.创建XMLHttpRequest对象:用于和服务器交换数据
var xmlhttp;
if (window.XMLHttpRequest){
// code for lE7+, Firefox, Chrome, Opera, Safarixmlhttp = new XMLHttpRequest();
}else {
//code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
3.向服务器发送请求
xmlhttp.open("GET","url");
xmlhttp.send();//发送请求
4.获取服务器响应数据
xmlhttp.onreadystatechange = function (){
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
alert(xmlhttp.responseText);
}
}
概念: JavaScript Object Notation。JavaScript 对象表示法
由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输
Fastjson是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库,是目前Java语言中最快的JSON库,可以实现Java对象和JSON字符串的相互转换。
使用:
1.导入坐标
<dependency>
<groupld>com.alibabagroupld>
<artifactld>fastjsonartifactld>
<version>1.2.62version>
<ldependency>
2.Java对象转JSON
String jsonStr = JSON.toJSONString(obj);
3.JSON字符串转Java对象
User user = JSON.parseObject(jsonStr, User.class);
Vue是一套前端框架,免除原生JavaScript中的DOM操作,简化书写
基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上
官网: https://cn.vuejs.org
v-bind
为HTML标签绑定属性值,如设置href , css样式等
v-model
在表单元素上创建双向数据绑定
1.引入Element的css、js文件和Vue.js
<script src="vue.js"></script>
<script src="element-ui/lib/index.js"></script>
<link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
2.创建Vue核心对象
<script>
new Vue({
el:"#app"})
</script>
3.官网复制Element组件代码