目录
1.JDBC
1.1概述
Java DataBase Connectivity,java数据库连接。
作用:通过java操作数据库。
sun公司提供操作所有关系型数据库的规范,各个数据库厂商自行实现接口,提供数据库驱动的jar包。开发人员使用这套接口,即可对各厂商的数据库进行操作。
1.2简单使用
需引入jar包,mysql-connector-java.jar
使用JDBC的步骤:
1.注册驱动。
2.创建连接。
3.获取语句执行者对象。
4.执行语句。
5.处理结果集。
6.释放资源。
public void testSave() throws Exception {
//1.注册驱动
DriverManager.registerDriver(new Driver());
String url = "jdbc:mysql://localhost:3306/study";
String username = "root";
String password = "root";
//2.获得连接
Connection connection = DriverManager.getConnection(url, username, password);
//3.获得语句执行者
Statement st = connection.createStatement();
//4.执行语句
String sql = "INSERT INTO tab_account VALUES(NULL , 'jiujiu' , '1000')";
int count = st.executeUpdate(sql);
//5.处理结果
System.out.println(count);
//6.释放资源
st.close();
connection.close();
}
1.3API介绍
1.3.1DriverManager类
主要作用:
-
注册驱动
-
获取连接
常用方法:
方法名 | 作用 |
---|---|
static void registerDriver(Driver 驱动对象) | 注册驱动 |
static Connection getConnection(url,username,password) | 获取连接 |
注册驱动:
翻看mysql的驱动类源码,发现里面有一个静态代码块,其中的逻辑是:注册驱动,静态代码块的执行时机就是加载类对象的时候就会执行,因此实际上只需要将Driver类加载到内存就可以了。
可以通过反射技术加载:
-
Class.forName("全限定类名");只需要通过类的全限定类名的字符串就可以了。这种方式便于解耦合(因为我们可以将这个字符串提取到配置文件中)
-
对象.getClass();
-
类名.class;
从jdk1.5开始,不注册驱动也可以,jdk底层会帮我们自动的注册驱动。
获取连接:
static Connection getConnection(url,username,pwd):获取连接
-
url:用来确定使用那个协议连接那个数据库
-
格式:
协议:子协议://域名或者主机ip:端口号/数据库名字
-
例如:
jdbc:mysql://loacalhost:3306/study
-
若我们连接的就是localhost:3306的服务器可以省略为:
jdbc:mysql:///study;
若数据库的编码默认不是utf8,存入的数据就有中文乱码。我们可以在url后面追加参数声明使用什么编码操作数据?characterEncoding=utf-8
;
-
-
username:数据库的用户名
-
password:数据库的密码
1.3.2Connection接口
数据库连接
主要作用:
-
获取语句执行对象
-
控制事务
常用方法:
方法名 | 作用 |
---|---|
Statement createStatement() | 创建statement语句执行对象 |
PreparedStatement prepareStatement(sql) | 创建PreparedStatement预编译语句执行对象 |
setAutoCommit(boolean 是否自动提交) | 设置事务是否自动提交,若设置为false就是手动开启事务 |
commit() | 提交事务 |
rollback() | 回滚事务 |
1.3.3Statement接口
语句执行对象
主要作用:
-
执行sql语句
常用方法:
方法名 | 作用 |
---|---|
int executeUpdate(sql语句) | 主要用来执行dml语句,增删改,返回值为:影响的行数 |
ResultSet executeQuery(查询sql语句) | 用来执行dql语句,查询操作,返回值为:查询到的结果集 |
1.3.4ResultSet接口
查询语句执行后的结果集
常用的方法:
方法名 | 作用 |
---|---|
boolean next() | 向下移动指针,若有数据的话返回true,且移动指针;若无数据的话返回false |
getXxx(..) | 获取指定列或者指定字段名的数据 |
getXxx(第几列或者字段名):Xxx指的是数据类型
-
getXxx(int 第几列):根据列号获取
-
getXxx(String 字段名):根据列名获取
getString(..): 获取字符串、时间、数字
getObject(..): 获取一切数据
1.4PreparedStatement
1.4.1概述
SQL注入问题:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义,被称为SQL注入。
解决SQL注入:我们不能让用户输入的信息和SQL语句进行字符串拼接。需要使用PreparedSatement对象解决SQL注入。
1.4.2使用
1.修改SQL语句,使用?替代SQL中变量。
例如:
select * from user where username ='"+username+"' and pwd='"+pwd+"'
现在:
select * from user where username = ? and pwd = ?
;
2.修改语句执行者对象为PreparedStatement,对语句进行预编译。
之前:
conn.createStatement()
;现在:
conn.prepareStatement(sql)
;
3.用preparedStatement对象给变量进行赋值。
st.setXxx(int 第几个问号,Object 参数的值)
xxx就是数据类型
4.执行SQL,使用PreparedStatement的无参方法。如果使用有参那就相当于调用了Statement的方法,因为PreparedStatement是Statement的子接口。
之前:
st.executeXxxxxx(sql)
现在:
st.executeXxxxxx()
;
1.4.3各自的优点
Statement(如果要使用 后台需要控制 这些传递的参数)
对于有多条sql语句,并且每一条都不一样的时候,statement效率更高。
PreparedStatement:
解决了sql注入的问题,对于同一条sql语句执行多次来说效率更高,一次编译多次运行。
2.连接池
2.1概述
连接池就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
优点
-
节约资源,减轻服务器压力
-
提高连接复用性,用户访问高效
规范
数据源: javax.sql.DataSource 接口
连接池: 各个公司提供的实现类
Java为数据库连接池提供了公共的接口: javax.sql.DataSource ,各个厂商去实现这套接口,提供jar包。
-
从连接池中获取连接 : 调用连接池对象的 getConnection() 方法
-
归还连接 : 调用连接的close()方法
常用的连接池技术
-
DBCP : apache提供
-
C3P0:数据库连接池技术,使用它的开源项目有Hibernate、Spring等。
-
Druid:(德鲁伊)阿里巴巴提供的数据库连接池技术,是目前最好的数据库连接池之一。有监控程序,有日志程序..
-
HikariCP:称为效率最高的一款连接池, spring boot 内置数据库
2.2Druid连接池
导入jar包:druid.jar
2.2.1硬编码方式
1.创建连接池对象
2.设置数据库连接的基本方式(驱动,url,username,password)
3.设置其他参数(最大连接数量,最小连接数量,获取连接最大等待时间......)
4.通过连接池对象获取连接
5.使用连接
6.归还连接
public class DRUIDDemo {
@Test
//硬编码,所有的配置都写到java代码中
public void test1() throws SQLException {
//1. 创建对象
DruidDataSource ds = new DruidDataSource();
//2. 设置数据库连接的4个基本参数(驱动,url,username,password)
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/study");
ds.setUsername("root");
ds.setPassword("1234");
//3. 设置其他的参数(最大连接的数量,最小连接空闲数量,获取连接最大等待时间)
ds.setMaxActive(10);
ds.setMinIdle(2);
ds.setMaxWait(2000);
//4. 通过连接池对象获取连接
//Connection conn = ds.getConnection();
//5. 使用连接
//System.out.println(conn);
//6. 调用连接close()就可以归还连接
//conn.close();
//获取11个连接 ,会出现重复的连接
for (int i = 1; i <12 ; i++) {
Connection conn = ds.getConnection();
System.out.println(conn);
if (i%7==0){
conn.close();
}
}
}
}
2.2.2使用连接池工厂创建连接池
public class DruidTest2 {
/**
* DruidDataSourceFactory 用于生产数据源连接池的工厂对象
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws Exception {
//map 存放各种配置信息的
Map<String , String> map = new HashMap<String, String>();
//基本四项 key都是api去掉set首字母小写
map.put("driverClassName" , "com.mysql.jdbc.Driver");
map.put("url" , "jdbc:mysql://localhost:3306/study");
map.put("username" , "root");
map.put("password" , "root");
//1.核心类(程序的入口) map 其实就是配置
DataSource dataSource = DruidDataSourceFactory.createDataSource(map);
//2.获得连接
System.out.println(dataSource.getConnection());
}
}
2.2.3读取配置文件创建连接池
public class DruidTest3 {
public static void main(String[] args) throws Exception {
//读取配置文件
// DruidTest3.class.getClassLoader() 类加载器的好处 加载文件 只加载一次
InputStream is = DruidTest3.class.getClassLoader().getResourceAsStream("db.properties");
//创建properties
Properties properties = new Properties();
//加载数据
properties.load(is);
//1.核心类
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//2.获得连接
System.out.println(dataSource.getConnection());
}
}
db.properties配置文件
#此处的properties 的key不能瞎写
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/study
username=root
password=root
initialSize=3
maxActive=10
maxWait=3000
以上就是JDBC和连接池的部分知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!