java核心技術第四篇之JDBC第二篇

来源:https://www.cnblogs.com/haizai/archive/2019/07/28/11260048.html
-Advertisement-
Play Games

01.JDBC連接池_連接池的概念: 1).什麼是連接池:對於多用戶程式,為每個用戶單獨創建一個Connection,會使程式降低效率。這時我們可以創建一個"容器", 這個容器中,先緩存一些Connection對象,有用戶請求,就從池中取出一個Connection對象,當用戶使用完畢, 再將這個Co ...


01.JDBC連接池_連接池的概念:
1).什麼是連接池:對於多用戶程式,為每個用戶單獨創建一個Connection,會使程式降低效率。這時我們可以創建一個"容器",
這個容器中,先緩存一些Connection對象,有用戶請求,就從池中取出一個Connection對象,當用戶使用完畢,
再將這個Connection放回到容器中,這個容器就叫:連接池。
2).連接池的作用:先期緩存一些Connection對象,並對這些Connection進行反覆的使用,回收,而不需要為每個用戶單獨創建Connection
對象,從而可以提高程式的運行效率。
3).很多的第三方廠商提供了連接池的實現,Sun公司提出,所有廠商的連接池必須實現:javax.sql.DataSource(介面)
1).DBCP連接池:Apache公司的,commons項目組的成員,免費開源的。Tomcat內部使用的就是這個連接池。
2).C3P0連接池【重要掌握】:開源免費的。整體性能要好於DBCP連接池。Spring、Hibernate框架內部使用這個連接池。
02.JDBC連接池_DBCP連接池的使用:
1).將DBCP的所需jar包複製到項目目錄下,並且添加構建路徑:
commons-dbcp-1.4.jar
commons-pool-1.6.jar
2).複製DBCP的配置文件(dbcpcongif.properties)到項目的src目錄下;
(註意:要會修改配置文件中的四個必須的配置項--driverClassName、url、username、password)


/*
dbcpcongif.properties(配置文件)

#連接設置--必須設置的
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hei66_day21
username=root
password=1233

#可選設置
#<!-- 初始化連接 -->
initialSize=10

#最大連接數量
maxActive=50

#<!-- 最大空閑連接 -->
maxIdle=20

#<!-- 最小空閑連接 -->
minIdle=5

#<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒 -->
maxWait=60000


#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;]
#註意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裡不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true

#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

*/

/*

3).使用連接池:
1).讀取配置文件信息:
Properties pro = new Properties();
pro.load(當前類名.class.getClassLoader().getResourceAsStream("配置文件的名"));//運行時會預設從bin目錄下查找資源文件
2).創建連接池對象
BasicDataSource dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);
3).從連接池中獲取Connection對象:
Connection conn = dataSource.getConnection();
4).發送SQL語句
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
while(rs.next()){
System.out.println(rs.getInt("pid") + "\t" + rs.getString("pname"));
}
rs.close();
stmt.close();
conn.close();//不是關閉,是回收
註意:配置文件中的四項必須配置項中的"鍵名"不要更改,是固定的名字,由DBCP內部讀取。

//DBCP連接池的使用
public class Demo {
public static void main(String[] args) throws Exception {
//1.讀取配置文件
Properties pro = new Properties();
pro.load(Demo.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));//在src(bin)下找配置文件
//2.創建連接池對象
BasicDataSource dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);
//3.從連接池中獲取連接對象
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
while(rs.next()){
System.out.println(rs.getInt("pid") + "\t" + rs.getString("pname"));
}
rs.close();
stmt.close();
conn.close();
}
}




03.JDBC連接池_C3P0連接池的使用:
1).將第三方所需的jar包複製到項目目錄下:
c3p0-0.9.2-pre5.jar
mchange-commons-java-0.2.3.jar
2).將c3p0-cinfig.xml配置文件複製到src目錄下:文件名不要改,而且必須在src下,C3P0內部會自動去找
(大家要會修改c3p0-config.xml中的四個必須項的配置:driverClass、jdbcUrl、user、password)

*/

