JDBC(Java Date Base Connectivity)
Java数据库连接。是一种用于执行SQL语句的Java API。简单来说就是通过Java去操作数据库,向数据库发送SQL语句,执行增删改查等操作。
Java对数据的连接定了一定的规则,java.sql.Driver接口,只要数据库实现这个接口,就可以和java程序进行连接; 每一个数据库的驱动JDBC Driver,都实现了java.sql.Driver接口,所以都可以和java建立连接 ;mySql的数据库驱动com.mysql.jdbc.Driver 实现了 java.aql.Driver接口
核心类:
核心类1、java.sql.DriverManager
- 用来管理数据库驱动和获取数据库连接
- 方法:
static Connection getConnection(String url, String user, String password) 并返回一个Connection(连接)对象
- 用来根据数据库的用户名、密码、地址获取数据库连接
核心类2、java.sql.Connection
- 代表的是数据库连接
- 方法:
Statement createStatement() 返回一个SQL执行器,由它来完成对数据库的操作(存在sql注入的问题)
PreparedStatement PreparedStatement () 返回一个SQL执行器,由它来完成对数据库的操作
- 用来创建一个SQL的执行器。
void close()
-关闭当前的数据库连接,释放它所创建的JDBC资源
【以后千万不能用】java.sql.Statement(以后使用JDBC时绝对不能使用此类,因为它存在着sql语句注入的问题,不安全,以后采用PreparedStatement)
核心类3、java.sql.PreparedStatement
- 预编译的SQL语句
- 使用PreparedStatement执行SQL语句,它会先对SQL的语法进行检查,并且确定SQL的语义。
- 优点:
1.防止SQL注入,预编译的SQL会将SQL语句预编译为一个类似于方法的东西,
而那些变量会以参数的形式传递进去,这样的好处就是不会因为特殊的参数,而影响到SQL语句的语义
2.SQL语句使用占位符来替换变量,不用再进行复杂拼串操作,简化操作。
同时增加我们的SQL语句的可读性。
3.使用PreparedStatement执行SQL语句,它会预先对SQL语句进行编译,
执行时不再需要重复编译,当SQL语句需要多次执行时,会提升SQL的运行的速度。
核心类4、java.sql.ResultSet
- 结果集,执行SQL语句以后得到的查询结果,在ResultSet中封装
- 方法:
boolean next()
- 这个方法可以控制光标向下移动一行
- 返回值是一个布尔值,如果读到了after last则返回false,否则返回true
void close()
-关闭当前的结果集
标准代码
//设置四个参数
String username = "root";
String password = "root";
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
//加载驱动
Class.forName(driverClass);
//分别声明Connection Statement ResultSet三个变量
Connection conn = null;
Statement stat = null;
PreparedResultSet rs = null;
try {
//获取Connection对象
conn = DriverManager.getConnection(url, username, password);
String sql = "SELECt * FROM tb_user WHERE username=? AND password=?";
//获取PreparedStatement对象
prestat = conn.createStatement(sql);
pstmt.setString(1, "admin");
pstmt.setString(2, "123456");
//执行sql获取ResultSet对象
rs = prestat .executeQuery();
//创建一个while循环用于读取ResultSet中的数据
while(rs.next()){
//获取第一列的数据
int id = rs.getInt(1);
//获取第二列的数据
String um = rs.getString(2);
//输出数据
System.out.println(id+"--"+um);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
//关闭rs
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭stat
if(prestat != null){
try {
prestat .close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭conn
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC批处理
//获取connection
conn = JDBCUtils.getConnection();
//设置sql语句
String sql = "INSERT INTO customer (name,age,gender) VALUES(?,?,?)";
//获取PreparedStatement对象
pstmt = conn.prepareStatement(sql);
//使用for循环批量设置参数
for (int i = 0; i < 10000; i++) {
pstmt.setString(1, NameUtils.getName());
pstmt.setInt(2, NameUtils.getAge());
pstmt.setString(3, NameUtils.getGender());
//每设置完一组参数,将参数添加到批量操作中
pstmt.addBatch();
}
//执行批量操作
pstmt.executeBatch();
- 注意MySQL默认是不支持批量处理的,需要在jdbc.properties文件中的URL地址中加上如下参数:
- rewriteBatchedStatements=true
- 低版本的mysql的驱动不支持批处理,所以使用时注意使用最新版的驱动mysql-connector-java-5.1.37-bin.jar
- 使用value关键字同样也不支持批处理,所以在mysql中不要使用value,一律使用values
数据库简介
- DataBase(数据库)
- 存储数据的仓库
- 关系型数据库
- 关系型数据库中保存全都是表格(Table)
- 数据库的优点:
1.可以保存大量的信息
2.有较好的查询性能
- 常见数据库:
- MySQL --> 甲骨文
- DB2 --> IBM
- Oracle --> 甲骨文
- SQL Server --> 微软
SQL语句分为以下三种类型:
DDL: DATA Definition LANGUAGE 数据定义语言
DML: DATA Manipulation LANGUAGE 数据操纵语言:增、删、改、查等
DCL: DATA Control LANGUAGE 数据控制语言
①DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:
CREATE TABLE:创建数据库表
ALTER TABLE:更改表结构、添加、删除、修改列长度
DROP TABLE:删除表
CREATE INDEX:在表上建立索引
DROP INDEX:删除索引
②DML用于查询与修改数据记录,包括如下SQL语句:
INSERT:添加数据到数据库中
DELETE:删除数据库中的数据
UPDATE:修改数据库中的数据
SELECT:选择(查询)数据
SELECT是SQL语言的基础,最为重要。
③DCL用来控制数据库的访问,包括如下SQL语句:
GRANT:授予访问权限
REVOKE:撤销访问权限
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
LOCK:对数据库的特定部分进行锁定
常用数据类型
- 字符串
CHAR
- 定长字符串,char的长度是固定的
比如:CHAR(10),长度永远为10
如果内容的长度不够10,则自动在字符串后边补空格
char型数据在保存时会自动去掉后边的空格
- 一般我们使用char型来保存一些长度固定的数据,身份证号
- CHAR的最大长度是255
VARCHAR
- 可变长度的字符串,必须指定长度
- 最大长度65535
- 数值
INT
- 整型
- 创建int类型也可以指定长度
- int(11),默认长度也是11,所以在创建int型的时候不用指定长度
DOUBLE(M,D)
- 浮点型
- 表示浮点数
- 声明double可以指定一个长度
double(5,2) --> 表示数字长度是5位,其中有两位小数
DECIMAL(M,D)
- 浮点类型
- 十进制精确计算的浮点类型
- DECIMAL使用方式和DOUBLE类似,也是可以声明一个长度 DECIMAL(6,2)
- 一般涉及到钱的数据时我们需要使用
- 时间
DATE
- 只保存日期
- 2016-1-9
TIME
- 只保存时间
- 11:21:00
DATETIME
- 同时保存时间和日期
2016-1-9 11:21:00
TIMESTAMP
- 保存时间戳
- 时间戳值:1970-1-1 0:0:0 到当前时间的一个毫秒数
- 时间戳默认在数据被修改后自动更新