一,JDBC
1.1 概念
概念:Java DataBase Connectivity ,Java 数据库连接,JDBC让我们可以通过Java操作数据库
JDBC本质:它是官方推出的一套专门用于操作关系型数据库的规则,就是接口。各个不用的数据库厂商都去实现这个接口,并提供相应的jar包。我们可以使用这些jar包针对不同的关系型数据库进行数据库的操作。
1.2 使用步骤
导入jar包(数据库驱动包)mysql-connector-java-5.1.37-bin.jar
导入步骤:
在项目的根目录下创建 libs 文件夹
将驱动包复制到 libs 下
右键选中此 jar 文件,点击 Build Path ,再点击 Add to Build Path
注:如果导入 jar包报错,需要删除,删除的步骤是
右键项目,选中 Build Path,选择 Configure Build Path
找到 libraries 标签页,选择指定的资源点击 remove
注册驱动
获取数据库连接对象
定义SQL语句
获取执行SQL语句的对象
执行
接收返回的结果
处理结果
释放资源
1.3 常见错误
- ClassNotFoundException:找不到类,一般是驱动包的类名问题
- Unknown database 'xxx':找不到数据库,一般是数据库库名的问题
- Access denied for user 'xxx'@'localhost' (using password: YES):访问数据库被拒绝,一般是数据库的用户名或者密码有误
- SQLException:数据库异常
- MySQLSyntaxErrorException:数据库语法错误
1.4 细节问题
注册驱动:告知程序要使用哪一个数据库的jar包
Class.forName("com.mysql.jdbc.Driver");
注:mysql5版本以后,注册驱动的语句可以省略
Connection连接对象
/* * 参数: * 1.要连接的数据库: jdbc:mysql://地址:端口号/库名 ; 如果地址是本机,端口是3306,那么可以写成:jdbc:mysql:///库名 * 2.数据库管理员身份的用户名 * 3.数据库管理员身份的密码 */ Connection conn = DriverManager.getConnection("jdbc:mysql:///0519pm", "root", "1234");
Statement执行对象
- 用于执行SQL语句
- executeUpdate(String sql):执行增删改查,返回 int 值,表示影响的记录数
- executeQuery(String sql):执行查询,返回结果集 ResultSet
ResultSet结果集对象
- 用于封装查询后的结果
- 方法:
- next():判断是否有下一条可遍历的记录,返回布尔值
- getXxx(参数):该方法有重载,参数可以是int,也可以是String;参数是int时字段值根据字段在结果集中的第几列获取;参数是String时字段值根据字段名获取。
ResultSet、Statement、Connection都需要释放 close()
形参与SQL语句中的关键字之间要有空格,否则关键字与参数拼接会报错
1.5 SQL注入问题
用一些关键字与字符串进行拼接,会造成造成安全性的问题
例如:select * from user where username = 'qwer' and password = '1234' or '1' = '1'; '1' = '1' 是一个恒等式结果永远为true,而 '1' = '1'前又使用了or关键字,从而导致了用户名和密码有误也能成功登录。
解决办法:使用PreparedStatement对象
参数参与SQL语句不再使用字符串的拼接,而使用了占位符
- 占位符中的关键字,不再以关键字的形态出现
1.5.1 PreparedStatement的获取
PreparedStatement pstmt = conn.preparedStatement(String sql);
将SQL语句预编译
1.5.2 PreparedStatement的功能
- 为占位符设置值
- setXxx(参数1,参数2)
- 参数1:问号的位置,从1开始
- 参数2:问号位置上的值
- 执行SQL
- executeUpdate():执行增删改查,返回 int 值,表示影响的记录数
- executeQuery():执行查询,返回结果集 ResultSet
1.6 数据库连接池
1.6.1 概念
概念:本质上就是一个容器,存放数据库连接对象的容器
1.6.2 好处
- 节省资源
- 提高用户的访问效率
1.6.3 实现方式
在 javax.sql 下提供了一个数据库连接池的接口,DataSource
DataSource的方法:
getConnection():从连接池中获取连接对象
- close():将连接对象归还到连接池中
1.6.3.1 C3P0
步骤:
导入 jar 包,c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar
编写配置文件:
- 在项目的 src 目录下定义 c3p0.properties 或者 c3p0-config.xml
- 在文件中定义数据库的驱动包、数据库的地址、用户名、密码等
创建C3P0的核心类对象,ComboPooledDataSource
// 第一种方式会在c3p0的配置文件中,根据named-config标签下的内容对数据库连接池进行配置 ComboPooledDataSource dataSource = new ComboPooledDataSource("myc3p0"); // 第二种方式会在c3p0的配置文件中,根据default-config标签下的内容对数据库连接池进行配置 ComboPooledDataSource dataSource = new ComboPooledDataSource();
调用获取连接对象的方法,getConnection()
归还连接对象,close()
c3p0-config.xml
<c3p0-config> <named-config name="myc3p0"> <!-- driverClass:驱动包 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- jdbcUrl:数据库地址 --> <property name="jdbcUrl">jdbc:mysql://localhost:3306/0521am</property> <!-- user:管理员的用户名 --> <property name="user">root</property> <!-- password:管理员的密码 --> <property name="password">1234</property> <!-- initialPoolSize:连接池的默认大小 --> <property name="initialPoolSize">3</property> <!-- maxPoolSize:最大连接数 --> <property name="maxPoolSize">5</property> <!-- checkoutTimeout:超时时间 --> <property name="checkoutTimeout">1000</property> </named-config> <default-config> <!-- driverClass:驱动包 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- jdbcUrl:数据库地址 --> <property name="jdbcUrl">jdbc:mysql://localhost:3306/0521am</property> <!-- user:管理员的用户名 --> <property name="user">root</property> <!-- password:管理员的密码 --> <property name="password">1234</property> <!-- initialPoolSize:连接池的默认大小 --> <property name="initialPoolSize">3</property> <!-- maxPoolSize:最大连接数 --> <property name="maxPoolSize">5</property> <!-- checkoutTimeout:超时时间 --> <property name="checkoutTimeout">1000</property> </default-config> </c3p0-config>
注:
从连接池中存在的连接对象的第一个开始获取
- 将归还的连接对象添加到连接池的末尾
- 当获取连接数超过了配置的最大连接数时会发生异常
- 当连接对象使用完毕后,应立即归还,以便重新获取加以利用
1.6.3.2 Druid
由阿里巴巴提供
步骤:
- 导入 jar 包,druid-1.0.9.jar
- 定义配置文件:
- 编写 properties 文件
- 文件名是任意的,可以放在任意的目录下
- 加载配置文件
- 从数据库连接池工厂中获取连接池对象
- 数据库连接池工厂,DruidDataSourceFactory
- 获取连接池对象,createDataSource(Properties 对象)
- 获取连接对象,getConntion()
druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///0521am username=root password=1234 initialSize=3 maxActive=5 maxWait=3000