Jdbc入门
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jdbc入门相关的知识,希望对你有一定的参考价值。
Jdbc入门
- Jdbc本质(一套接口)
- 数据库事物的引入
Jdbc本质(一套接口)
1.jdbc 是什么?
Java DataBase Connectivity(Java语言连接数据库)
2.jdbc的本质是什么?
jdbc是sun 公司指定的一套
接口
。 接口都有调用者和实现者。
面向接口调用、面向接口写实现类,这都属于面向接口编程。
接i都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于面向接口编程。
思考:为什么sun公司要制定一套jdbc接口呢?
因为每一个数据库的实现原理都不一样。
Oracle有自己的实现原理。
mysql也有自己的实现原理。
MysqlServer也有自己的实现原理。
。。
每一个数据库都有自己独特的实现原理
3. JDBC体系结构
JDBC接口(API)包括两个层次︰
1.面向应用的API : JavaAPI,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
2.面向数据库的API: Java Driver API,供开发商开发数据库驱动程序用。
JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。
不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。
4.JDBC编程六步(需要背会)
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示Java的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要)第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行sql语句(DQLDML…)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
5.获取数据库连接的方法
方法一:
@Test
public void testConnection1() throws SQLException
Driver driver=new com.mysql.cj.jdbc.Driver();
//url:http://localhost:8080/gmall/keyboard.jpg
//jdbc:mysql协议
//localhost:ip地址
//3306:默认mysql的端口号
//mybatis:mybatis的数据库
//注册驱动:告诉Java程序,即将要连接的是哪个品牌的数据库
String url="jdbc:mysql://localhost:3306/mybatis";
//获取连接:表示java进程和数据库进程之间的通道打开了,这属于进程之间的通信
//将用户名和密码封装在Properties中
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","");
Connection conn=driver.connect(url,info);
System.out.println(conn);
方法二:
//方式二:对方式一的迭代
@Test
public void testConnection2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException
//获取Driver实现类对象,使用反射
Class<?> aClass = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver=(Driver)aClass.newInstance();
String url="jdbc:mysql://localhost:3306/mybatis";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","");
Connection conn=driver.connect(url,info);
System.out.println(conn);
//方式三:使用DriverManage替换Driver
@Test
public void testConnection() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException
//1.获取Driver的实现类对象
Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver=(Driver)clazz.newInstance();
//2.提供另外三个连接的基本信息
String url="jdbc:mysql://localhost:3306/mybatis";
String user="root";
String password="";
//注册驱动
DriverManager.registerDriver(driver);
//获取连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
//方法四:可以只是加载驱动,不用显示的注册驱动
@Test
public void testConnection4() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException
//2.提供另外三个连接的基本信息
String url="jdbc:mysql://localhost:3306/mybatis";
String user="root";
String password="";
//1.获取Driver的实现类对象
Class.forName("com.mysql.cj.jdbc.Driver");
// Driver driver=(Driver)clazz.newInstance();
//注册驱动
// DriverManager.registerDriver(driver);
//为什么可以省略上述操作呢?
/*
* 在mysql的Driver实现类中,声明了如下操作
* static
try
DriverManager.registerDriver(new Driver());
catch (SQLException var1)
throw new RuntimeException("Can't register driver!");
*
*
* */
//获取连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别?
复习反射的三种 类加载器
https://www.cnblogs.com/yjl49/archive/2012/08/08/2628502.html
Properties类总结https://blog.csdn.net/yelang0/article/details/76449165
方式五:(复习)
/方式五:将数据库连接需要的四个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
@Test
public void testConnection5() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException, IOException
//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 driver=pros.getProperty("driver");
//2.加载驱动
Class.forName(driver);
//3.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
如果出现空指针异常,有可能是properties的存放位置不对。
ser=root
password=
url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
driver=com.mysql.cj.jdbc.Driver
导入driver驱动
注意:每新建一个moudle建立数据库连接的时候都要执行这三步
5.1精简版(复习)
1.获取数据库连接核心代码两步:
1.注册驱动 注意Class.forName().newInstance()的使用
//注册驱动
DriverManager.registerDriver(driver);
2.获取连接
//获取连接
Connection connection = DriverManager.getConnection(url, user, pwd);
if(connection!=null)
System.out.println("连接成功");
3.运行
import org.junit.Test;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @description:使用DriverManager获取数据库连接
* @author: Ada
* @time: 2022/3/14
*/
public class MyConnectionTest
@Test
public void test() throws Exception
//com.mysql.cj.jdbc.Driver driver = new com.mysql.cj.jdbc.Driver();
Driver driver = (Driver)Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
//注册驱动
DriverManager.registerDriver(driver);
String url="jdbc:mysql://localhost:3306/mybatis";
String user="root";
String pwd="";
//获取连接
Connection connection = DriverManager.getConnection(url, user, pwd);
if(connection!=null)
System.out.println("连接成功");
6.使用Statement的弊端
需要拼写sql语句,并且存在SQL注入的问题
三个判断,最后while 1=1是true.
//如歌避免sql注入,使用PrepareStatement(从Statement扩展而来)取代Statement
7.使用PrepareStatement实现增删改查
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
/*
*
* 使用PreparedStatement来替换Statement,实现对数据表的增删改查操作
*
* */
public class PreparedStatementUpdateTest
@Test
public void testConnection5() throws Exception
PreparedStatement ps= null;
Connection conn=null;
try
//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 driver=pros.getProperty("driver");
//2.加载驱动
Class.forName(driver);
//3.获取连接
conn = DriverManager.getConnection(url, user, password);
//4.预编译sql语句,返回PreparedStatement实例
String sql="insert into user(id,name,pwd)values(?,?,?)";
ps = conn.prepareStatement(sql);
//5.填充占位符
ps.setInt(1,4);
ps.setString(2,"王红");
ps.setString(3,"345678");
//6.执行sql
ps.execute();
catch (Exception e)
e.printStackTrace();
finally
//7.资源的关闭
try
if(ps!=null)
ps.close();
catch (SQLException e)
e.printStackTrace();
try
if(conn!=null)
conn.close();
catch (SQLException e)
e.printStackTrace();
补充知识点:idea设置类注释和方法注释
https://blog.csdn.net/weixin_39911998/article/details/114114030?
易错点:
1.如果出现乱码,在properties属性文件中的url后面添加
?characterEncoding=UTF-8设置一下字符集
实现通用的增删改查操作
为什么有些String需要加双引号而有些不需要
双引号表示字符串
比如
定义 int a(string s)
调用时可以 a(“asdas”)
“asdas”就表示一个字符串
当然也可以
string str=“asdasd”
a(str)这样使用
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
/*
*
* 使用PreparedStatement来替换Statement,实现对数据表的增删改查操作
*
* */
public class PreparedStatementUpdateTest
//修改customers表的一条记录
@Test
public void testUpdate()
PreparedStatement ps= null;
Connection conn=null;
//1.获取数据库的连接
try
conn = JDBCutils.getConnection();
//2.预编译sql语句,返回PreparedStatement的实例
String sql ="update user set name = ? where id = ? ";
ps = conn.prepareStatement(sql);
//3.填充占位符
ps.setString(1,"莫扎特");
ps.setInt(2,2);
//4.执行
ps.execute();
//5.资源的关闭
JDBCutils.closeResource(ps,conn);
catch (Exception e)
e.printStackTrace();
finally
try
if(conn!=null)
conn.close();
catch (SQLException e)
e.printStackTrace();
try
if(ps!=null)
ps.close();
catch (SQLException e)
e.printStackTrace();
@Test
public void testConnection5() throws Exception
PreparedStatement ps= null;
Connection conn=null;
try
//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 driver=pros.getProperty("driver");
//2.加载驱动
Class.forName(driver);
//3.获取连接
conn = DriverManager.getConnection(url, user, password);
//4.预编译sql语句,返回PreparedStatement实例
String sql="insert into user(id,name,pwd)values(?,?,?)";
ps = conn.prepareStatement(sql);
//5.填充占位符
ps.setInt(1,4);
ps.setString(2,"王红");
ps.setString(3,"345678");
//6.执行sql
ps.execute();
catch (Exception e)
e.printStackTrace();
finally
//7.资源的关闭
try
if(ps!=null)
ps.close();
catch (SQLException e)
e.printStackTrace();
try
if(conn!=null)
conn.close();
catch (SQLException e)
e.printStackTrace();
实现通用的增删改查
public class PreparedStatementUpdateTest
@Test
public void testCommonUpdate()
String sql="delete from user where id=?";
update(sql,4);
//通用的增删改查操作
public void update(String sql,Object ...args)
Connection conn=null;
PreparedStatement ps=null;
//1.获取数据库连接
try
conn = JDBCutils.getConnection();
//2.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i=0;i<args.length;i++)
ps.setObject(i+1,args[i]);
//4.执行
ps.execute();
catch (Exception e)
e.printStackTrace();
finally
//关闭资源
JDBCutils.closeResource(ps,conn);
Java与SQL对应数据类型转换表
7.1查
以上是关于Jdbc入门的主要内容,如果未能解决你的问题,请参考以下文章