ورود

View Full Version : نحوه ارتباط با پایگاه داده (JDBC)



Sina.iRoid
یک شنبه 05 مهر 1394, 14:34 عصر
سلام
دوستان من در حال مطالعه مبحث پایگاه داده هستم. در مورد درایور ها به اینصورت مطالعه کردم که بهترین درایور ODBC هست، ولی چون با زبان C نوشته شده مناسب برای جاوا نیست. برای همین درایور JDBC ساخته شده. اما یک درایور دیگه ای هم هست به نام JDBC-ODBC Bridge که از قابلیت های ODBC استفاده شده و مناسب برای جاواست. من JDBC-ODBC Bridge و که اصلا نتونستم در اینترنت پیدا کنم. اصلا نیست!!! اما در مورد JDBC، من درایور و نصب کردم اما وقتی که برنامه زیر و اجرا می کنم پیفام داخل کچ اجرا میشه.


public class MainClass {


public static void main(String[] args) {

try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
System.out.println("Connect to MySQL");
} catch (Exception e) {
System.out.println("cannot connect to MySQL");
}
}


}



و اینکه اگر امکانش هست در مورد نحوه ایجاد DSN هم یه توضیحی بدین. من ایجاد می کنم ولی اصلا فایدش و نمی دونم.

ممنون میشم اگر راهنماییم کنید :)

-سیّد-
دوشنبه 06 مهر 1394, 09:12 صبح
سلام
نکته‌ی اول این که آیا درایور MySql رو به پروژه اضافه کردید؟
نکته‌ی دوم این که توی کد بالا، داخل catch نمی‌دونید چه Exception ای گرفتید. برای این که بدونید، حداقل e.printStackTrace رو بزنید که بنویسه چشه!
در مورد DSN هم سؤالتون رو متوجه نشدم. می‌شه با مثال بگید؟

ahmad.mo74
دوشنبه 06 مهر 1394, 13:13 عصر
سلام.

توی خط هفتم چرا newInstance رو کال کردی؟؟؟ دلیلی داشته؟
همونطور که آقا سید گفت؛ اول مطمئن شو که لایبرری JDBC برای mysql (http://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.36) رو به پروژت اضافه کردی.
و اینکه داخل بلوک catch چرا اصلا اکسپشن رو چاپ نکردی؟

نوشتن این :


Class.forName("com.mysql.jdbc.Driver")


اصلا ضرورتی نداره (توی ورژنهای قدیمی JDBC باید مینوشتیم) ، فقط برای اینه که مطمئن بشیم درایور مورد نظر موجوده ولی اگر نبود و اکسپشن رخ داد از برنامه خارج بشیم یا هر کار دیگه ای که لازمه انجام بدیم...

کدت رو به این شکل بنویس :


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


/**
* @author ahmad
*/
public final class JDBCUtil {


private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
private static final String URL_FORMAT = "jdbc:mysql://%s:%d/%s?autoReconnect=true&useUnicode=true&characterEncoding=utf-8";


private JDBCUtil() {
}


static {
try {
Class.forName(DRIVER_CLASS_NAME);
} catch (ClassNotFoundException e) {
// TODO log exception
System.exit(1);
}
}


public static Connection getConnection(String host, int port, String schema, String username, String password) throws SQLException {
return getConnection(String.format(URL_FORMAT, host, port, schema), username, password);
}


public static Connection getConnection(String url, String username, String password) throws SQLException {
return DriverManager.getConnection(url, username, password);
}


public static void close(Connection connection) {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
// TODO log exception
}
}


}


در مورد DSN هم ما تو جاوا JNDI داریم. (البته اگر منظورتو درست متوجه شده باشم)

http://www.javaworld.com/article/2076888/core-java/jndi-overview--part-1--an-introduction-to-naming-services.html
http://www.journaldev.com/2513/tomcat-datasource-jndi-example-for-servlet-web-application

محمد فدوی
دوشنبه 06 مهر 1394, 18:32 عصر
دوستان من در حال مطالعه مبحث پایگاه داده هستم. در مورد درایور ها به اینصورت مطالعه کردم که بهترین درایور ODBC هست، ولی چون با زبان C نوشته شده مناسب برای جاوا نیست.
این حرف اشتباهه. ODBC یه تکنولوژی قدیمیه با امکانات خیلی محدود و به نظر می‌رسه که دیگه تاریخ مصرفش گذشته (نظر شخصی) و البته هیچ ارتباطی هم به جاوا نداره، یه تکنولوژی مستقله که توسط خیلی از فریمورک‌ها قابل استفاده‌ست. تکنولوژی‌های جدیدتری مثل OLEDB و ADO.net به‌روزتر و کارآمدترن.
اما هنوزم ODBC قابل استفاده‌ست. مثلا برای برقراری پایگاه‌داده‌های خیلی قدیمی راهی نداریم به جز استفاده از ODBC که خب با JDBC هم سازگاره. حتی برای برقراری ارتباط با پایگاه‌داده‌های MySQL هم می‌تونید بعد از معرفی پایگاه داده به ODBC، از این طریق بهشون متصل بشید. (توی ویندوز اگر اشتباه نکنم این‌کار از طریق Administrative Tools قابل انجامه)

