1.什么是Jdbc??
jdbc(Java DataBase Connectivity),简而言之就是使用java语言去操作数据库
2.Jdbc的本质
官方(sun公司)定义了一套操作所有关系型数据库的规则(接口),然后由每一个不同种的数据库厂商去实现不同的实现类(数据库驱动),我们可以使用这套接口(jdbc)去编程,真正执行的代码是驱动jar包中的实现类
/**
jdbc就像是接口,而各厂商使用的数据库驱动就是一个个实体类,可以达到多态的效果
Person pImpl;//接口
Worker mWorker;//worker类
//使用方法
Person pImpl=new Worker();//类似这样的多态化操作
*/
3.快速使用jdbc
套路:
1.导入驱动jar包
//导入数据库对应的jdbc版本,这里使用的是8.0版本的
2.注册驱动
//2.注册驱动(通过反射机制)
Class.forName("com.mysql.cj.jdbc.Driver");
3.获取数据库的连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/db1" +
"?useUnicode=true" +
"&characterEncoding=UTF-8" +
"&useSSL=false&serverTimezone=Asia/Shanghai" +
"&zeroDateTimeBehavior=CONVERT_TO_NULL",
"root","123456");
4.定义sql
//4.定义sql语句
String sql="UPDATE account SET balance=800 WHERE id=1";
5.获取sql执行对象,并且执行sql
//5.获取执行sql的对象 Statement
Statement mState=conn.createStatement();
//6.执行sql
int count=mState.execute(sql);
6.释放资源
//释放资源
mState.close();
conn.close();
注:以上的步骤是使用jdbc的基础步骤,有些方法可以进行简化和省略(这个稍后也会谈,通过这种方式操作mysql 8.0+是没问题的)
详解各个对象
<1> DriverManager:驱动管理对象
功能:
1.注册驱动,告诉程序需要使用哪一个数据库来驱动jar
方法:Class.forName(“com.mysql.cj.jdbc.Driver”);【静态代码块】
通过源码可知在"com.mysql.cj.jdbc.Driver"中存在静态代码块,用来注册驱动
在java5.0之后注册驱动可以省略
2.获取数据库连接
方法:Connection mConn=DriverManager.getConnection(mUri,userId,password);
通过提供uri,账号和密码来进行数据库连接对象的获取
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1" +
"?useUnicode=true" +
"&characterEncoding=UTF-8" +
"&useSSL=false&serverTimezone=Asia/Shanghai" +
"&zeroDateTimeBehavior=CONVERT_TO_NULL",
"root", "123456");
<2>Connection:数据库连接对象,是当前代码和数据库之间的桥梁
功能
1.获取执行的sql对象
*Statement createStatement(String sql_code);
*PreparedStatement createStatement(String sql_code);
2.管理事务
*开启事务:setAutoCommit(boolean autoCommit); 设置该参数为false 即开启事务
*提交事务:commit();
*回滚事务:rollback();
<3>Statement 用来执行sql对象
注:该对象用来执行静态sql语言并且返回生成结果的对象
*Boolean execute(String sql); //可以执行任意的sql
*int executeUpdate(String sql);//执行DML(增删改表中的数据 insert update delete)语句,DDL语句(对表和库进行创建 create alter drop)【不经常用】、
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0则执行成功,反之失败
*ResultSet executeQuery(String sql); 执行DQL(select)语句
<4>ResultSet 结果集对象,用来封装查询结果
*boolean next():游标向下移动一行 判断当前行是否有数据
*getXxx():获取数据
*Xxx代表着数据类型 int getInt() int getDouble()
*参数
1.int:代表列的编号 如:getString(columnIndex);//从1开始
2.String: 代表列的名称 getString("columnLabel");//从哪一列开始
使用方法:
1.游标向下移动一行
2.判断是否有数据
3.获取数据
mRes=mStmt.executeQuery(sql_select);
//查询结果
//1.让光标向下移动一行
mRes.next();
//2.获取数据
int id=mRes.getInt(1);
String name=mRes.getString("name");
double balance=mRes.getDouble(3);
mRes.next();
int id1=mRes.getInt(1);
String name1=mRes.getString("name");
double balance1=mRes.getDouble(3);
System.out.println(id+"---"+name+"---"+balance);
System.out.println(id1+"---"+name1+"---"+balance1);
一般使用循环查询的方法
//查询结果
while(mRes.next()){
int id=mRes.getInt(1);
String name=mRes.getString("name");
double balance=mRes.getDouble(3);
System.out.println(id+"---"+name+"---"+balance);
}
<5>PreparedStatement用来执行sql对象
注:该对象用来执行预编译sql语言并且返回生成结果的对象
为了解决sql注入问题(在拼接sql的时候,有一些sql的特殊关键字参与字符串的拼接,会造成一些安全性的问题),因此采用了PreparedStatement
使用方法:
1.导入驱动
2.注册连接
3.获取连接
4.定义sql
*sql参数使用?作为占位符,如:
select*from user where username=? and password=?
5.获取执行sql语句的对象
PreparedStatement mPstmt=Connection.preparedStatement(sql);
6.给?赋值
*setXxx(参数1,参数2)
参数1:问号的位置编号
参数2:问号的值
7.执行sql 接收返回的结果
mRs=mPstat.executeQuery();
下面是写的一个使用PrepareStatement的部分代码:
public boolean newLogin(String userName,String password){
if(userName==null||password==null){
System.out.println("账号密码错误");
return false;
}
//开始连接数据库
try {
//查询连接
mConn=JDBCUtils.getConnection();
//找到sql
String sql="select*from user where username=? and password=?";
//获取执行对象
mPstat=mConn.prepareStatement(sql);
//设置参数
mPstat.setString(1,userName);
mPstat.setString(2,password);
//执行sql
mRs=mPstat.executeQuery();
return mRs.next();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}