1、基础
概念:java语言操作数据库(java 数据库连接)
本质:官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以直接使用这套接口编程,真正执行的代码是驱动jar包中的实现类
public static void main(String[] args) throws Execption{
//1、导入驱动jar包
//2、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3、获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","password");
//4、定义sql语句
String sql = "select * from stu";
//5、获取执行sql对象 Statement
Statement stmt = conn.createStatement();
//6、执行sql语句
String result = stmt.excuteUpdate(sql);
//7、处理结果
System.out.println(result);
//8、释放资源
stmt.close();
conn.close();
}
2、JDBC类详解
DriverManager:驱动管理对象
/*
1、注册驱动:告诉程序该使用哪个数据库驱动jar
注册给定的驱动程序Drivermanager
mysql5之后的驱动jar包可以省略注册驱动的步骤
*/
static void registerDriver(Driver driver)
//写代码注册,通过源码发现,在com.mysql.jdbc.Driver类中存在静态代码块
Class.forName("com.mysql.jdbc.Driver");
/*
2、获取数据库连接
*/
static Connection getConnection(String url,String user,String password)
Connection:数据库连接对象
/*
1、功能:获取执行sql对象
*/
Statement createStatement();
PrepareStatement prepareStatement(String sql);
/*
2、管理事务
*/
开启事务:setAutoCommit(boolean autoCommit) ,调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
Statement :执行sql的对象
/*
1、执行sql
*/
boolean execute(String sql),可以执行任意的sql
//返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功(返回大于0,则成功;反之,则失败)
int executeUpdate(String sql),执行DML(insert、update、delete)语句,DDL(create、alter、drop)语句
ResultSet executeQuery(String sql),执行DQL(select)语句
ResultSet:结果集对象
next() //游标向下移动一行
getXxx(参数) //获取数据
Xxx:代表数据类型 如: int getInt(),String getString()
参数:
int:代表列的编号,从1开始 如:getString(1)
String:代表列的开始 如:getDouble("balance")
使用步骤:
游标向下移动一行
判断是否有数据
获取数据
while(rs.next()){
//获取数据
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble(3);
System.out.println(id+name+balance);
}
PreparedStetement:执行sql的对象
作用:
可以防止SQL注入
效率更高
1、SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
如: 输入用户随便,abc123 输入密码:a' or 'a' = 'a
sql:select * from user where username = 'abc123' and password = a' or 'a' = 'a;
2、解决sql注入问题:使用PrepareStatement对象来解决
3、预编译的SQL:参数使用?作为占位符
4、步骤:
导入驱动jar包
注册驱动
获取数据库连接对象 Connection
定义sql
sql:select * from user where username = ? and password = ?;
给?赋值
方法:setXxx(参数1,参数2)
参数1:?的位置编号 从1开始
参数2:?的值
执行sql,并接受返回结果,不需要传递sql语句
处理结果
释放资源
3、JDBC控制事务
使用Connection对象来管理事务
开启事务:setAutoCommit(boolean autoCommit) ,调用该方法设置参数为false,即开启事务(在执行sql之前开启事务)
提交事务:commit()(当所有sql都执行完提交事务)
回滚事务:rollback()(在catch中回滚事务)
1、连接池基础
概念:一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
实现:
标准接口,DataSource
//方法,获取连接
geConnection()
//归还连接(应注意此方法是归还不是关闭)
Connection.close()
常见连接池:C3P0、Druid
C3P0
导入jar包c3p0、mchange-commons-java、mysql-connector-java
定义配置文件:
名称:c3p0.properties 或者c3p0-config.xml
路径:src目录下
创建数据库连接池对象 CombopooledDataSource
获取连接 getConnection
/*
c3p0获取11个数据库连接
*/
public static void main(String[] args) throw SQLException{
//1、获取DataSource
DataSource ds = new ComboPooledDataSource();
//2、获取连接
for(int i = 1; i<= 11; i++){
Connection conn = ds.getConnection();
System.out.println(i+":"+conn);
if(i = 5){
conn.close(); //当获取数据库连接数到5时,用完该对象后,归还连接
}
}
}
Druid
导入jar包 druid
定义配置文件(properties形式,可放在任意文件夹)
获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
获取连接:getConnection
/*
druid获取数据库连接、打印连接对象
*/
public static void main(String[] args) throw SQLException{
//1、导入jar包
//2、定义配置文件
//3、加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
//4、获取连接池对象
DataSource ds = DruidDateSourceFactory.createDataSource(pro);
//5、获取连接
Connection conn = ds.getConnection();
//6、打印输出
System.out.println(conn);
}
定义JDBCUtils工具类
定义一个类 JDBCUtils
提供静态代码块配置文件,初始化连接池对象
提供方法
1、获取连接方法:通过数据库连接池获取连接
2、释放资源
3、获取连接池的方法
public static void main(String[] args){
//1、定义成员变量 DataSource
private static DataSource ds;
static{
try{
//1、加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
//2、获取连接池对象
DataSource ds = DruidDateSourceFactory.createDataSource(pro);
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
/*
获取连接
*/
public static void getConnection(String[] args) throw SQLException{
return ds.getConnection();
}
/*
释放资源
*/
public static void close(String stmt,Connection conn){
close(null,stmt,conn);
}
public static void close(ResultSet rs, String 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();
}
}
}
/*
获取连接池的方法
*/
public static DataSource getDataSource(){
return ds;
}
}
Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
1、导入jar包
2、创建jdbcTemplate对象,依赖于数据库DataSource
JdbcTemplate template = new JdbcTemplate(ds);
3、调用jdbcTemplate的方法来完成CRUD的操作
update():执行DML语句,增删改
//这个方法查询的结果集长度只能是一
queryForMap():查询结果将结果集封装在map集合
将列明作为key,将值作为value,将这条记录封装到一个map集合
//将每一条记录封装为一个Map集合,再讲Map集合装在到List集合中
queryForList():查询结果将结果集封装在List集合
//query的参数为RowMapper,一般使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装
//new BeanPropertyRowMapper<类型>(类型.class)
query():查询结果将结果封装为javaBean对象
//一般用于聚合函数的查询
queryForMap():查询结果将结果集封装为对象
/*
JDBCTemplate创建对象、调用方法
*/
public static void main(String[] ars){
//导入jar包
//创建JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//调用方法
String sql = "update account set balance = 5000 where id = ?";
int count = template.update(sql,3);
System.out.println(count);
}
/*
queryForMap()
queryForList() 方法代码演示
*/
public static void main(String[] ars){
//导入jar包
//创建JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//调用方法
String sql = "select * from emp";
List<Map<String,Object>> list = template.queryForList(sql);
for(Map<String,Object> stringObjectMap : list){
System.out.println(stringObjectMap);
}
}
/*
query():查询结果将结果封装为javaBean对象
*/
public static void main(String[] ars){
//导入jar包
//创建JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//调用方法
String sql = "select * from emp";
List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
for(Emp emp : list){
System.out.println(emp);
}
}