/*
c3p0-cinfig.xml配置文件
<c3p0-config>
<!-- 預設配置,如果沒有指定則使用這個配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day31</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>

<!-- 命名的配置 -->
<named-config name="baidu">
<!-- 連接資料庫的4項基本參數 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day30_db</property>
<property name="user">root</property>
<property name="password">123</property>
<!-- 如果池中數據連接不夠時一次增長多少個 -->
<property name="acquireIncrement">5</property>
<!-- 初始化連接數 -->
<property name="initialPoolSize">20</property>
<!-- 最小連接數 -->
<property name="minPoolSize">10</property>
<!-- 最大連接數 -->
<property name="maxPoolSize">40</property>
<!-- -JDBC的標準參數,用以控制數據源內載入的PreparedStatements數量 -->
<property name="maxStatements">0</property>
<!-- 連接池內單個連接所擁有的最大緩存statements數 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
<!-- 命名的配置 -->
<named-config name="heima">
<!-- 連接資料庫的4項基本參數 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day25_db</property>
<property name="user">root</property>
<property name="password">123</property>
<!-- 如果池中數據連接不夠時一次增長多少個 -->
<property name="acquireIncrement">5</property>
<!-- 初始化連接數 -->
<property name="initialPoolSize">20</property>
<!-- 最小連接受 -->
<property name="minPoolSize">10</property>
<!-- 最大連接數 -->
<property name="maxPoolSize">40</property>
<!-- -JDBC的標準參數,用以控制數據源內載入的PreparedStatements數量 -->
<property name="maxStatements">0</property>
<!-- 連接池內單個連接所擁有的最大緩存statements數 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
*/

