文章目录
JDBC概述
JDBC本质是什么?
- JDBC是SUN公司制定的一套接口(interface)
- 接口都有调用者和实现者
- 面向接口调用、面向接口写实现类,这都属于面向接口编程
为啥要面向接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力
多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
建议:
Animal a=new Cat();
//public void feed(Animal a){ //面向父类编程
}
不建议:
Dog d=new Dog();
- JDBC编程六步:
第一步:注册驱动(告诉Java程序要连接的是哪家的数据库)
第二步:获取链接(表示JVM的进程和数据库进程之间的通道打开,这是进程之间的通信,重量级的,使用完成后一定要关闭)
第三步:获取数据库操作对象(专门执行SQL语句的对象)
第四步:执行SQL语句(DQL、DML…)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有需要处理结果集)
第六步:释放资源(使用完资源后一定要关闭资源。Java和数据库之间属于进程间的通信,开启后一定要关闭)
连接数据库的几种方式
必须给的信息:
- 使用哪个数据库驱动
- url
- 用户名
- 密码
加载注册驱动
- 加载驱动用Class类的forName方法,将驱动类型放进去
- 注册驱动用DriverManger类的registerDriver方法
填写URL
- 通过URL选择正确的驱动程序
- 格式是协议+字协议+主机名+端口号+数据库名+参数,如jdbc:mysql://localhost:3306/db2
连接数据库的方式
方式一
public static void testConnection1() throws SQLException {
Driver driver=new com.mysql.cj.jdbc.Driver();
String url="jdbc:mysql://localhost:3306/atguigudb1?serverTimezone=GMT%2B8";
Properties info=new Properties();
info.setProperty("user","root");
info.setProperty("password","llll");
Connection conn=driver.connect(url,info);
System.out.println(conn);
}
方式二
public static void testConnection2() throws Exception {
//1.获取Driver实现类对象,使用反射获得
Class clazz=Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver=(Driver) clazz.newInstance();
String url="jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8";
Properties info=new Properties();
info.setProperty("user","root");
info.setProperty("password","llll");
Connection conn=driver.connect(url,info);
System.out.println(conn);
}
方式三
public static void testConnection3() throws Exception {
Class clazz=Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver=(Driver) clazz.newInstance();
String url="jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8";
String user="root";
String password="llll";
//注册驱动
DriverManager.registerDriver(driver);
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
方式四
public static void testConnection4() throws Exception {
String url="jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8";
String user="root";
String password="llll";
//2.加载Driver 不用显式的注册驱动 其实加载的过程也可以省略
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con=DriverManager.getConnection(url,user,password);
System.out.println(con);
}
方式五
//把连接数据库的信息放到配置文件中,直接进行连接
public static void testConnection5() throws Exception {
//1.读取配置文件中的基本信息
InputStream is=ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pros=new Properties();
pros.load(is);
String user=pros.getProperty("user");
String password=pros.getProperty("password");
String url=pros.getProperty("url");
String driverClass=pros.getProperty("driverClass");
Class.forName(driverClass);
Connection con=DriverManager.getConnection(url,user,password);
System.out.println(con);
}
利用JDBC操作数据库
- 进行增删改查必须借助Statement
- 但是Statement有弊端(需要拼串+会有SQL注入问题)
- 所以不用,用PreparedStatement
PreparedStatement
- 通过Connection对象调用 preparedStatement方法,把SQL语句写在方法参数
Statement的作用相当于快递员,我们把要执行的SQL写给它,它再把SQL传递给具体的数据库区执行
利用JDBC实现添加(insert)
public static void testInsert() throws IOException, ClassNotFoundException, SQLException {
//1.读取配置文件中的4个基本信息
InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros=new Properties();
pros.load(is);
String user=pros.getProperty("user");
String password=pros.getProperty("password");
String url=pros.getProperty("url");
String driverClass=pros.getProperty("driverClass");
//2.加载驱动
Class.forName(driverClass);
//3.获取链接
Connection con=DriverManager.getConnection(url,user,password);
//4.预编译Sql语句,返回PreparedStatement的实例
String sql="insert into account(id,name,balance)values(?,?,?)";
PreparedStatement ps=con.prepareStatement(sql);
//5.填充占位符
ps.setInt(1,6);
ps.setString(2,"猪小明");
ps.setDouble(3,50.00);
//6.执行操作
ps.execute();
//7.资源的关闭
ps.close();
}
利用JDBC实现删除(delete)
public static void testDelete() throws Exception{
//1.获取链接
Connection connection=JDBCUtils.getConnection();
//2.预编译sql语句
String sql="delete from account where id=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,2);
//3.执行
statement.execute();
//4.释放资源
JDBCUtils.closeResource(connection,statement);
}
包装相同的代码,实现修改(update)
我们发现用JDBC操作数据库时(增删改),都有相同部分的代码:获得数据库连接、关闭资源.
可以将这两部分代码包装在一个类中,直接调用,简化代码
封装
public class JDBCUtils {
public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException {
InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros=new Properties();
pros.load(is);
String user=pros.getProperty("user");
String password=pros.getProperty("password");
String url=pros.getProperty("url");
String driverClass=pros.getProperty("driverClass");
//2.加载驱动
Class.forName(driverClass);
//3.获取链接
Connection con= DriverManager.getConnection(url,user,password);
return con;
}
public static void closeResource(Connection conn, Statement ps) throws SQLException {
ps.close();
conn.close();
}
}
修改
public static void testUpdate() throws SQLException, IOException, ClassNotFoundException {
//1.获取链接
Connection connection= JDBCUtils.getConnection();
//2.预编译sql语句,返回PreparedStatement的实例
String sql="update account set name=? where id=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,"冷檬");
statement.setObject(2,6);
//执行
statement.execute();
//5.关闭资源
JDBCUtils.closeResource(connection,statement);
}
利用JDBC实现一个方法增删改
public static void main(String[] args) throws Exception {
String sql="delete from account where id=?";
update(sql,6);
}
public static void update(String sql,Object...args)throws Exception{
//1.获取数据库的连接
Connection connection=JDBCUtils.getConnection();
//2.预编译sql语句,返回PreparedStatement的实例
PreparedStatement statement=connection.prepareStatement(sql);
//3.填充占位符
for(int i=0;i<args.length;i++){
statement.setObject(i+1,args[i]);
}
//4.执行
statement.execute();
//5.关闭资源
JDBCUtils.closeResource(connection,statement);
}