java笔记--JDBC

JDBC

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.详解各个对象

DriverManager

驱动管理对象

功能:
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:密码

Connection

数据库连接对象

功能:
1.获取执行sql的对象
	Statement createStatement();
	PreparedStatement(String sql);
2.管理实务:
	开启事务:setAutoCommit(boolean autoCommit);//调用该方法设置参数为false,即开启事务
	提交事务:commit();
	回滚事务:rollback();

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);//执行DDL(select)语句

ResultSet

结果集对象,封装查询结果

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

PreparedStatement

执行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:数据库连接池实现技术,由阿里巴巴提供的

C3P0

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

Druid

1.导入jar包 druid-1.0.9.jar
2.定义配置文件
	是properties形式的
	可以叫任意名称,可以放在任意目录下
3.加载配置文件  Properties
4.获取数据库连接池对象
	通过工厂类来获取   DruidDataSourceFactory
5.获取连接:getConnection

定义工具类

1.定义一个类 JDBCUtils
2.提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
	1)获取连接方法:通过数据库连接池获取连接
	2)释放资源
	3)获取连接池的方法

Spring JDBC

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);
	}
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值