/*

3).使用連接池:
1).創建連接池對象:
ComboPooledDataSource dataSource = new ComboPooledDataSource();//尋找配置文件中的預設配置
或者
ComboPooledDataSource dataSource = new ComboPooledDataSource("baidu");//尋找配置文件中的命名配置
2).獲取連接對象:
Connection conn = dataSource.getConnection();
3).發送SQL語句:
....
conn.close();//不是關閉,是回收
大家要掌握:
1.jar包位置,添加構建路徑;
2.c3p0-config.xml文件的位置,內部的必須項的四項的修改:driverClass、jdbcUrl、user、password
3.ComboPooledDataSource的創建的兩種方式;
4.以及後面要講的DBUtils工具類;

//C3P0連接池的使用
public class Demo {
public static void main(String[] args) throws Exception {
//1.創建C3P0的連接池對象
// ComboPooledDataSource dataSource = new ComboPooledDataSource();//尋找配置文件中的預設配置
ComboPooledDataSource dataSource = new ComboPooledDataSource("baidu");//尋找配置文件中的命名配置
//2.獲取連接對象
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
while(rs.next()){
System.out.println(rs.getInt("pid") + "\t" + rs.getString("pname"));
}
rs.close();
stmt.close();
conn.close();
}
}

------------------------------------------------------------------------------------------------------------
04.DBUtils工具包_什麼是DBUtils:
1.DBUtils工具包:它是資料庫相關操作的工具包,內部封裝了一些對資料庫操作的一些相關方法,以及自動封裝結果集的相關方法。
使用它可以簡化我們的資料庫開發的代碼。
它是Apache的項目,免費開源的。

05.DBUtils工具包_自己使用JavaBean封裝結果集:

JavaBean就是一個類,在開發中常用於封裝數據。具有如下特性
1.需要實現介面:java.io.Serializable ,通常偷懶省略了。
2.提供私有欄位:private 類型 欄位名;
3.提供getter/setter方法:
4.提供無參構造

......
//遍歷結果集
while(rs.next()){//遍歷,封裝的過程比較繁瑣,DBUtils工具包就可以很方便的封裝JavaBean
Products pro = new Products();
pro.setPid(rs.getInt("pid"));
pro.setPname(rs.getString("pname"));
pro.setPrice(rs.getInt("price"));
pro.setFlag(rs.getInt("flag"));
pro.setCategory_id(rs.getInt("category_id"));

//將對象添加到集合中
proList.add(pro);
}
.....

//使用JavaBean封裝結果集
public class Demo {
public static void main(String[] args) throws Exception {
//1.創建一個C3P0連接池對象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2.獲取連接對象
Connection conn = dataSource.getConnection();

//3.執行查詢
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
//定義集合
List<Products> proList = new ArrayList<>();
//遍歷結果集
while(rs.next()){
Products pro = new Products();
pro.setPid(rs.getInt("pid"));
pro.setPname(rs.getString("pname"));
pro.setPrice(rs.getInt("price"));
pro.setFlag(rs.getInt("flag"));
pro.setCategory_id(rs.getInt("category_id"));

//將對象添加到集合中
proList.add(pro);
}
//釋放資源
rs.close();
stmt.close();
conn.close();

//遍歷集合
for(Products p : proList){
System.out.println(p);
}

}
}


06.DBUtils工具包_DBUtils核心類
1).QueryRunner類:主要用於執行SQL語句;
2).ResultSetHandler介面 :有很多的子類,每種子類都表示一種封裝結果集的方式。
3).DBUtils工具類:提供了一些跟事務處理相關的方法。
註意:DBUtils工具包,它內部不提供資料庫的連接。它只負責發送SQL語句,執行SQL語句,封裝結果集。
我們可以提供"連接池"對象,給QueryRunner使用。
07.DBUtils工具包_基本使用:
1).複製jar包到項目目錄下;
commons-dbutils-1.4.jar
2).由於它需要C3P0連接池,所以要將這個連接池配置好。
3).使用QueryRunner執行SQL語句:
//1.添加
public void save() throws Exception{
//1.創建一個QueryRunner對象--使用連接池創建
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--添加
String sql = "insert into products values(?,?,?,?,?)";
int row = qr.update(sql, 12,"索尼電視",8000,1,1);
System.out.println("添加影響的行數:" + row);
}

//2.修改
public void update() throws Exception{
//1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--修改
String sql = "update products set pname = ?,price = ?,flag = ?,category_id = ? where pid = ?";
int row = qr.update(sql,"索尼電視2",8002,0,3,12);
System.out.println("修改影響的行數:" + row);
}
//3.刪除
@Test
public void delete() throws Exception{
//1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--刪除
String sql = "delete from products where pid = ?";
int row = qr.update(sql,12);
System.out.println("刪除影響的行數:" + row);
}
08.DBUtils工具包_ResultSetHandler標記各種結果集【重點掌握】:
1).Object[] ArrayHandler : 用於查詢一條記錄,如果有多條,將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每一個元素就是這條記錄中的每一個欄位的值
如果沒有查詢結果,返回的是:空數組(0長度數組),不是空指針
String sql = "select * from products where category_id = 20";
Object[] objArray = qr.query(sql, new ArrayHandler());
for(Object o : objArray){
System.out.println(o);
}
2).List<Object[]> ArrayListHandler:用於查詢多條記錄。將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。
String sql = "select * from products";
List<Object[]> objList = qr.query(sql, new ArrayListHandler());
for(Object[] objArray : objList){//遍歷行
for(Object o : objArray){//遍歷列
System.out.print(o + "\t");
}
System.out.println();
}
3).某個JavaBean BeanHandler:用於查詢一條記錄,將結果集中第一條記錄封裝到一個指定的javaBean中。
String sql = "select * from products where pid = 1";
Products pro = qr.query(sql, new BeanHandler<Products>(Products.class));
System.out.println(pro);
4).List<某個JavaBean> BeanListHandler:用於查詢多條記錄 將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
String sql = "select * from products";
List<Products> proList = qr.query(sql, new BeanListHandler<Products>(Products.class));
for(Products p : proList){
System.out.println(p);
}
5).List<Object> ColumnListHandler:查詢某個列的數據,將結果集中指定的列的欄位值,封裝到一個List集合中
String sql = "select pname from products";
List<Object> objList = qr.query(sql, new ColumnListHandler());
for(Object o : objList){
System.out.println(o);
}
6).Map<Object,Map<String,Object>> KeyedHandler:查詢多條記錄。將結果集中每一條記錄封裝到Map<String,Object>,在將這個map集合做為另一個Map的value,另一個Map集合的key是指定的欄位的值。
String sql = "select * from products";
Map<Object, Map<String, Object>> map = qr.query(sql, new KeyedHandler());
Set<Object> keys = map.keySet();
for(Object k : keys){
System.out.println(k);
Map<String,Object> map2 = map.get(k);
Set<String> keys2 = map2.keySet();
for(String k2 : keys2){
System.out.println("\t" + k2 + " -- " + map2.get(k2));
}
}
7).Map<String,Object> MapHandler:用於查詢一條記錄。將結果集中第一條記錄封裝到了Map<String,Object>集合中,key就是欄位名稱,value就是欄位值
String sql = "select * from products where pid = 1";
Map<String, Object> map = qr.query(sql, new MapHandler());
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}
8).List<Map<String,Object> MapListHandler:用於查詢多條記錄。將結果集中每一條記錄封裝到了Map<String,Object>集合中,key就是欄位名稱,value就是欄位值,在將這些Map封裝到List集合中。
String sql = "select * from products";
List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
for(Map<String,Object> map : mapList){
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}
System.out.println("--------------------------------");
}
9).Object ScalarHandler:它是用於單個數據。例如select count(*) from 表操作。
String sql = "select sum(price) from products";
Object result = qr.query(sql, new ScalarHandler());
System.out.println("結果:" + result);

//DBUtils的基本使用
public class Demo {
//1.添加
public void save() throws Exception{
//1.創建一個QueryRunner對象--使用連接池創建
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--添加
String sql = "insert into products values(?,?,?,?,?)";
int row = qr.update(sql, 12,"索尼電視",8000,1,1);
System.out.println("添加影響的行數:" + row);
}

//2.修改
public void update() throws Exception{
//1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--修改
String sql = "update products set pname = ?,price = ?,flag = ?,category_id = ? where pid = ?";
int row = qr.update(sql,"索尼電視2",8002,0,3,12);
System.out.println("修改影響的行數:" + row);
}
//3.刪除
public void delete() throws Exception{
//1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--刪除
String sql = "delete from products where pid = ?";
int row = qr.update(sql,12);
System.out.println("刪除影響的行數:" + row);
}

//4.查詢
@Test
public void select() throws Exception{
//1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--查詢
//1).ArrayHandler:將結果集中的第一條記錄封裝到一個Object[]數組中,數組中的每一個元素就是這條記錄中的每一個欄位的值
/*String sql = "select * from products where category_id = 20";
Object[] objArray = qr.query(sql, new ArrayHandler());
for(Object o : objArray){
System.out.println(o);
}*/

