目录
1. jdbc
1.1 什么是jdbc
JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 ,它是一种用于数据库访问的应用程序 API ,由一组用Java语言编写的类和接口组成,有了JDBC就可以 用统一的语法对多种关系数据库进行访问,而不用担心其数据库操作语言的差异 。
jdbc本质其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。
1.2 怎样使用jdbc和数据库建立连接
首先需要了解建立连接的几个要素:
Driver接口,DriverManager类,url,用户名和密码,Connection类
Driver接口是所有数据库驱动程序需要实现的接口,这个接口是提供给数据库厂商使用的,不同的数据库厂商提供不同的实现。
DriverManager类是管理驱动的类,在程序中不需要去访问实现了Driver接口的类,而是由驱动程序管理器类DriverManager来调用这些类实现连接的。
url是要要交互的数据库的地址
用户名和密码是数据库的用户名和密码
Connection是连接类,在java中万物皆对象,连接也可以是一个对象,通过连接对象,我们可以对数据库进行操作。
使用jdbc和数据库建立连接的步骤:
1.要加载驱动,其作用就是告诉该程序要使用哪个数据库驱动jar包(mysql5之后的驱动包可以省略该步骤)
2.获取连接对象:
Connection connection = DriverManager.getConnection(url,用户名,密码);
1.3 Statemen类
建立连接后要通过Statement类来对数据库进行操作。
首先要获取一个Statement类对象,这里我们一般使用两种办法创建Statement对象:
1. Statement statement1 = connection.createStatement();
2, Statement statement2 = connection.preparedStatement();
statement1用于执行不带参数的的简单sql语句,每次执行sql语句,数据库都要执行sql语句的编译,仅执行一次查询并返回结果的情况建议使用这个,此时效率高于preparedStatement
注:使用statement1执行sql语句可能会出现注入式攻击
statement2用于执行带参或者不带参数的sql语句,它是预编译执行的,在执行可变参数的一条 sql语句时,比 statement1 的效率高,安全性好,可以有效防止 SQL 注入等问题,对于多次重复执行的语句,效率会更高
Statement对象常用方法:
executeQuery(String sql) 用于向数据发送查询语句。
注:execuQuery()会返回一个ResultSet结果集
executeUpdate(String sql) 用于向数据库发送insert、update或delete语句
execute(String sql) 用于向数据库发送任意sql语句
addBatch(String sql) 把多条sql语句放到一个批处理中。
executeBatch() 向数据库发送一批sql语句执行。
clearBatch() 将批处理中的sql语句清除;
PreparedStatement独有的方法:setObject()放置参数
1.4 jdbc工具类
因为我们需要经常对一个数据库进行操作,所以可以写一个jdbc工具类,用的时候调用即可。
jdbc工具类包括静态常量属性,静态代码块,静态方法
静态常量属性是经常要用到的常量属性:url,用户名和密码
静态代码块是加载配置文件Properties里的内容的。url,用户名密码都在配置文件中,配置文件Properties继承了Hashtable类,里面的内容都是以键值对形式存在的。
// 加载属性文件:只需要执行1次
static {
// Map接口的实现类,存储键值对
Properties properties = new Properties();
try {
// 类名.class.getClassLoader():获取到字节码对应的的类加载器
// getResourceAsStream():将读取到的资源文件转换为字节流
InputStream inputStream = DbHelper.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(inputStream);//加载文件
url = properties.getProperty("url"); //根据属性名获取属性值
user = properties.getProperty("user"); //根据属性名获取属性值
pwd = properties.getProperty("pwd"); //根据属性名获取属性值
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
静态方法包括:
获取连接对象, 关闭连接, 查询方法, 增删改方法
2. Dao模式
DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。
一个经典的Dao模式由以下几部分组成:
1. DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。
2. DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
3. 实体类:用于存放与传输对象数据。
4. 数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。
3.多线程
3.1 线程简介
进程:进程是正在运行的程序,每个进程都有独立的内存空间
线程;线程是进程中最小的调度单元,一个进程有多个线程,他们共享cpu的计算资源
并发:在同一时间间隔内有多个线程运行
并行:在同一时刻同时有多个线程运行
java的多线程指的是并发
3.2 如何创建线程
1. 继承Thread类,重写run方法
2. 实现Runable接口,实现run方法
3. 实现Callable接口
public class MyCall implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("线程在执行的任务");
return Thread.currentThread().getName();
}
public static void main(String[] args) {
// 创建Callable接口的实例
MyCall myCall=new MyCall();
// FutureTask 实例
FutureTask<String> task=new FutureTask<>(myCall);
Thread thread=new Thread(task);
thread.start();
}
}
使用场景:
如果有返回值:实现Callable接口
实现Runable接口的线程,可以被共享
3.3 线程的常用方法
静态方法:
sleep()线程阻塞一段时间, yield()线程从运行状态恢复为就绪状态
join()将当前线程放入执行队列,当前线程优先执行,其他线程阻塞
实例方法:
setName()给线程取名, getName()获取线程名字
setPriority()给线程设置优先级, getPriority得到线程的优先级
3.4 线程的状态
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期
3.5 线程同步
线程同步:当一个线程在对内存进行操作的时候,其他线程都不可以对这个内存地址进行操作,知道该线程的操作完成,其他线程才能对该内存进行操作。
线程同步的利弊:
好处:解决了多线程时的数据安全问题;
多线程的数据安全问题:
弊端:当用同一个锁的线程很多的时候,每个线程都会去判断这个锁的状态,效率低