JDBC技术
一、JDBC的概念(Java DataBase Conection)
JDBC技术就是使用Java程序连接并操作数据库的一种技术(规范);
二、使用JDBC操作数据库的步骤
三个接口一个类
2.1、DriverManager 加载驱动程序(数据库厂商提供的jar文件)
2.2、Connection 获得连接
2.3、Statement 执行SQL语句
2.4、ResultSet 更新(可以接收操作所影响的行数),查询(得到的是一个ResultSet结果集)
2.5、关闭资源
三、JDBC案例入门
3.1、基础环境
数据库名: myschool
表名:users
用户名:root
密码:root
主机:本机
端口号:3306
3.2、代码实现
//1、加载驱动
class.forName(com.mysql.jdbc.Driver)
//2、创建连接
Connection c=DriverManager.getConnection(url,user,password)
//3、执行SQL语句
Statement s=c.CreateStatement();
String sql='' ''
//4、处理返回结果
Resulset r=s.executeQuery(sql);
//5、释放资源
c.close();
JDBC技术中涉及到的 【五大接口】 和 【一个类】
DriverManager 类; ------ 加载驱动管理类
Connection接口; -------创建连接
Statement接口; -------执行静态SQL语句通道
PreparedStatement接口; -------占位符SQL通道
CallableStatement接口; --------执行存储过程通道
ResultSet接口; ------- 结果集
四、JDBC实现CRUD操作
4.1、实现数据新增
4.2、实现数据修改
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JdbcUpdateTest {
//修改模板
public static void main(String[] args) throws Exception {
//连接数据库的地址,数据库名等信息
String url="jdbc:mysql://localhost:3306/myschool?character=utf8";
//用户名
String user="root";
//密码
String password="root";
//1.加载驱动 Class.forName();
Class.forName("com.mysql.jdbc.Driver");
//2.使用驱动管理类DriverManager创建连接 Connection
Connection conn=DriverManager.getConnection(url, user, password);
//3.执行sql语句 Statement
Statement st = conn.createStatement();
int result=st.executeUpdate("update student set stuname='张三' where stuid=1");
//4.处理返回结果
System.out.println(result);
//5.释放资源 close
conn.close();
}
}
4.3、实现增加、删除、修改
```java
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbczsgTest {
public static void main(String[] args) throws Exception {
//String sql="insert into student values(null,'555555','郭靖2','男',1,'
15389071916','陕西省西安市',now(),default,default,26)";
//String sql="delete from student where stuid=11";
String sql="update student set stuname='abc' where stuid=5";
int result=zsg(sql);
System.out.println(result);
}
private static int zsg(String sql) throws ClassNotFoundException, SQLException {
// 连接数据库的地址,数据库名等信息
String url = "jdbc:mysql://localhost:3306/myschool?character=utf8";
// 用户名
String user = "root";
// 密码
String password = "root";
// 1.加载驱动 Class.forName();
Class.forName("com.mysql.jdbc.Driver");
// 2.使用驱动管理类DriverManager创建连接 Connection
Connection conn = DriverManager.getConnection(url, user, password);
// 3.执行sql语句 Statement
Statement st = conn.createStatement();
int result = st.executeUpdate(sql);
// 4.处理返回结果
// 5.释放资源 close
conn.close();
return result;
}
}
4.4、实现查询
//statement 是一个接口,用来发送执行SQL语句
//executeUpdate(); 做更新操作(delete insert update),返回值类型是一个int
//executeQuery(); 做查询,返回值类型是resultSet接口
//execute(); 判断是否有返回值结果,返回值类型是一个Boolean
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Query {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.创建连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool", "root", "root");
// 3.执行sql语句
Statement st = conn.createStatement();
String sql = "select * from stu where sex='男'";
// 4.处理返回结果
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString("studentName");
String sex=rs.getString("sex");
System.out.println("id:"+id+" name:"+name+" sex:"+sex);
}
}
}
五、PreparedStatement接口
PreparedStatement接口是 Statement接口的子接口;
Statement接口的特点:只能支持静态的SQL语句(直接可以在数据库的查询分析器下执行的语句);
PreparedStatement接口的特点:可以支持静态的SQL,特有的是可以支持带有占位符(?)的SQL命令;
PreparedStatement接口的优势:
1、可以有效的防止非法SQL的注入;
2、是一个预编译的SQL命令执行接口,提高性能;
while( rs.next() ){
} //只要存在一行数据,就会返回一个true,如果检查不到数据,则返回false;
//增删改公共方法 sql 值
public int update(String sql,Object ...obj) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool?character=utf8", "root", "root");
PreparedStatement pstm = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
pstm.setObject(i+1, obj[i]);
}
int result = pstm.executeUpdate();
return result;
}
六、数据库连接池
package com.cn;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;
/**
* @author Administrator
* 数据库连接池
* 使用每一次都加载驱动创建连接的方式插入两千条数据需要9秒钟
*/
public class Demo {
Connection conn =null;
static DataSource datasource=null;
//java提供的配置文件类,以键值对方式存储数据
static Properties p =new Properties();
static {
try {
//从文件中读取数据存储流中
InputStream is = Demo.class.getClassLoader().getResourceAsStream("config/dbcp.properties");
//加载流中的数据到Properties
p.load(is);
//使用数据源工厂创建一个数据源(连接池)
datasource= BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void demo01() throws Exception {
conn = datasource.getConnection();
for (int i = 0; i < 5; i++) {
update(i);
}
}
public void update(int i) throws Exception {
Statement st = conn.createStatement();
int result = st.executeUpdate("insert into a values("+i+")");
}
}
七、dbutils: 是一个开源框架,目的是封装了jdbc,减轻了开发者的工作量,提高的开发者代码的运行速度
package com.cn.dao.impl;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.cn.dao.StudentDao;
import com.cn.entity.Student;
import com.cn.utils.DataBase;
/**
* @author Administrator
*dbutils 是一个开源框架,目的是封装了jdbc,减轻了开发者的工作量,提高的开发者代码的运行速度
*
*/
public class StudentDaoImpl extends DataBase implements StudentDao{
@Override
public Student login(String name, String pass) {
Student stu =null;
try {
QueryRunner run=new QueryRunner(datasource);
stu=run.query("select * from student where stuname=? and stupass=?" ,new BeanHandler<Student>(Student.class),name,pass);
} catch (SQLException e) {
e.printStackTrace();
}
return stu;
}
}