//2).List<Object[]> ArrayListHandler:用於查詢多條記錄。將結果集中的每一條記錄都封裝到一個Object[]數組中,將這些數組在封裝到List集合中。
/*String sql = "select * from products";
List<Object[]> objList = qr.query(sql, new ArrayListHandler());
for(Object[] objArray : objList){//遍歷行
for(Object o : objArray){//遍歷列
System.out.print(o + "\t");
}
System.out.println();
}
*/
//3).BeanHandler:將結果集中第一條記錄封裝到一個指定的javaBean中。
/*String sql = "select * from products where pid = 1";
Products pro = qr.query(sql, new BeanHandler<Products>(Products.class));
System.out.println(pro);*/
//4).BeanListHandler:將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
/*String sql = "select * from products";
List<Products> proList = qr.query(sql, new BeanListHandler<Products>(Products.class));
for(Products p : proList){
System.out.println(p);
}*/

//5).ColumnListHandler:查詢某個列的數據,將結果集中指定的列的欄位值,封裝到一個List集合中
/*String sql = "select pname from products";
List<Object> objList = qr.query(sql, new ColumnListHandler());
for(Object o : objList){
System.out.println(o);
}
*/
//6).KeyedHandler:將結果集中每一條記錄封裝到Map<String,Object>,在將這個map集合做為另一個Map的value,另一個Map集合的key是指定的欄位的值。
/*String sql = "select * from products";
Map<Object, Map<String, Object>> map = qr.query(sql, new KeyedHandler());
Set<Object> keys = map.keySet();
for(Object k : keys){
System.out.println(k);
Map<String,Object> map2 = map.get(k);
Set<String> keys2 = map2.keySet();
for(String k2 : keys2){
System.out.println("\t" + k2 + " -- " + map2.get(k2));
}
}*/

