驱动:声卡,显卡,数据库
graph TB ID1[应用程序] --> ID2[MysqL驱动] ID1 --> ID3[Oracle驱动] ID2 --> ID4[数据库] subgraph 数据库厂商 ID2 ID3 end ID3 --> ID4我们的程序会通过数据库驱动,和数据库打交道
2. JDBCSUN公司为了简化开发人员对数据库的统一 *** 作,提供了一个JAVA *** 作数据库的规范,俗称JDBC
这些规范的实现由具体的厂商去做
对于开发人员来说,我们只需要掌握JDBC的接口 *** 作即可!
graph TB ID1[应用程序] --> ID2[JDBC] ID2 --> ID3[MysqL驱动] ID2 --> ID4[Oracle驱动] ID3 --> ID5[数据库] ID4 --> ID5 subgraph 开发人员 ID2 end subgraph 数据库厂商 ID3 ID4 endjava.sql
javax.sql
还需要导入一个数据库驱动包 mysql-connector-java-5.1.48.jar
3. 第一个JDBC程序创建测试数据库
create database jdbcStudy character set utf8 collate utf8_general_ci;use jdbcStudy;create table `users`(ID int primary key,name varchar(40),password varchar(40),email varchar(60),birthday date);insert into `users`(ID,name,password,email,birthday)values(1,'zhansan','123456','zs@sina.com','1980-12-04'),(2,'lisi','lisi@sina.com','1981-12-04'),(3,'wangwu','wangwu@sina.com','1979-12-04')
创建一个普通项目
导入数据库驱动
注意,创建lib目录并复制jar包后,需要进行以下的 *** 作才能导入!
编写测试代码
package com.wang.lesson01;import java.sql.*;//我的第一个jdbc程序public class jdbcFirstDemon01 { public static voID main(String[] args) throws ClassNotFoundException,sqlException { //1.加载驱动 Class.forname("com.MysqL.jdbc.Driver"); //固定写法,加载驱动 //2.用户信息和URL //URL ?前的内容是jdbc:使用的数据库厂商://主机名:端口号/数据库的名称 //URL ?后的内容 useUnicode=true&characterEnCoding=utf8&useSSL=true //第一个参数:使用unicode编码,可以显示中文 //第二个参数:设定字符集为utf-8 //第三个参数:使用安全的的连接 String url = "jdbc:MysqL://localhost:3306/jdbcstudy?useUnicode=true&characterEnCoding=utf8&useSSL=true"; String username = "root"; String password = "123456"; //3.连接成功,数据库对象 Connection代表数据库 Connection connection = DriverManager.getConnection(url,username,password); //al + enter //4.执行sql的对象 Statement执行sql的对象 Statement statement = connection.createStatement(); //5.执行sql的对象 去执行sql,可能存在结果,返回查看结果 ResultSet resultSet = statement.executequery(sql); //返回的结果集,结果集中封装了我们全部查询出来的结果 while (resultSet.next()) { System.out.println(("ID=" + resultSet.getobject("ID"))); System.out.println(("name=" + resultSet.getobject("name"))); System.out.println(("password=" + resultSet.getobject("password"))); System.out.println(("email=" + resultSet.getobject("email"))); System.out.println(("birthday=" + resultSet.getobject("birthday"))); System.out.println("===================================="); } //6.释放连接 resultSet.close(); statement.close(); connection.close(); }}
步骤总结:
加载驱动
连接数据库DriverManager
获得自信sql的对象 Statement
获得返回的结果集
释放连接
4. DriveManager//建议写第二种写法//DriverManager.registerDriver(new com.MysqL.jdbc.Driver());Class.forname("com.MysqL.jdbc.Driver"); //固定写法,加载驱动//Connection代表数据库Connection connection = DriverManager.getConnection(url,password); //数据库设置自动提交connection.setautoCommit();//事务提交connection.commit();//事务回滚connection.rollback();
5. URLString url = "jdbc:MysqL://localhost:3306/jdbcstudy? useUnicode=true&characterEnCoding=utf8&useSSL=true";//MysqL默认port 3306//协议://主机地址:端口号/数据库名?参数1&参数2&参数3 //orale默认端口1521//jdbc:oracle:thin:@localhost:1521:sID
6. Statement执行sql的对象
String sql = "select * from users"; //编写sqlstatement.executequery(); //查询 *** 作 返回ResultSetstatement.execute(); //执行任何sqlstatement.executeUpdate(); //更新,插入,删除都是用这个,返回一个受影响的行数
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删。改的SQL语句,executeUpdate执行完后,将会返回一个整数(级增删改语句导致了数据库几行数据发生了变化)。
Statement。executequery方法用于向数据库发送查询语句,executequery方法返回代表查询结果的ResultSet对象
1. CRUD *** 作-create使用executeUpdate(String sql)完成数据添加的 *** 作
Statement st = conn.createStatement();String sql = "insert into user (`XXX`,`XXX`,...) values (XXX,XXX,...)";int num = st.executeUpdate(sql);if(num > 0) { System.out.println("insert successfully!"); //如果受影响的行数大于1,则说明插入成功}
2. CRUD *** 作-delete使用executeUpdate(String sql)方法完成数据删除 *** 作
Statement st = conn.createStatement();String sql = "delete from user where ID = 1";int num = st.executeUpdate(sql);if(num > 0) { System.out.println("delete successfully!"); //如果受影响的行数大于1,则说明删除成功}
3. CRUD *** 作-update使用executeUpdate(String sql)方法完成数据修改 *** 作
Statement st = conn.createStatement();String sql = "update user set name = '' where name = ''";int num = st.executeUpdate(sql);if(num > 0) { System.out.println("delete successfully!"); //如果受影响的行数大于1,则说明更新成功}
4. CRUD *** 作-read使用executequery(String sql)方法完成数据查询 *** 作
Statement st = conn.createStatement();String sql = "select * from user where ID = 1";ResultSet rs = st.executequery(sql);while(re.next()) { //根据获取列的数据类型,分别调用rs的相应方法映射到Java对象中}
5. 代码实现1. 提取工具类driver = com.MysqL.jdbc.Driverurl = jdbc:MysqL://localhost:3306/jdbcstudy?useUnicode=true&characterEnCoding=utf8&useSSL=trueusername = rootpassword = 123456
package com.wang.lesson02.utils;import java.io.inputStream;import java.sql.*;import java.util.PropertIEs;public class JdbcUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static { try { inputStream in = JdbcUtils.class.getClassLoader().getResourceAsstream("db.propertIEs"); PropertIEs propertIEs = new PropertIEs(); propertIEs.load(in); driver = propertIEs.getProperty("driver"); url = propertIEs.getProperty("url"); username = propertIEs.getProperty("username"); password = propertIEs.getProperty("password"); //1.驱动只用加载一次 Class.forname(driver); } catch (Exception e) { e.printstacktrace(); } } //获取连接 public static Connection getConnection() throws sqlException { return DriverManager.getConnection(url,password); } //释放连接资源 public static voID release(Connection conn,Statement st,ResultSet rs) { if (rs != null) { try { rs.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } if (st != null) { try { st.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } if (conn != null) { try { conn.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } }}
2. 编写增删改的方法,使用executeUpdate方法package com.wang.lesson02;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.sqlException;import java.sql.Statement;public class TestInsert { public static voID main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //获取数据库连接 st = conn.createStatement(); //获得sql的执行对象 String sql = "insert into users(ID,`name`,`password`,`email`,`birthday`)" + "values(4,'wang','123456789@qq.com','2020-01-01')"; int i = st.executeUpdate(sql); if (i > 0) { System.out.println("插入成功!"); } } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,st,rs); } }}
package com.wang.lesson02;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.sqlException;import java.sql.Statement;public class TestDelete { public static voID main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //获取数据库连接 st = conn.createStatement(); //获得sql的执行对象 String sql = "delete from `users` where ID = 1"; int i = st.executeUpdate(sql); if (i > 0) { System.out.println("删除成功!"); } } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,rs); } }}
package com.wang.lesson02;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.sqlException;import java.sql.Statement;public class TestUpdate { public static voID main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //获取数据库连接 st = conn.createStatement(); //获得sql的执行对象 String sql = "update users set `name` = 'wang_sky' where ID = 4"; int i = st.executeUpdate(sql); if (i > 0) { System.out.println("更新成功!"); } } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,rs); } }}
4. 查询package com.wang.lesson02;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.sqlException;import java.sql.Statement;public class TestSelect { public static voID main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //获取数据库连接 st = conn.createStatement(); //获得sql的执行对象 String sql = "select * from users where ID = 2"; rs = st.executequery(sql); //查询完毕会返回一个结果集 while (rs.next()) { System.out.println(rs.getString("name")); } } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,rs); } }}
7. ResultSet查询的结果集:封装了所有的查询结果
获得指定的数据类型
resultSet.getobject(); //在不知道列类型的情况下使用//如果知道列的类型就使用指定的类型resultSet.getString(); resultSet.getInt();resultSet.getfloat();resultSet.getDate();...
遍历,指针
resultSet.beforeFirst(); //移动到最前面resultSet.afterLast(); //移动到最后面resultSet.next(); //移动到下一个数据resultSet.prevIoUs(); //移动到前一行resultSet.absolute(row); //移动到指定行(row)
8. 释放资源//6.释放连接resultSet.close();statement.close();connection.close(); //耗资源,用完关掉
9. sql注入的问题sql存在漏洞,会被攻击导致数据泄露
本质:sql会被拼接or
package com.wang.lesson02;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.sqlException;import java.sql.Statement;public class sqlInject { public static voID main(String[] args) { //login("lisi","123456"); login(" 'or '1=1","' or '1=1"); } //登陆业务 public static voID login(String username,String password) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); st = conn.createStatement(); //sql //select * from users where `name` = 'lisi' and `password` = '123456'; //select * from users where `name` = '' or '1=1' and `password` = '' or '1 = 1'; //上面语句中'' or '1 = 1'为null 或 true,保证永远为真 String sql = "select * from users where `name` = '" + username + "' and `password` = '" + password + "'"; rs = st.executequery(sql); while (rs.next()){ System.out.println(rs.getString("name")); System.out.println(rs.getString("password")); System.out.println("========================="); } } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,rs); } }}
10. PreparedStatement对象可以防止sql注入,并且效率更高!
1. insertpackage com.wang.lesson03;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.sqlException;import java.util.Date;public class TestInsert { public static voID main(String[] args) { Connection conn = null; PreparedStatement st = null; try { conn = JdbcUtils.getConnection(); //区别 //使用?占位符代替参数 String sql = "insert into users(ID,`birthday`) values(?,?,?)"; st = conn.prepareStatement(sql); //预编译sql:先写sql,不执行 //手动给参数赋值 st.setInt(1,5); st.setString(2,"wang"); st.setString(3,"456789"); st.setString(4,"456789@qq.com"); //注意点:sql.Date sql java.sql.Date()传入时间戳获得sql的Date // util.Date Java new Date().getTime()获得时间戳 st.setDate(5,new java.sql.Date(new Date().getTime())); //执行 int i = st.executeUpdate(); if (i >0) System.out.println("插入成功!"); } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,null); } }}
2. deletepackage com.wang.lesson03;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.sqlException;import java.util.Date;public class TestDelete { public static voID main(String[] args) { Connection conn = null; PreparedStatement st = null; try { conn = JdbcUtils.getConnection(); //区别 //使用?占位符代替参数 String sql = "delete from users where `ID` = ?"; st = conn.prepareStatement(sql); //预编译sql:先写sql,不执行 //手动给参数赋值 st.setInt(1,5); //执行 int i = st.executeUpdate(); if (i >0) System.out.println("删除成功!"); } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,null); } }}
3. updatepackage com.wang.lesson03;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.sqlException;public class TestUpdate { public static voID main(String[] args) { Connection conn = null; PreparedStatement st = null; try { conn = JdbcUtils.getConnection(); //区别 //使用?占位符代替参数 String sql = "update users set `name` = ? where `name` = ?;"; st = conn.prepareStatement(sql); //预编译sql:先写sql,不执行 //手动给参数赋值 st.setString(1,"wang"); st.setString(2,"wang_sky"); //执行 int i = st.executeUpdate(); if (i >0) System.out.println("更新成功!"); } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,null); } }}
4. selectpackage com.wang.lesson03;import com.wang.lesson02.utils.JdbcUtils;import java.sql.*;public class TestSelect { public static voID main(String[] args) { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); String sql = "SELECT * from users where `ID` = ?"; st = conn.prepareStatement(sql); st.setInt(1,2); //传递参数 rs = st.executequery(); if (rs.next()) { System.out.println(rs.getString("name")); } } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils.release(conn,rs); } }}
5. PreparedStatement防止sql注入的本质把传递进来的参数当做字符
假设其中存在转义字符,比如说 ' 会被直接转义
11. 事务要么都成功,要么都失败
1. ACID原则:原子性:要么全部完成,要么都不完成一致性:总数不变隔离性:多个进程互不干扰持久性:一单提交不可逆,持久化到数据库2. 隔离性的问题:脏读:一个事务读取了另一个没有提交的事务不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变虚读(幻读):在同一个事务内,读取到了别人插入的数据,到最后前后读出结果不一致3. 代码实现开启事务 conn.setautoCommit(false);一组业务执行完毕,提交事务可以在catch语句中显式的定义回滚语句,但默认失败会回滚package com.wang.lesson04;import com.wang.lesson02.utils.JdbcUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.sqlException;public class TestTransaction { public static voID main(String[] args) { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //关闭数据库的自动提交,自动会开启事务 conn.setautoCommit(false); //开启事务 String sql_1 = "update account set money = money - 100 where name = 'A'"; st = conn.prepareStatement(sql_1); st.executeUpdate(); int x = 1 / 0; //报错,只执行了上面的sql,此处报错下面的sql不执行 String sql_2 = "update account set money = money + 100 where name = 'B'"; st = conn.prepareStatement(sql_2); st.executeUpdate(); //业务完毕,提交数据 conn.commit(); System.out.println("成功!"); } catch (sqlException throwables) { /* 显示定义失败回滚,可以不写 try { conn.rollback(); //如果失败则回滚事务 } catch (sqlException e) { e.printstacktrace(); } */ //如果失败,默认回滚 throwables.printstacktrace(); } finally { JdbcUtils.release(conn,rs); } }}
12. 数据库连接池数据库连接——>执行完毕——>释放
其中,连接——>释放 十分浪费系统资源
1. 池化技术准备一些预先的资源,过来就连接预先准备好的
------ 开门 --- 业务员:等待 --- 服务 ------
最小连接数:与常用连接数相同
最大连接数:业务最高承载上限
超过最大连接数——>排队等待
等待超时:100ms
@H_396_403@2. 编写连接池实现一个接口 DataSource
开源数据源实现
DBCPC3P0DruID:阿里巴巴使用了这些数据库连接池之后,我们在项目中就不需要编写连接数据库的代码了!
1. DBCP从Maven中导入
注意:设置propertIEs文件的路径时考虑和源码的路径是否在一个目录下,否则要加./向上一级目录寻找!
DBCP的配置文件
#连接设置 这里面的名字,是DBCP数据源中定义好的driverClassname = com.MysqL.jdbc.Driverurl = jdbc:MysqL://localhost:3306/jdbcStudy?useUnicode=true&characterEnCoding=utf8&useSSL=trueusername = rootpassword = 123456#上面的为必须写,下面的为可选项#<!-- 初始化连接 -->initialSize = 10#最大连接数量maxActive = 50#<!-- 最大空闲连接 -->maxIDle = 20#<!-- 最小空闲连接 -->minIDle = 5#<!-- 超时等待时间以毫秒为单位 60000毫秒(60S) -->maxWait = 60000#JDBC驱动建立连接时附带的连接属性的属性格式必须为这样:[属性名=property;]#注意:"user"与"password"两个属性会被明确地传递,因此这里不需要包含他们connectionPropertIEs = useUnicode=true;characterEnCoding=UTF8#指定由连接池所创建的连接自动提交(auto-commit)状态defaultautoCommit = true#driver default 指定由连接池所创建的连接的只读(read-only)状态#如果没有设置该值,则"setReadonly"方法将不被调用。(某些驱动并不支持只读模式,如Informix)defaultReadonly = false#driver default指定由连接池创建的连接的事无级别(TransactionIsolation)#可用值为下列之一:(详情可见javadoc)NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEAtable_READ,SERIAliZABLEdefaultTransactionIsolation = READ_UNCOMMITTED
工具类
package com.wang.lesson05.utils;import org.apache.commons.dbcp2.BasicdataSource;import org.apache.commons.dbcp2.BasicdataSourceFactory;import java.io.inputStream;import java.sql.*;import java.util.PropertIEs;public class JdbcUtils_DBCP { private static BasicdataSource dataSource = null; static { try { inputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsstream("./dbcpconfig.propertIEs"); PropertIEs propertIEs = new PropertIEs(); propertIEs.load(in); //创建数据源 工厂模式 --> 创建 dataSource = BasicdataSourceFactory.createDataSource(propertIEs); } catch (Exception e) { e.printstacktrace(); } } //获取连接 public static Connection getConnection() throws sqlException { return dataSource.getConnection(); //从数据库中获取连接 } //释放连接资源 public static voID release(Connection conn,ResultSet rs) { if (rs != null) { try { rs.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } if (st != null) { try { st.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } if (conn != null) { try { conn.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } }}
利用DBCP实现insert,与不使用连接池类似,只是换了工具类
package com.wang.lesson05;import com.wang.lesson05.utils.JdbcUtils_DBCP;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.sqlException;import java.util.Date;public class TestDBCP { public static voID main(String[] args) { Connection conn = null; PreparedStatement st = null; try { conn = JdbcUtils_DBCP.getConnection(); //区别 //使用?占位符代替参数 String sql = "insert into users(ID,new java.sql.Date(new Date().getTime())); //执行 int i = st.executeUpdate(); if (i >0) System.out.println("插入成功!"); } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils_DBCP.release(conn,null); } }}
2. C3P0配置文件
<?xml version="1.0" enCoding="UTF-8" ?><c3p0-config> <!-- C3P0的缺省(默认)配置 如果在代码中"ComoPooledDataSource ds = new ComboPooledDataSource();"这样写就表示使用的是C3P0的缺省(默认)配置 --> <default-config> <property name = "driverClass">com.MysqL.jdbc.Driver</property> <property name= "jdbcUrl">jdbc:MysqL://localhost:3306/jdbcStudy?useUnicode=true&characterEnCoding=utf8&uesSSL=true&serverTimezone=UTC</property> <property name= "user">root</property> <property name= "password">123456</property> <property name= "acquireIncrement">5</property> <property name= "initialPoolSize">10</property> <property name= "minPoolSize">5</property> <property name= "maxPoolSize">20</property> </default-config> <!-- C3P0的命名配置 如果在代码中"ComoPooledDataSource ds = new ComboPooledDataSource("MysqL");"这样写就表示使用的是name是MysqL的数据源 这样就可以配置多个数据源 --> <named-config name = "MysqL"> <property name = "driverClass">com.MysqL.jdbc.Driver</property> <property name= "jdbcUrl">jdbc:MysqL://localhost:3306/jdbcStudy?useUnicode=true&characterEnCoding=utf8&uesSSL=true&serverTimezone=UTC</property> <property name= "user">root</property> <property name= "password">123456</property> <property name= "acquireIncrement">5</property> <property name= "initialPoolSize">10</property> <property name= "minPoolSize">5</property> <property name= "maxPoolSize">20</property> </named-config></c3p0-config>
C3P0工具类写法
package com.wang.lesson05.utils;import com.mchange.v2.c3p0.ComboPooledDataSource;import java.sql.Connection;import java.sql.ResultSet;import java.sql.sqlException;import java.sql.Statement;public class JdbcUtils_C3P0 { private static ComboPooledDataSource dataSource = null; static { try { //代码版配置// dataSource = new ComboPooledDataSource();// dataSource.setDriverClass();// dataSource.setUser();// dataSource.setPassword();// dataSource.setJdbcUrl();//// dataSource.setMaxPoolSize();// dataSource.setMinPoolSize(); //创建数据源 工厂模式 --> 创建 //注意,此种写法中,XML文件要在src目录下,且必须命名为c3p0-config! dataSource = new ComboPooledDataSource("MysqL"); //使用配置文件(XML)的写法 } catch (Exception e) { e.printstacktrace(); } } //获取连接 public static Connection getConnection() throws sqlException { return dataSource.getConnection(); //从数据库中获取连接 } //释放连接资源 public static voID release(Connection conn,ResultSet rs) { if (rs != null) { try { rs.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } if (st != null) { try { st.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } if (conn != null) { try { conn.close(); } catch (sqlException throwables) { throwables.printstacktrace(); } } }}
利用C3P0实现insert
package com.wang.lesson05;import com.wang.lesson05.utils.JdbcUtils_C3P0;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.sqlException;import java.util.Date;public class TestC3P0 { public static voID main(String[] args) { Connection conn = null; PreparedStatement st = null; try { conn = JdbcUtils_C3P0.getConnection(); //区别 //使用?占位符代替参数 String sql = "insert into users(ID,new java.sql.Date(new Date().getTime())); //执行 int i = st.executeUpdate(); if (i >0) System.out.println("插入成功!"); } catch (sqlException throwables) { throwables.printstacktrace(); } finally { JdbcUtils_C3P0.release(conn,null); } }}
3. 结论无论使用什么数据源,本质还是一样的,接口DataSource接口不会变,方法就不会变!
总结以上是内存溢出为你收集整理的JDBC全部内容,希望文章能够帮你解决JDBC所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)