اما وقتی یه پایگاه‌داده مثل MySQL راه‌انداز خودش رو برای جاوا عرضه کرده (MySQL Connector/J) استفاده از ODBC چندان کار درستی نیست. بهتره راه‌اندازش رو به پروژه‌تون اضافه کنید و از طریق اون به پایگاه‌داده متصل بشید.

Sina.iRoid
سه شنبه 07 مهر 1394, 10:23 صبح
سلام
من طبق یک ویدیوی آموزشی ای که دانلود کردم دارم پیش میرم. در اون ویدیو Connector j و دانلود و نصب کرد. اما اصلا به پروژه اضافه نکرد. و دقیقا همین کدی که من نوشتم و اون هم نوشت که برای اون بلوک try اجرا شد.
من Class.forName و برای بارگذاری راه انداز نوشتم. اما URL داخلشو اصلا نمی دونم درست نوشتم یا نه. یعنی اصلا نمی دونم باید چی بنویسم و اینی که نوشتم و طبق اون ویدیوی آموزشی نوشتم.
جناب
ahmad.mo (http://barnamenevis.org/member.php?337969-ahmad-mo74) من اصلا متوجه کدتون نشدم. گفتین Class.forName ضرورتی نداره و لی نوشتین. لطف کنید اگه امکانش هست یه مثال ساده تر بزنید که خوب متوجه بشم.

ممنون از همه :)

Sina.iRoid
چهارشنبه 08 مهر 1394, 11:13 صبح
سلام
دوستان من به شدت این چند روزه مطالعه کردم و بالاخره تونستم که با پایگاه داده ارتباط برقرار کنم. ابتدا سپاس گذاری می کنم از شما. فقط سه تا نکته دیگه مونده که من متوجش نشدم. لطف کنید کد زیر و نگاه کنید:


import java.sql.*;


public class ConnectDB {

Connection connection;

// constructor
public ConnectDB() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
System.out.println("Could not load driver");
}
}

public void connectToDB() {
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost/library",
"Sina", "*****");
System.out.println("Connected to database");
} catch (SQLException e) {
System.out.println("cannot connect to database");
}
}

public void execSQl() {
try {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM BOOKS");
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + " " + resultSet.getString(2) +
" " + resultSet.getString(3));
}
} catch (SQLException e) {
System.out.println("Error executing SQL");
}
}

public static void main(String[] args) {
ConnectDB db = new ConnectDB();
db.connectToDB();
db.execSQl();
}
}


ابتدا اینکه من نمی دونم پایگاه داده ای که ایجاد می کنم کجای هارد ذخیره میشه. یعنی اصلا نمی تونم فایلشو پیدا کنم. من پایگاه دادم و با استفاده از Command Line اجرا می سازم. مثلا این کد که برای بارگذاری کانکتور هست، این آدرس URL از کجا اومده؟

Class.forName("com.mysql.jdbc.Driver");

و دوباره در کد زیر connection = DriverManager.getConnection("jdbc:mysql://localhost/library")

باز این آدرس url از کجا اومده؟ لطف می کنید اگر این سه مورد برام توضیح بدین که دیگه کاملا متوجه بشم. ممنون :)

ahmad.mo74
پنج شنبه 09 مهر 1394, 19:02 عصر
من اصلا متوجه کدتون نشدم. گفتین Class.forName ضرورتی نداره و لی نوشتین.


بازم میگم ضرورتی نداره، شما ننویس :)

اما در کل این دستور :


Class.forName("class.to.be.Loaded");


آدرس fully qualified یه کلاسی رو میگیره و اون رو برای ما لود میکنه و میاره. اگر اون کلاس وجود نداشت یا آدرس اشتباه بهش داده باشیم ClassNotFoundException رخ میده.

مثلا :


Class<?> stringClass = Class.forName("java.lang.String");
System.out.println(stringClass.getName());
System.out.println(stringClass.getCanonicalName()) ;
System.out.println(stringClass.getSimpleName());
System.out.println(stringClass.getTypeName());
System.out.println(stringClass.getPackage());
for (Field field : stringClass.getDeclaredFields()) {
System.out.println(field);
}
for (Method method : stringClass.getDeclaredMethods()) {
System.out.println(method);
}




ابتدا اینکه من نمی دونم پایگاه داده ای که ایجاد می کنم کجای هارد ذخیره میشه. یعنی اصلا نمی تونم فایلشو پیدا کنم.


برای چی میخوای فایلشو پیدا کنی؟



و دوباره در کد زیر
connection = DriverManager.getConnection("jdbc:mysql://localhost/library")


باز این آدرس url از کجا اومده؟


این database url هست و فرمتش این شکلیه :


jdbc:subprotocol:subname


مثلا اگر از Oracle استفاده کنی :


Driver class name = oracle.jdbc.driver.OracleDriver
JDBC url = jdbc:oracle:thin:@localhost:1521:orcl