//7).MapHandler 將結果集中第一條記錄封裝到了Map<String,Object>集合中,key就是欄位名稱,value就是欄位值
/*String sql = "select * from products where pid = 1";
Map<String, Object> map = qr.query(sql, new MapHandler());
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}*/

//8).MapListHandler 將結果集中每一條記錄封裝到了Map<String,Object>集合中,key就是欄位名稱,value就是欄位值,在將這些Map封裝到List集合中。
/*String sql = "select * from products";
List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
for(Map<String,Object> map : mapList){
Set<String> keys = map.keySet();
for(String k : keys){
System.out.println("鍵:" + k + " 值:" + map.get(k));
}
System.out.println("--------------------------------");
}
*/
//9).ScalarHandler 它是用於單個數據。例如select count(*) from 表操作。
String sql = "select sum(price) from products";
Object result = qr.query(sql, new ScalarHandler());
System.out.println("結果:" + result);
}
}

09.DBUtils工具包_QueryRunner的CRUD方法:
見demo05

//自定義工具類實現CRUD;
public class JDBCUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

public static DataSource getDataSource(){
return dataSource;
}
}

//自定義工具類實現CRUD (每個都有兩種方法)
public class Demo4 {

//1.添加
@Test
public void save() throws Exception {
//1.創建一個 QueryRunner對象--使用連接池創建
//核心類
//QueryRunner qr = new QueryRunner(new ComboPooledDataSource());

QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--添加
//String sql = "insert into car values(?,?,?,?,?)";
String sql = "insert into car (id,cname) values (?,?)";
//3.參數
Object[] params = {14,"捷達"};
//int update = qr.update(sql,11,"朗逸","大眾","德國",14);
int update = qr.update(sql,params);
System.out.println("添加影響的行數:" + update);
}

//2.修改
@Test
public void update() throws Exception {
//1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
//2.執行SQL語句--修改
String sql = "update car set cname = ?,company = ?,grade = ?,price = ? where id = ?";
//3.參數
Object[] params = {"索納塔","大眾","德國",10,14};
int update = qr.update(sql, params);
//int update = qr.update(sql,"寶來","大眾","德國",13,11);
System.out.println("修改影響的行數:" + update);
}

//3.刪除
@Test
public void delete() throws Exception {
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//2.sql
String sql = "delete from car where id = ?";
//3.參數
Object[] parms = {10};
int update = qr.update(sql,parms);
//int update = qr.update(sql,14);
System.out.println("刪除影響的行數:" + update);
}

//4.通過ID查詢
@Test
public void findById() throws Exception {
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from car where id = ?";
//3.參數
Object[] parms = {8};
Products update = qr.query(sql, new BeanHandler<Products>(Products.class),parms);
//Products query = qr.query(sql, new BeanHandler<Products>(Products.class),9);
System.out.println(update);
}
//5.查詢所有
@Test
public void findAll() throws Exception {
/*QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from car";
List<Products> query = qr.query(sql, new BeanListHandler<Products>(Products.class));
for (Products products : query) {
System.out.println(products);
}*/
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from car";
Object[] parms = {};
List<Products> query = qr.query(sql, new BeanListHandler<Products>(Products.class),parms);
for (Products products : query) {
System.out.println(products);
}
}

//6.查詢總記錄
@Test
public void count() throws Exception {
/*QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select avg(price) from car";
Object query = qr.query(sql, new ScalarHandler());
System.out.println(query);*/
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
String sql = "select count(*) from car";
Object[] parms = {};
Object query = qr.query(sql, new ScalarHandler(),parms);
System.out.println(query);
}


}


