JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
JDBC编程涉及的三个部分
1.应用程序
开发人员编写的客户端程序。在应用程序中调用JDBC API,将SQL语句发送到数据库并检索结果。
2.驱动程序管理器
JDBC将驱动程序管理器负责使用正确的JDBC驱动程序和连接信息访问数据库,在Java应用程序和数据库之间建立连接
3.驱动程序
驱动程序由数据库厂商提供,实现数据库驱动接口。能够把SQL指令正确发送到数据库服务器。
先在java工程下创建一个lib文件夹
将下图jar文件复制到lib下
右键选择properties
最后点击apply and close
打开Referenced Libraries
找到com.mysql.cj.jdbc.Driver
将复制的内容粘贴到Class.forName()里
Statement:每次执行都会在sql语句进行编译
public static void main(String[] args) {
try {
String url = "jdbc:mysql://localhost:3306/store?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
String sql = "insert into emp values(0,10,'李四','123456',0,22,'长安南路','2142123',15000)";
Class.forName("com.mysql.cj.jdbc.Driver");// 加载驱动
Connection con = DriverManager.getConnection(url, "root", "1234");// 得到连接对象,Connection是个接口
Statement st = con.createStatement();// 创建sql操作面板,Statement是个接口
boolean flag = st.execute(sql);// 执行sql操作,并返回结果
System.out.println(flag);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
PreparedStatement:表示预编译的sql语句的对象,每次执行只需要传参就可以直接执行,不需要对sql再进行编译,效率高,开发主要使用
public static void main(String[] args) {
try {
String url = "jdbc:mysql://localhost:3306/store?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
String sql = "insert into emp values(0,?,?,?,?,?,?,?,?)";// ?占位符,等待传参
Class.forName("com.mysql.cj.jdbc.Driver");// 加载驱动
Connection con = DriverManager.getConnection(url, "root", "1234");// 得到连接对象,Connection是个接口
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, 20);// 第一个问号,赋值20。在创建表时,第二个是部门int类型,所以这里用setInt
ps.setString(2, "王五");
ps.setString(3, "123");
ps.setString(4, "1");
ps.setInt(5, 20);
ps.setString(6, "长安东路");
ps.setString(7, "1531651515");
ps.setFloat(8, 14000);
int result = ps.executeUpdate();
ps.close();
con.close();
System.out.println(result);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
jdbc: java 和数据库的桥梁。
步骤如下:
注册驱动 Class.forName() --一次
建立连接 Connection ----每一次
预处理对象PreparedStatement
Statement对象
PreparedStatement对象
public interface PreparedStatement extends Statement
Statement : sql拼接 SQL注入漏洞
String s = “猫”;
String k = “波斯猫’ OR 1='1”;
“Select * from pet_tab WHERE pet_category=’” +s+"’ AND pet_kind=“ ‘+k+"’"
SELECT * FROM pet_tab WHERE pet_category=‘猫’ AND pet_kind =‘xxx’ OR 1=‘1’
执行SQL
关闭连接 —每一次
建立连接(消耗资源) …关闭连接(释放资源)
定义好连接数–先创建10个连接/建立连接后存储再池子中
从池子中查找是否有空闲连接
使用空闲连接
放回池子中
阿里的开源连接池框架
1.创建druid.properties文件
druid.driver = com.mysql.cj.jdbc.Driver
druid.url = jdbc:mysql://localhost:3306/mvc_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
druid.username=root
druid.password=1234
2.使用Properties对象,读取配置信息
String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String fileName = path + "/com/dyit/resources/druid.properties";
try {
prop.load(new FileReader(fileName));
} catch (IOException e) {
Logger.getLogger(JdbcUtil.class).debug(e.getMessage());
e.printStackTrace();
}
3.创建数据源对象DruidDataSource
private static void init() {
ds = new DruidDataSource();
ds.configFromPropety(Config.prop());
Logger.getLogger(JdbcUtil.class).debug("数据源配置成功," + ds);
}
4.建立连接
public static void connect() {
try {
conn = ds.getConnection();
} catch (SQLException e) {
Logger.getLogger(JdbcUtil.class).debug(e.getMessage());
e.printStackTrace();
}
}
jdbc–> 封装(static)–>properties(配置文件)–>数据源(dbcp)–>单例