JDBC
一、JDBC的概述
二、获取数据库连接
//1.JDBC: sun公司提供的一套api(java.sqL ,javax.sql ) ,
// 使用这套api可以实现对数据的连接和操作(DML、DDL )
// 2.如下代码来测试:
// 获取mysql数据库连接要想获取连接,准备工作:
// 1.mysqL服务开启
// 2.连接的基本条件:指名数据库的ip地址、端口号、用户名、密码
// 3.导入mysql的驱动(即为jdbc中相关接口的实现类的集合)
// 3.网络编程中的URL:代表着互联网当中的某一资源的地址
//http://192.168.21.34:8080/gmall/index.jsp?user=tom
//协议 ip地址 端口号 目标资源 参数列表
1.连接方式一
import org.junit.Test;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionText {
// 获取数据库的连接方式一
@Test
public void test1() throws SQLException{
//提供mysql 中 Driver 接口的实现类
Driver driver= new com.mysql.jdbc.Driver ();
//注册驱动
DriverManager.registerDriver (driver);
String url ="jdbc:mysql://localhost:3306/test";//test 表示具体的数据库
String user ="root";
String password ="fan1116.";
//获取连接
Connection connection = DriverManager.getConnection (url,user,password);
System.out.println (connection);
}
}
2.连接方式二(反射)
//获取数据库的连接方式二:使用反射实现Driver的实例化
//面向接口编程
@Test
public void test2() throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
//提供mysql 中 Driver 接口的实现类的对象
String className ="com.mysql.jdbc.Driver";
Class classzz=Class.forName (className);
Driver driver= (Driver) classzz.newInstance ();
//注册驱动
DriverManager.registerDriver (driver);
String url ="jdbc:mysql://localhost:3306/bjpowernode";//`bjpowernode 表示具体的数据库
String user ="root";
String password ="fan1116.";
//获取连接
Connection connection = DriverManager.getConnection (url,user,password);
System.out.println (connection);
}
3.连接方式三
// 获取数据库的连接方式三
@Test
public void test3() throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
//1.获取四个基本信息
String className ="com.mysql.jdbc.Driver";
String url ="jdbc:mysql://localhost:3306/bjpowernode";//`bjpowernode 表示具体的数据库
String user ="root";
String password ="fan1116.";
//2.加载驱动
Class.forName (className);
//3.获取连接
Connection connection = DriverManager.getConnection (url,user,password);
System.out.println (connection);
}
***4.连接方式四(配置文件)
className=com.mysql.jdbc.Driver
url =jdbc:mysql://localhost:3306/bjpowernode
user =root
password =fan1116.
//使用配置文件的好处?
//1.实现数据和代码的分离
//2.编写的java程序在部署到服务器上时,需要打包。I如果java代码修改过就需要重新打包。使用配置文件的方式,如果配置信息修改,并没有导致代码的修改。所以不需要重写打包。
// 获取数据库的连接方式四——将数据库连接的基本信息声明在配置文件中
@Test
public void test4() throws IOException, ClassNotFoundException, SQLException {
//读取配置文件中的四个信息
Properties properties=new Properties ();
//加载资源的路径默认为: src下
InputStream is= ClassLoader.getSystemClassLoader ().getResourceAsStream ("jdbc.properties");
properties.load(is);
String className= properties.getProperty ("className");
String url= properties.getProperty ("url");
String user= properties.getProperty("user");
String password= properties.getProperty ("password");
//2.加载驱动
Class.forName (className);
//3.获取连接
Connection connection = DriverManager.getConnection (url,user,password);
System.out.println (connection);
}
三、数据库连接池
1.使用数据库连接池的好处?
1.更方便的获取连接对象,效率高
2.资源可以更好的重复利用
3.便于进行必要的管理
2.有哪些数据库连接池技术呢?
DBCP :速度快,不稳定
C3Pe:稳定、速度慢
Druid:兼具二者兼备Datasource通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把Datasource称为连接池
3.使用Druid获取连接的方式1
import com.alibaba.druid.pool.DruidDataSource;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
public class DruidTest {
@Test
public void test1() throws SQLException {
DruidDataSource source = new DruidDataSource ();
//设置四个基本信息
source.setUsername ("root");
source.setPassword ("fan1116.");
source.setUrl ("jdbc:mysql://localhost:3306/bjpowernode");
source.setDriverClassName ("com.mysql.jdbc.Driver");
Connection connection=source.getConnection ();
System.out.println (connection);
//设置最大可以连接的连接池数量为6
source.setMaxActive (6);
}
}
4.使用Druid获取连接的方式2(将数据库连接的基本信息声明在配置文件中)
DriverClassName=com.mysql.jdbc.Driver
url =jdbc:mysql://localhost:3306/bjpowernode
username =root
password =fan1116.
@Test
public void test2() throws Exception {
//提供Properties,并加载指令
Properties pros=new Properties ();
//加载资源的路径默认为: src下
InputStream is= ClassLoader.getSystemClassLoader ().getResourceAsStream ("Druid.properties");
pros.load (is);
//通过DruidDataSourceFactory创建一个数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource (pros);
//通过数据源获取连接
System.out.println (dataSource.getConnection ());
}
***5.生成JDBCUtils
package util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/*
提供JDBC的工具类,用于获取数据库的连接等操作
*/
public class JDBCUtils {
//获取数据库连接的方式
public static Connection getconnection() throws Exception {
//提供Properties,并加载指令
Properties pros = new Properties ();
//加载资源的路径默认为: src下
InputStream is = ClassLoader.getSystemClassLoader ().getResourceAsStream ("Druid.properties");
pros.load (is);
//通过DruidDataSourceFactory创建一个数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource (pros);
//通过数据源获取连接
Connection connection = dataSource.getConnection ();
return connection;
}
//资源的关闭
public static void close(Connection connection) {
if(connection!=null){
try {
connection.close ();
} catch (SQLException e) {
e.printStackTrace ();
}
}
}
}
package test;
import org.junit.Test;
import util.JDBCUtils;
import java.sql.Connection;
public class JDBCUtilsTest {
@Test
public void test1() throws Exception{
Connection connection= JDBCUtils.getconnection ();
System.out.println (connection);
}
}
三、数据表的增添查改
1.使用QueryRunner向数据表中插入数据
连接 JDBCUtils 类
package crud;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import util.JDBCUtils;
import java.sql.Connection;
//测试向表中增加、删除、修改
public class UpdateTest {
//向数据表中增加一条记录
@Test
public void test1() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.提供一个添加的SQL
String sql="insert into copy(ename,sal)values('霸王花',9999)";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner=new QueryRunner ();
int count = runner.update (getconnection,sql);
System.out.println ("添加了"+count+"记录");
} catch (Exception e) {
e.printStackTrace ();
} finally {
//4.资源的关闭
JDBCUtils.close(getconnection);
}
}
}
2.使用带占位符的sql添加记录
package crud;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import util.JDBCUtils;
import java.sql.Connection;
//测试向表中增加、删除、修改
public class UpdateTest {
//向数据表中增加一条记录
@Test
public void test2() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.提供一个占位符的SQL
String sql="insert into copy(ename,sal)values(?,?)";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner=new QueryRunner ();
int count = runner.update (getconnection,sql,"fan",990);
System.out.println ("添加了"+count+"记录");
} catch (Exception e) {
e.printStackTrace ();
} finally {
//4.资源的关闭
JDBCUtils.close(getconnection);
}
}
}
package util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/*
提供JDBC的工具类,用于获取数据库的连接等操作
*/
public class JDBCUtils {
//获取数据库连接的方式
public static Connection getconnection() throws Exception {
//提供Properties,并加载指令
Properties pros = new Properties ();
//加载资源的路径默认为: src下
InputStream is = ClassLoader.getSystemClassLoader ().getResourceAsStream ("Druid.properties");
pros.load (is);
//通过DruidDataSourceFactory创建一个数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource (pros);
//通过数据源获取连接
Connection connection = dataSource.getConnection ();
return connection;
}
//资源的关闭
public static void close(Connection connection) {
if(connection!=null){
try {
connection.close ();
} catch (SQLException e) {
e.printStackTrace ();
}
}
}
}
3.删除记录的操作
//向数据表中删除一条记录
@Test
public void test3() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.提供一个占位符的SQL
String sql="delete from copy where sal > ?";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner=new QueryRunner ();
int count = runner.update (getconnection,sql,1000);
System.out.println ("删除了"+count+"记录");
} catch (Exception e) {
e.printStackTrace ();
} finally {
//4.资源的关闭
JDBCUtils.close(getconnection);
}
}
4.修改记录的操作
//向数据表中修改一条记录
@Test
public void test4() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.提供一个占位符的SQL
String sql="update copy set ename=? where sal=?";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner=new QueryRunner ();
int count = runner.update (getconnection,sql,"fan",666);
System.out.println ("删除了"+count+"记录");
} catch (Exception e) {
e.printStackTrace ();
} finally {
//4.资源的关闭
JDBCUtils.close(getconnection);
}
}
5.BeanHandle和BeanListHandle查询表中的记录
package crud;
import bean.Customer;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import util.JDBCUtils;
import java.sql.Connection;
import java.util.List;
public class QueryTest {
//BeanHandler对应查询表中的一条记录,以对象的身份
@Test
public void test1() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.获取一条带占位符的查询语句
String sql="select ename from copy where ename=?";
//3.创建QueryRunner的实例
QueryRunner runner=new QueryRunner ();
//4.通过QueryRunner的实例,调用其query()
BeanHandler<Customer> handler=new BeanHandler (Customer.class);
Customer customer = runner.query (getconnection, sql, handler, "fan");
System.out.println (customer);
} catch (Exception e) {
e.printStackTrace ();
} finally {
//5.关闭资源
JDBCUtils.close (getconnection);
}
}
//BeanListHandler :对应查询表中的多条记录,以对象构成的集合的方式返回
@Test
public void test2() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.获取一条带占位符的查询语句
String sql="select sal from copy where sal>?";
//3.创建QueryRunner的实例
QueryRunner runner=new QueryRunner ();
//4.通过QueryRunner的实例,调用其query()
BeanListHandler<Customer> handler=new BeanListHandler (Customer.class);
List<Customer> customerList = runner.query (getconnection, sql, handler, 100);
customerList.forEach (System.out::println);
} catch (Exception e) {
e.printStackTrace ();
} finally {
//5.关闭资源
JDBCUtils.close (getconnection);
}
}
}
package bean;
public class Customer<varchar> {
/* ORM编程思想:
数据库中的一个表 与 Java中的一个类对应
表中的一条记录 与 类中一个对象对应
表中的一个列(或字段) 与 类中的一个属性对应
*/
private varchar ename;
private double sal;
public varchar getEname() {
return ename;
}
public void setEname(varchar ename) {
this.ename = ename;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public Customer() {
}
public Customer(varchar ename, double sal) {
this.ename = ename;
this.sal = sal;
}
@Override
public String toString() {
return "Customer{" + "ename=" + ename + ", sal=" + sal + '}';
}
}
6.MapHandler_MapListHandler_ScalarHandler的使用
import bean.Customer;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import util.JDBCUtils;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
public class QueryTest {
//MapHandler :对应查询表中一条记录,以map对象的方式返回
//map中的key为表中的字段名,map中的value为表中一条数据的数据值
@Test
public void test3() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.获取一条带占位符的查询语句
String sql="select ename,sal from copy where sal>?";
//3.创建QueryRunner的实例
QueryRunner runner=new QueryRunner ();
//4.通过QueryRunner的实例,调用其query()
ResultSetHandler<Map<String,Object>> mapHandler = new MapHandler ();
Map<String, Object> map= runner.query (getconnection, sql, mapHandler, 100);
System.out.println (map);
} catch (Exception e) {
e.printStackTrace ();
} finally {
//5.关闭资源
JDBCUtils.close (getconnection);
}
}
//MapListHandler :对应查询表中的多条记录,以map对象构成maplist的方式返回
//map中的key为表中的字段名,map中的value为表中一条数据的数据值
@Test
public void test4() {
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.获取一条带占位符的查询语句
String sql="select ename,sal from copy where sal>?";
//3.创建QueryRunner的实例
QueryRunner runner=new QueryRunner ();
//4.通过QueryRunner的实例,调用其query()
ResultSetHandler< List<Map<String, Object>> > mapListHandler = new MapListHandler ();
List<Map<String, Object>> mapList = runner.query (getconnection, sql, mapListHandler, 100);
mapList.forEach (System.out::println);
} catch (Exception e) {
e.printStackTrace ();
} finally {
//5.关闭资源
JDBCUtils.close (getconnection);
}
}
/*
* scalarHandler:用于查询表中的特殊值
*/
@Test
public void test5(){
Connection getconnection = null;
try {
//1.获取数据库的连接
getconnection = JDBCUtils.getconnection ();
//2.获取一条带占位符的查询语句
String sql="select count(*) from copy";
//3.创建QueryRunner的实例
QueryRunner runner=new QueryRunner ();
//4.通过QueryRunner的实例,调用其query()
ScalarHandler<Object> handler = new ScalarHandler<> ();
long count = (long) runner.query (getconnection, sql, handler);
System.out.println ("一共查询到"+count +"条数据");
} catch (Exception e) {
e.printStackTrace ();
} finally {
//5.关闭资源
JDBCUtils.close (getconnection);
}
}
}
}
}
7.属性名和字段名不一致的情况——使用别名
如果表中的字段名与类中的属性名不一致,为了查询操作结果的准确性,我们需要编写sqL时,使用类的属性名作为select后字段的别名出现。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tSMINQB-1643371823229)(C:\Users\86173\AppData\Roaming\Typora\typora-user-images\image-20211115230548012.png)]
String sql="select count(*) from copy";
//3.创建QueryRunner的实例
QueryRunner runner=new QueryRunner ();
//4.通过QueryRunner的实例,调用其query()
ScalarHandler<Object> handler = new ScalarHandler<> ();
long count = (long) runner.query (getconnection, sql, handler);
System.out.println ("一共查询到"+count +"条数据");
} catch (Exception e) {
e.printStackTrace ();
} finally {
//5.关闭资源
JDBCUtils.close (getconnection);
}
}
}
}
}
## 7.属性名和字段名不一致的情况——使用别名
> 如果表中的字段名与类中的属性名不一致,为了查询操作结果的准确性,我们需要编写sqL时,使用类的属性名作为select后字段的别名出现。
![在这里插入图片描述](https://img-blog.csdnimg.cn/11229304275143d6911c7e204c181364.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSn5Zmo5pma5oiQaQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)