sql注入问题:
通过特殊字符串,改变原有sql语义
PreparedStatement 作用:执行预编译sql,解决sql注入问题
使用
获取PreparedStatement对象
Connection: preparedStatement(String sql);
给占位符赋值
PreparedStatement: setXxx(编号,值)
执行sql
executeUpdate
executeQuery
事物管理
setAutoCommit(false):开启事物
commit():提交事物
rollback():回滚事物----写在catch代码块中
数据库连
概念:存放数据库连对象的容器
作用:提高程序的效率:当程序一启动是,就创建一些连对象保存在容器中,
那么如果要使用连,从池子中拿即可,而不需要重新创建,使用完毕,归还到池子,
不需要释放资源
实现方式:C3p0 druid
标准接口:DatrSource
JDBCTemplate
概念:是spring提供的一个框架,对jdbc做了封装,为了简化书写
使用:
导包
创建对象
调用方法
方法
update(String sql, Object…args)
query(String sql,RowMapper rowMapper, Object…args)
queryForObject(String sql,RowMapper rowMapper, Object…args)
迭代器和列表迭代器
我们在使用List,Set的时候,为了实现其对数据的遍历,我们经常使用到了Iterator(迭代器).
listIterator继承自Iterator
Iterator迭代器仅有三个方法,分别是hasNext()、next()和remove(),能够实现顺序遍历和元素的删除
而ListIterator迭代器除了实现上面Iterator的功能外,还可以通过add()方法添加元素:
1.ListIterator只能用于List,Iterator是通用的
2.Iterator容易引起并发修改异常问题,而ListIterator可以避免线程安全问题的发生,因为其有内置的add()等修改集合的方法。
Iterator和ListIterator的联系和区别主要有:
一、ListIterator有add()方法,可以向List中添加对象,而Iterator不能。
二、ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历。但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
三、ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator 没有此功能。
四、都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。
io流序列化和反序列化
对象序列化:就是将对象保存在磁盘中,或者在网络中传输对象
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
注意事项:
一个对象要想被序列化,该对象所属的类必须必须实现Serializable 接口
Serializable是一个标记接口,实现该接口,不需要重写任何方法
构造代码块作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
构造代码块和构造函数的区别:
构造代码块是给所有不同对象的共性进行统一的初始化,构造函数是给对应的对象进行初始化
子类继承父类中,构造方法不能被子类继承,
子类创建对象时,会先去创建父类的对象,默认会去调用父类的无参构造方法
当父类没有无参构造方法时.必须使用this或者super调用其他的构造方法
自定义类中,如果不写构造方法,Java系统会默认自动添加一个无参的构造方法,建议一般情况下,我们都会手动给出无参构造方法
单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
介绍
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用实例:
1、一个班级只有一个班主任。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
1、要求生产唯一序列号。
2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。
WEB 概念描述:
javaweb:使用Java语言开发基于互联网的项目
软件架构:
c/s:Cliect/server:客户端/服务器端 在用户本地有一个客户端程序,在远程有一个服务器端程序
优点:用户体验好
缺点:开发.安装,部署,维护麻烦
b/s:Browser/Server:浏览器/服务器端 只需要一个浏览器,用户通过不同的网址(URL),客户访问不同的服务器端程序
优点:开发,安装,部署,维护简单
缺点:1,如果应用过大,用户的体验可能会受到影响 2,对硬件的要求过高
b/s架构详解:
资源分类:
静态资源:使用静态网页开发技术发布的资源 所有人看到的效果都一样
注:HTML(搭建网页框架) CSS(美化网页,控制HTML元素的样式) JavaScript(让网页动起来) 文本,图片,视频,音频
动态资源:使用动态网页技术发布的资源 不同的人看到的效果可能不一样
注:jsp servlet PHP asp
浏览器只能显示静态资源,如果有动态资源,那么服务器需要先把动态资源转换成静态资源,浏览器才能显示;
HTML:最基础的网页开发语言,
Hyper Text Markup Language 超文本标记语言
超文本(富文本:超级文本:不仅仅可以存放字符串,还可以放音频、视频、图片)标记(标签)语言;
标签都是预定义的;
标签学习
语法:
标签:围堵标签/自闭合标签
不区分大小写
后缀名:.htm/.HTML
属性写在开始标签内:属性名=“属性值”
1,文件标签:构成html最基本的标签
html:HTML文档的跟标签
head:投标签,引入外部的资源
title:标题标签
body:体标签
<!DOCTYPE html>:html5中定义该文档是html文档
2,文本标签:和文本有关的标签
<h1>to<h6>:标题标签 h1~h6:字体大小逐渐递减
<p>:段落标签
<br>:换行标签
<hr>:展示一条水平线
属性:
color:颜色
width:宽度
size:高度
align:对其方式
center:居中
left:左对齐
right:右对齐
<b>:字体加粗
<i>:字体斜体
<font>:字体标签
<center>:文本居中
属性:
color:颜色
size:大小
face:字体
属性定义:
color:
1. 英文单词:red,green,blue
2. rgb(值1,值2,值3):值的范围:0~255 如 rgb(0,0,255)
3. #值1值2值3:值的范围:00~FF之间。如: #FF00FF
width:
1. 数值:width='20' ,数值的单位,默认是 px(像素)
2. 数值%:占比相对于父元素的比例
空格 ©版权符号
3,图片标签:
img:展示图片
属性:src:指定图片位置
./:代表当前目录
../:代表上一级目录
alt属性是干什么的?当图片加载失败后的替换内容
4,列表标签
有序列表:
ol order list
无序列表
ul unorder list
列表项
li list item
5,链接标签
a:定义一个超链接
属性:href:指定访问资源url(统一资源定位符)
target:指定打开资源的方式
_self:默认值,在当前窗口打开新的资源
_blank:在空白窗口打开新的资源
6,div和span:
p div:每一个div占满一整行,块级标签(一个标签独占一行)
span:文本信息在一行展示,行内标签,内联标签(一个标签只占它内容的宽度)
7. 语义化标签:html5中为了提高程序的可读性,提供了一些标签。
1. <header>:页眉
2. <footer>:页脚
<del></del>:
移除的内容
<ins></ins>
添加的内容
<time></time>标记时间
<strong></strong>
强调:
<address></address>
地址:
<em></em>
标记内容着重点
<article></article>
文章内容
<main></main>
主要内容
<nav></nav>
标记导航
8,表格标签
table:定义表格
width:宽度
border:边框
cellpadding:定义内容和单元格的距离
定义单元格之间的距离。如果指定为0,则单元格的线会合为一条
bgcolor:背景色
align:对其方式
tr:定义行
bgcolor:背景色
align:对其方式
td:定义单元格
colspan:合并列 横着的
rowspan:合并行 竖着的
th:定义表头单元格
<caption>:表格标题
<thead>:表示表格的头部分
<tbody>:表示表格的体部分
<tfoot>:表示表格的脚部分
表格加边框
border="1";
cellpadding="0";
cellspacing="0";
开发者调试工具;
通过f12打开,在elements页签中看标签
浏览器解析table时,如果table没有写tbody,那么会自动添加一个tbody;
a标签,在html页面中用来定义超链接。
href属性规定了要跳转的页面的链接。
target属性用来定义连接在何处打开,默认在本页面打开,取值是"_self"。可能的取值还有"_blank","_parent","_top"。
a标签的标签体可以是文本,也可以是图片,…。
action 属于form标签中的属性,指定表单提交的地址。其他的都可以作为a标签的属性,style属性设置标签的样式,
class属性设置指定的类选择器,src属性指定图片的位置。
是表格中的行标签; 是表格中的单元格标签;-
:
-
列表标签分为有序(
-
)列表和无序(
- )列表,
- 为列表项。
-
)列表和无序(
-
列表标签分为有序(
- 标签有type属性,表示列表的符号类型,取值有:disc、square、circle。
-
标签有type、 start属性:
type:表示列表序号的类型,取值有:1、A、a、I、i; start:表示项目列表的起始值。
HTML:表单标签
form作用:定义一个采用用户数据的范围,采集到数据后,把数据发送到指定的服务器
css:层叠样式表:一个HTML元素上可以作用多个css样式
sleep方法是Thread类的静态方法,wait()是Object超类的成员方法 使当前正在执行的线程停留(暂停执行)指定的毫秒数
sleep()方法必须传入参数,参数就是休眠时间,时间到了就会自动醒来。
sleep()方法可以再任何地方使用,wait()方法只能在同步方法和同步代码块中使用
wait()方法可以传入参数也可以不传入参数,传入参数就是在参数结束的时间后开始等待,不传入 参数就是直接等待
wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程
区别:
1,属于不同的两个类,sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类里的方法
2,sleep()方法不会释放锁,wait()方法释放对象锁
3,sleep()方法可以在任何地方使用,wait()方法只能在同步方法和同步代码块中使用
4,sleep()必须捕获异常,wait()方法、notify()方法和notiftAll()方法不需要捕获异常。
5,sleep()使线程进入阻塞状态(线程睡眠),wait()方法使线程进入等待队列(线程挂起),也就是阻塞类别不同。
线程生命周期: 新建---->就绪---->运行---->阻塞—>死亡
创建:new Thread线程对象
创建–》就绪:start(),有执行资格,没有执行权
就绪–>运行:抢到CUP的执行权,有执行资格,有执行权力
运行–>阻塞:sleep() wait()没有执行资格,没有执行权力
阻塞–》就绪:notify()有执行资格,没有执行权力
运行–>就绪:其他线程抢走了cpu执行权join()
运行–>死亡 run()结束
https://blog.youkuaiyun.com/asdf_1024/article/details/78978437
两种调度方式:
分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
Java使用的是抢占式调度模型
重写和重载的区别:
- 1、方法重写概念
- 子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
- 2、方法重写的应用场景
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
- 3、Override注解
- 用来检测当前的方法,是否是重写的方法,起到【校验】的作用
注意: 1. 私有方法不能被重写(父类私有成员子类是不能继承的) 2. 子类方法访问权限不能更低(public > 默认 > 私有)
重载:是让类以统一的方式处理不同类型数据的方法,实质就是多个具有不同参数个数或者类型的同名函数,同时存在一个类中,是一个类中多态性的一种表现,
重载一个类中的同名方法,只要参数不相同或数量不同,就构成方法的重载
特点:
*重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式;
*重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关;(不能通过返回值来判断两个方法是否构成重载)
- 用来检测当前的方法,是否是重写的方法,起到【校验】的作用
构造方法能否被重写或者重写:
重写是子类方法重写父类的方法,重写的方法名不变,而类的构造方法名必须与类名一致,假设父类的构造方法如果能够被子类重写则子类类名必须与父类类名一致才行,所以 Java 的构造方法是不能被重写的。而重载是针对同一个的,所以构造方法可以被重载
成员变量和局部变量:(4种)
1,类中位置不同:成员变量(类中方法外)局部变量(方法内部或方法声明上)
2,内存中位置不同:成员变量(堆内存)局部变量(栈内存)
3,生命周期不同:成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而调用,随着方法的调用完毕而消失)
4,初始值不同:成员变量(有默认的初始化值)局部变量(没有默认的初始化值,必须先定义,赋值才能使用)
接口和抽象类的区别:
(1)抽象类可以有构造方法,接口中不能有构造方法。
(2)抽象类中可以有普通成员变量,接口中没有普通成员变量
(3)抽象类中可以包含静态方法,接口中不能包含静态方法
(4) 一个类可以实现多个接口,但只能继承一个抽象类。
(5)接口可以被多重实现,抽象类只能被单一继承
(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法