10.通過ResultSet獲取列頭信息:
ResultSet rs = stmt.executeQuery("select * from products");
ResultSetMetaData metaData = rs.getMetaData();//獲取列的信息對象
int count = metaData.getColumnCount();//獲取列的數量
System.out.println("列數:" + count);
for(int i = 1 ; i <= count ; i++){
System.out.println("列名:" + metaData.getColumnName(i));//獲取指定索引的列名。索引值從1開始
}

//通過ResultSet獲取列頭信息
public class Demo {
public static void main(String[] args) throws Exception {
Connection conn = JDBCUtils.getDataSource().getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from products");
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount();
System.out.println("列數:" + count);
for(int i = 1 ; i <= count ; i++){
System.out.println("列名:" + metaData.getColumnName(i));
}
}
}


=============================================================================================================
學習目標總結:
目標:能夠理解連接池的原理
1.連接池就是一個存儲了一些Connection對象的容器。可以先期緩存一些Connection對象,當用戶使用時取出,當用戶使用完畢時回收。
可以對這些Connection對象進行反覆的重用,達到提高程式運行效率的目的。

目標:能夠使用DBCP連接池
1.複製2個jar包;
2.複製配置文件到src目錄下。



3.創建連接池:
1).讀取配置文件:
Properties pro = new Properties();
pro.load(當前類名.class.getClassLoader().getResourceAsStream("配置文件名"));
2).通過工廠類獲取連接池對象
BasicDataSource dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);
3).獲取Connection對象
Connection conn = dataSource.getConncetion();
...
conn.close();//不是關閉,是回收
目標:能夠使用C3P0連接池
1.複製2個jar包;
2.複製配置文件c3p0-config.xml到src目錄下;
3.創建連接池對象:
1).創建連接池對象
ComboPooledDataSource dataSource = new ComboPooledDataSource();//讀取預設配置
//或者
ComboPooledDataSource dataSource = new ComboPooledDataSource("baidu");//讀取命名配置
2).獲取連接:
Connection conn = dataSource.getConnection();
...
conn.close();//不是關閉,是回收
目標:能夠理解DBUtils工具類
1.對JDBC進行了封裝,用於執行增刪改查等SQL語句(主要用於查詢--可以自動封裝結果集)
目標:能夠應用QueryRunner類
1.創建對象:
QueryRunner qr = new QueryRunner(連接池對象);

2.發送SQL語句:
1).public int update(String sql,Object ... params):用於執行添加、修改、刪除語句的。
2).public T query(String sql,ResultSetHandler<T> rsh,Object ... params):用於執行查詢語句的。
目標:能夠應用ResultSetHandler介面
1.Object[] ArrayHandler:用於查詢一條記錄;封裝第一條記錄
2.List<Object[]> ArrayListHandler:用於查詢多條記錄的。
3.某個Bean類型 BeanHandler : 查詢一條,並自動封裝JavaBean。
4.List<Bean類型> BeanListHandler:查詢多條。
5.List<Object> ColumnListHandler : 查詢某列的數據。
6.Map<Object , Map<String,Object>> KeyedHandler : 查詢多條記錄。
7.Map<String,Object> MapHandler : 查詢一條記錄;
8.List<Map<String,Object>> MapListHandler :查詢多條記錄
9.Object ScalarHandler : 查詢聚合結果。單個數據

//DBCPUtiles工具類:

