1.JDBC:
1. 概念:Java DataBase Connectivity Java 数据库连接,Java 语言操作数据库
* JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可
以使用这套接口(JDBC)变成,真正执行的代码是驱动jar包中的实现类。
2. 入门:MYSQL(数据库为例)
* 步骤:
1.导入驱动jar包
* 右键项目 --- > Build Path --- > Configure Build Path... --- > Libraries ---> Add External JARs...
2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
3.获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称" , "用户名" , "密码");
4.定义sql
String sql = "insert into student values ('张三' , '男' , 18)";
5.获取执行sql语句的对象 Statement
Statement stmt = conn.createStatement();
6.执行sql , 接受返回结果
int length = stmt.executeUpdate(sql);
7.处理结果
System.out.println(length);
8.关闭
stmt.close();
conn.close();
* 注意:如果出现 Could not create connection to database server 异常 这是因为jar包版本与数据库不一致造成
可以将 mysql驱动名改成:com.mysql.cj.jdbc.Driver
* 处理如下: 我这里使用的是 mysql - 8.0.12 版本
* Class.forName("com.mysql.cj.jdbc.Driver");
* Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称?useSSL=false&serverTimezone=UTC" , "用户名" , "密码");
**3.详解各个对象:**
1.DriverManager :驱动管理对象
* 功能:
1.注册驱动
static void registerDriver(Driver driver)
注意:mysql5之后的驱动jar包加载可以省略
2.获取数据库连接
static Connection getConnction(String url , String user , String pwd)
* url :
语法:jdbc:mysql://ip地址 : 端口号/数据库名称
细节:如果ip地址是本机号,端口是3306 则可以简写为 jdbc:mysql:///数据库名称
2.Connection :数据库连接对象
1. 功能:
1.获取sql 对象
* Statement createStatement();
* PreparedStatement prepareStatement(String sql);
2. 管理事务:
* 开启事务:setAutoCommit(Boolean s);
* 提交事务:commit();
* 回滚事务:rollback();
3.Statement:执行sql对象
1. 执行sql语句
1.boolean execute(String sql) :可以执行任意SQL语句
2.int executeUpdate(String sql) : 执行DML(insert , update , delete) 语句 DDL(create, alter , drop )语句
3.ResultSet executeQuery(String sql) :执行DQL语句 (Select)
4.ResultSet:返回结果集对象
* next() : 游标向下移动一行
* getXxx(参数):获取数据
* Xxx :代表数据类型:int getInt() , String getString();
* 参数:
1. int : 代表列的编号, 从1开始 getString(1) 获取第一列的值
2. String : 代表列名称 : getDouble("age");
5.PreparedStatement:执行sql对象
1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全隐患
1. 用户随便输入 , 'a' = 'a' 恒等式
2. sql:select * from T_project where Project_id = '2003-01' and Project_name = '教学大楼' or 'a' = 'a' -- 恒等式存在
2.解决sql诸如问题:使用 PreparedStatement 对象来解决
3.预编译的SQL:参数使用 ?作为占位符
4.步骤:
1.导入驱动jar包
* 右键项目 --- > Build Path --- > Configure Build Path... --- > Libraries ---> Add External JARs...
2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
3.获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称" , "用户名" , "密码");
4.定义sql
String sql = "insert into student values ('?' , '?' , ?)";
5.获取执行sql语句的对象 Statement
PreparedStatement ps= conn.prepareStatement(sql );
6.执行sql , 接受返回结果
int length = ps.executeUpdate();
7.处理结果
System.out.println(length);
8.关闭
stmt.close();
conn.close();
2.JDBC控制事务:
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,那么这个业务操作要么同时成功,要么同时失败
2.操作 :
1.开启事务
2.提交事务
3.回滚事务
3.使用Connection对象来管理事务
* 开启事务:setAutoCommit(boolean autoCommit) : 调用该方法设置参数为false , 即开启事务
* 在执行sql之前开启事务
* 提交事务:commit()
* 当所有sql执行完毕之后
* 回滚事务:rollback();
* 出现异常时回滚
- 事务案例:这里演示最简便的写法 以便于理解
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取数据库连接对象 Connection
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC" , "root" , "123456");
//3.1开启事务
conn.setAutoCommit(false);
//4.定义sql
String sql = "insert into student values (null ,'张三' , '男' ,'2018-01-02' , 18 , 'asd')";
//5.获取执行sql语句的对象 Statement
stmt = conn.createStatement();
//6.执行sql , 接受返回结果
int length = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(length);
//8.提交
conn.commit();
} catch (Exception e) {
//事务回滚
if(conn != null)
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//9.关闭
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.JDBC工具类:(基于原型)
这里给出实例代码:
private static String url ;
private static String username ;
private static String password ;
private static String driver ;
/**
* @param _Project_id
* @return
*/
static{
try {
//读取 properties
Properties pro = new Properties();
//2.加载文件
//3.加载进内存
pro.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("db.properties").getPath()));
//3.获取值
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
Class.forName(driver);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConn() throws SQLException{
return DriverManager.getConnection(url,username,password);
}
db.properties 配置文件如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&serverTimezone=UTC
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000
maxIdle=8
minIdle=3