3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
基本上:您可以連接到MySQL(或您使用的任何服務(wù)器)服務(wù)器,但不應(yīng)直接從Android應(yīng)用程序執(zhí)行此操作。
原因:
可以對(duì)Android應(yīng)用程序進(jìn)行反編譯,并且客戶端將具有訪問數(shù)據(jù)庫的憑據(jù)。如果使用正確的黑客工具(如Backtrack),則此惡意客戶端可以訪問,連接和利用數(shù)據(jù)庫中的數(shù)據(jù)。
如果您的應(yīng)用程序適用于世界各地的客戶端,則客戶端應(yīng)按一個(gè)操作或一組操作打開并維護(hù)與數(shù)據(jù)庫的連接。即使您的PC客戶端位于數(shù)據(jù)庫引擎服務(wù)器旁邊的LAN中,打開物理數(shù)據(jù)庫連接也要花費(fèi)很多時(shí)間。現(xiàn)在,想象一下從世界另一端的一個(gè)國家(例如中國或日本)或從南美的一個(gè)國家(例如巴西或秘魯)(我居住的國家)建立連接。
由于上述兩個(gè)原因,即使嘗試直接從您的電話設(shè)備連接到MySQL或任何其他數(shù)據(jù)庫引擎,這也是一個(gè)壞主意。
如何解決這個(gè)問題呢?使用面向服務(wù)的體系結(jié)構(gòu),其中至少要有兩個(gè)應(yīng)用程序:
服務(wù)提供商應(yīng)用程序。該應(yīng)用程序?qū)?chuàng)建和發(fā)布Web服務(wù)(最好是RESTful),并可以建立使用Web服務(wù)的策略,例如用戶身份驗(yàn)證和授權(quán)。該應(yīng)用程序還將連接到數(shù)據(jù)庫并對(duì)數(shù)據(jù)庫執(zhí)行CRUD操作。
服務(wù)使用者應(yīng)用程序。這將是您的Android(或任何其他移動(dòng)設(shè)備)應(yīng)用程序。
從您的問題出發(fā),您將重點(diǎn)放在第1點(diǎn)上。正如我在評(píng)論中所說,您可以使用Java創(chuàng)建一個(gè)Web應(yīng)用程序,在其中創(chuàng)建一個(gè)RESTful服務(wù),該服務(wù)可以歸結(jié)為一個(gè)POJO(普通的舊Java對(duì)象),每個(gè)服務(wù)都有一個(gè)方法。在這種方法中,由于畢竟是純Java,因此您可以添加其他功能,例如JDBC使用。
這是一個(gè)使用Jersey,Jackson(JSON庫)和JDBC的啟動(dòng)示例:
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM product");
while (rs.next()) {
Product product = new Product();
product.setId(rs.getInt("id"));
product.setName(rs.getString("name"));
productList.add(product);
}
//ALWAYS close the resources
rs.close();
stmt.close();
conn.close();
return productList;
}
}
您可以在諸如mkyong或Vogella或其他類似的教程中檢查Java Web應(yīng)用程序的進(jìn)一步配置(此答案中沒有太多信息)。
請(qǐng)注意,然后此應(yīng)用程序可以演變?yōu)榉謱討?yīng)用程序,并且JDBC代碼將進(jìn)入DAO類,然后ProductRestService該類將通過此DAO類訪問數(shù)據(jù)庫。這是另一個(gè)啟動(dòng)示例:
public class ProductDao {
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
//the rest of the code explained above...
return productList;
}
}
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
ProductDao productDao = new ProductDao();
return productDao.getProducts();
}
}
您可以將其他更改應(yīng)用于此項(xiàng)目,也可以進(jìn)行更改。
您能說一下PHP在這里做什么嗎?(如果我使用PHP開發(fā))
不用用Java編寫服務(wù)提供程序應(yīng)用程序(如上所示),而可以用PHP進(jìn)行。或使用Python,Ruby,C#,Scala或向您提供此技術(shù)的任何其他編程語言。同樣,我不確定您正在閱讀哪種類型的教程,但這應(yīng)該在某處進(jìn)行解釋,并說明出于該教程的目的,您將使用PHP創(chuàng)建服務(wù)。如果您覺得用Java而不是PHP或任何其他語言編寫這些服務(wù)感到更舒服,那沒有問題。您的android應(yīng)用并不真正在乎使用哪種技術(shù)來生產(chǎn)Web服務(wù),它只會(huì)在乎使用服務(wù)以及可以使用其中的數(shù)據(jù)。
添加回答
舉報(bào)