1.基本概念:
Java Database Connectivity //Java 数据库连接,Java语言操作数据库
JDBC的本质 :官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套(JDBC)编程,真正执行的代码是驱动jar包中的实现类
2.快速入门:
1.导入驱动jar包
a. 复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
b.右键-->Add As Library
2.注册驱动
3.获取数据库连接对象Connection
4.定义sql
5.获取执行sql语句的对象statement
6.执行sql,接受返回的结果
7.处理结果
8.释放资源
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo01Jdbc {
public static void main(String[] args) {
Statement statement=null;
Connection connection=null ;
try {
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
//4.定义sql语句
String sql="update db1 set money = 500 where id=2";
//5.获取执行sql的对象 Statement
statement=connection.createStatement();
//6.执行sql
int count=statement.executeUpdate(sql);
//7.处理结果
System.out.println(count);
if (count>0){
System.out.println("数据修改成功");
}
else{
System.out.println("数据修改失败");
}
}catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//8.释放资源
if (statement!=null)
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
if (connection!=null)
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
3.详解各个对象:
驱动管理对象
功能:
1.注册驱动:告诉
static void registerDriver(Driver driver):注册于给定的驱动程序DriverManager
写代码使用:Class.forName("com.mysql.jdbc.Driver");//通过查看源码发现,在com.mysql.jdbc.Driver类中存在静态代码块
//就是加载一个类,并执行初始化,这个动作会触发static静态块
2.获取数据库连接
static Connection getConnection(String ur1,String user,String password);
//url:制定连接的路径
jdbc:mysql://ip地址(域名):端口号/数据库名称
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
//user:用户名
//password:密码
数据库连接对象
功能:
1.获取执行sql的对象
Statement createStatement();
PreparedStatement(String sql);
2.管理实务:
开启事务:setAutoCommit(boolean autoCommit);//调用该方法设置参数为false,即开启事务
提交事务:commit();
回滚事务:rollback();
执行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);//执行DDL(select)语句
结果集对象,封装查询结果
next();//游标向下移动一行
getXxx;//获取数据、如int getInt();String getString();
//int:代表列的编号,从1开始 如:getString(1);
//String:代表列名称 如:getDouble("money");
package cn.itcast.jdbc;
import java.sql.*;
public class Demo01Jdbc {
public static void main(String[] args) {
Statement statement=null;
Connection connection=null ;
ResultSet resultSet=null;
try {
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
//4.定义sql语句
String sql="select * from db1";
//5.获取执行sql的对象 Statement
statement=connection.createStatement();
//6.执行sql
resultSet = statement.executeQuery(sql);
//7.处理结果
while(resultSet.next()){
int i = resultSet.getInt(1);//表示第一列的数据
int money = resultSet.getInt("money");//表示表头名称为money
System.out.println("id--"+i+" money--"+money);
}
}catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//8.释放资源
if (resultSet !=null)
try {
resultSet .close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
if (statement!=null)
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
if (connection!=null)
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
定义一个抽取JDBC工具类:JDBCUtils,为了简化书写
import java.sql.Connection
public class JDBCUtils{
private static String url;
private static String user;
private static String password;//只有是静态的才能被静态方法所访问
private static String driver;
static{
//读取资源文件、获取值
try{
Properties pro=new Properties();
//获取src路径下的文件的方式-->ClassLoader
ClassLoader classloader=JDBCUtils.class.getClassLoader();
URL res =classLoader.getResource("jdbc.properties");
String path=res.getPath();
pro.load(new FileReader(path//也可以写绝对路径));
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
Class.forName(driver);
}catch(IOException e){
e.printStackTrace;
}catch(ClassNotFoundException e){
e.printStackTrace;
}
}
public static Connection getCeonnection() throws SQLException{
//获取连接
return DriverManager.getConnection(url,user,password);
}
public static void close(Statement stmt,Connection conn){
if(stmt!=null){
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}//先释放小的,再释放大的
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public static void close(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(stmt!=null){
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}//先释放小的,再释放大的
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
//配置文件//目的是不再传参数
yrl=hdbc:mysql:///db1
user=root
password=root
driver=com.mysql.jdbc.Driver
执行sql的对象
SQL注入问题:拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性的问题
1.定义sql的参数使用了?作为占位符
如:select * from stuwhere id = ? and password = ?;
2.获取执行sql语句的对象 PreparedStatement
Connection.prepareStatement(String sql);
3.给?赋值:
方法:setXxx(参数1,参数2)
//参数1:?的位置编号,从1开始 参数2:?的值
4.执行sql,接受返回结果,不需要传递sql语句
1.概念其实就是一个容器(集合),存放数据库连接的容器,更加节约资源,用户访问更加高效
2.实现:
1.标准接口:DataSource
获取连接:getConnection();
归还连接:Connection.close();//若果连接对象是从连接池中获取的,那么调用此方法,不会再关闭连接,而是归还连接
2.一般我们不去实现它,有数据库厂商来实现
*C3P0:数据库连接池技术
*Druid:数据库连接池实现技术,由阿里巴巴提供的
1.导入jar包(两个)c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
2.定义配置文件
名称:c3p0.properties 或者 c3p0-config.xml
路径:直接将文件放在src目录下即可
3.创建核心对象 数据路连接池对象 ComboPooledDataSource
//DataSource ds = new ComboPooledDataSource
4.获取连接:getConnection
1.导入jar包 druid-1.0.9.jar
2.定义配置文件
是properties形式的
可以叫任意名称,可以放在任意目录下
3.加载配置文件 Properties
4.获取数据库连接池对象
通过工厂类来获取 DruidDataSourceFactory
5.获取连接:getConnection
1.定义一个类 JDBCUtils
2.提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
1)获取连接方法:通过数据库连接池获取连接
2)释放资源
3)获取连接池的方法
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
1.导入jar包
2.创建JDBCTemplate对象,依赖于数据源DataSource
JDBCTemplate template = new JDBCTemplate(ds);
3.调用JDBCTemplate的方法来完成CRUD的操作
update();//执行DML语句,增删改语句
queryForMap;//查询结果将结果集封装为map集合
// 这个方法查询的结果集长度只能是1
queryForList;//查询结果将结果集封装为list集合
//将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
query();//查询结果,将结果封装为JavaBean对象
//query的参数:RowMapper
//一般使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装
//new BeanPropertyRowMapper<类型>(类型.class);
queryForObject;//查询结果,将结果封装为对象
//一般用于聚合函数的查询
public viud test(){
String sql="selsct * from emp";
List<Emp> list=template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));//自动封装装载集合
for(Emp emp:list){
System.out,println(emp);
}
}