public class Utils_DBCP {
private static DataSource ds;
static{
Properties p = new Properties();
try{
p.load(Utils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
ds = BasicDataSourceFactory.createDataSource(p);
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getConnection(){
try{
return ds.getConnection();
}catch(SQLException e){
throw new RuntimeException("創建連接連接失敗!");
}
}
}

dbcpconfig.properties文件內容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
password=root
username=root
上面的配置文件中的內容編寫的依據是什麼?源代碼!!!!

測試代碼:
package DBCPUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
public class Test001 {
@Test
public void demo01(){
//添加:向分類表中添加數據
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
//1 獲得連接
conn = Utils_DBCP.getConnection();
//2 處理sql語句
String sql = "insert into category(cid,cname) values(?,?)";
//3獲得預處理對象
psmt = conn.prepareStatement(sql);
//4設置實際參數
psmt.setString(1,"c009");
psmt.setString(2,"預處理12");
//5執行
int r = psmt.executeUpdate();
System.out.println(r);
} catch (Exception e) {
throw new RuntimeException(e);
} finally{
//6釋放資源
//JdbcUtils.closeResource(conn, psmt, rs);
}
}
}

//示例代碼
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執行SQL語句
String sql = "SELECT * FROM zhangwu";
Object[] params = {};
Connection conn = JDBCUtils.getConnection();
Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
//結果集的處理
System.out.println( Arrays.toString(objArray) );

conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

示例代碼:
@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執行SQL語句
String sql = "SELECT * FROM zhangwu WHERE money>?";
Object[] params = {2000};
Connection conn = JDBCUtils.getConnection();
List<Object[]> list = qr.query(conn, sql, new ArrayListHandler(), params);
//結果集的處理
for (Object[] objArray : list) {
System.out.println( Arrays.toString(objArray) );
}

conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

ColumnListHandler什麼意思?怎麼使用?必須保留一份操作代碼!
示例代碼:

@Test
public void method(){
try {
//獲取QueryRunner對象
QueryRunner qr = new QueryRunner();
//執行SQL語句
String sql = "SELECT name FROM zhangwu WHERE money>?";
Object[] params = {2000};
Connection conn = JDBCUtils.getConnection();
List<String> list = qr.query(conn, sql, new ColumnListHandler<String>(), params);
//結果集的處理
for (String str : list) {
System.out.println(str);
}

conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在下載安裝nginx時出現 Another app is currently holding the yum lock; waiting for it to exit...問題 yum被鎖定了 可以使用 rm -rf /var/run/yum.pid 強制殺死進程來解決 ...
  • 一.為什麼刪除文件比創建文件要快? 因為刪除文件只是將bitmap點陣圖表中將文件所占據的inode 和dacablock的使用狀態從1變成0,相當於釋放了這些快的使用權。 二.讀取文件和刪除文件的過程? 讀取文件的過程:cat /test/file1 1、進入 /test 目錄, 檢查 test目錄 ...
  • 安裝好wampserver想在瀏覽器打開運行php的結果,發現: You don't have permission to access on this server 解決辦法是: 在Apache的根目錄打開httpd.conf文件下進行修改: 修改完之後: 然後再試試在瀏覽器輸入127.0.0.1 ...
  • ######### rwx 許可權對文件和目錄的含義 ############ 代表字元 許可權 對文件的含義 對 目錄 的含義 r 讀許可權 可以看到文件的內容 可以看到目錄下的內容 cat tail more head ls w 寫許可權 可以修改文件的內容 可以在該目錄下,刪除,創建 vim echo ...
  • 查看ip地址:ip addr/ifconfig 修改ip地址:/etc/sysconfig/network-script/網卡,修改onboot=yes BOOTPROTO=dhcp -->BOOTPROTO=static IP獲取方式改為靜態獲取 ZONE=public firewalld zon ...
  • 在學習redis之前,我們首先需要瞭解一下NoSQL(非關係資料庫)。非關係型資料庫通常指數據以對象的形式存儲在資料庫中,而對象之間的關係通過每個對象自身的屬性來決定。 為什麼需要NoSQL? (1) High performance - 高併發讀寫 (2) Huge Storage - 海量數據的 ...
  • 1. 下載並安裝MySQL官方repository 然後安裝 然後安裝mysql伺服器 2.配置mysql資料庫 首先啟動資料庫 登陸資料庫 配置mysql可以設置簡單密碼 查看密碼規則 卸載mysql Repository,不然每次yum會自動更新 ...
  • [學習筆記] reduce將RDD中元素前兩個傳給輸入函數,產生一個新的return值,將新產生的return值與RDD中下一個元素(即第三個元素)組成兩個元素,再被傳給輸入函數,這樣遞歸運作,直到最後只有一個值為止。*/ val rdd07 = sc.parallelize(1 to 10) va ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...