АРХИВ • ХУУЧИН НИЙТЛЭЛҮҮД

ХИЧЭЭЛТЭЙ БЛОГ

Өмнөх жилүүдийн нийтлэлүүдээ он, сараар нь нээж үзэхэд зориулсан шинэ, цэвэрхэн загвар.

Архивын сараас сонгоход тухайн хугацаанд нийтлэгдсэн бодит постууд энд гарна.

Thursday, March 28, 2013

JDBC гэж юу бэ?




JDBC гэж юу бэ? 
  • JDBC - Java Database Connectivity
  • Java хэдийгээр маш сайн стандарчлагдсан боловч SQL хэлний хувьд маш олон янз байдаг
  • JDBC нь Java-аас SQL өгөгдлийн баазууд руу хандах гол арга хэрэгсэл
  • JDBC нь Java программууд хэрэглэхэд зориулагдсан стандарт API
  • JDBC нь гуравдагч компаниуд тодорхой нэг SQL хувилбар луу хандахад зориулагдсан драйвер бичихэд хэрэглэддэг загвар
 Драйверын төрлүүд 
  • JDBC Type 1 Driver -- JDBC/ODBC Гүүр драйверууд
    • ODBC (Open DataBase Connectivity) нь програмчлалын хэлнээс үл хамааралтай стандарт API
  • JDBC Type 2 Driver тодорхой платформын API ашиглан өгөгдөл рүү хандах. Intersolv Oracle Driver, WebLogic г.м.
  • JDBC Type 3 Driver -- 100% Java, тусдаа DB хост дээрх программ дуудна. Олон бааз руу нэг драйвераар хандах боломж олгоно. Symantec DBAnywhere г.м.
  • JDBC Type 4 Driver -- 100% Java
    • Хамгийн үр дүнтэй хэлбэр нь
    • Сул тал нь бааз болгоны хувьд тусдаа драйвертай
    • Oracle, MySQL г.м.
 Connector/J  
  • Connector/J нь JDBC Type 4 Driver бөгөөд Java-аас MySQL рүү хандахад хэрэглэнэ
  • Суулгах процесс нь энгийн:
    • http://www.mysql.com – оос сүүлийн тогтвортой хувилбарыг нь татаж авна
    • Үүнийгээ задлана
    • JAR файлыг нь Java олохоор байрлуулна
      • JAR файлыг нь CLASSPATH руу нэмж болно
      • Eclipse дээр: Project --> Properties --> Java Build Path --> Libraries --> Add External Jars... гэж нэмнэ




 
Холболт хийх 
Connection con = DriverManager.getConnection(url, “myLogin", "myPassword");
 
URL нь ямар байх ёстой бэ? 
 Холболт хийх: Жишээ URL-ууд 
  • Oracle:jdbc:oracle:thin:@machine:1521:database
  • DB2:jdbc:db2://machine:6789/sample
  • MS SQL Server: jdbc:microsoft:sqlserver: //machine:1433;DatabaseName=database;
   selectMethod=cursor
  • Pointbase: jdbc:pointbase:embedded:sample

  
Сервер лүү холбогдох 
  • MySQL сервер ажиллаж байгааг нягтал
  • Кодын хувьд,
    • import java.sql.Connection;
      // not com.mysql.jdbc.Connection
      import java.sql.DriverManager;
      import java.
      sql.SQLException; 
    • JDBC драйверыг бүртгүүлнэ,
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    • getConnection() дүрмийг дууд,
      Connection con =
      DriverManager.getConnection("jdbc:mysql://localhost:3333/myDB", myUserName, myPassword);
    • эсвэл getConnection("jdbc:mysql:///myDB?user=dave&password=xxx")

 
Сервер лүү холбогдох 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; 
public class JdbcExample1 { 
public static void main(String args[]) {
Connection con = null;
try {
 Class.forName("com.mysql.jdbc.Driver").newInstance();
     con = DriverManager.getConnection("jdbc:mysql:///test", "root",
”rootpswd"); 
          if (!con.isClosed())
         System.out.println("Successfully connected to MySQL server...");
 
          } catch(Exception e) {
     System.err.println("Exception: " + e.getMessage());
 } finally {
          try {
             if (con != null)
                    con.close();
          } catch(SQLException e) {}
 }
}
} 

 
Connection обьектыг хэрэглэх 
  • public Statement createStatement()
              throws SQLException
    • SQL илэрхийллийг өгөгдлийн бааз руу илгээхэд зориулж Statement обьект үүсгэнэ. Параметр байхгүй SQL илэрхийллүүд нь ерөнхийдөө Statement обьектыг ашиглан биелэгддэг.
    • Statement обьект нь олон илэрхийлэлд ашиглагдаж болно
    • public PreparedStatement prepareStatement(String sql)
                throws SQLException
    • Параметртай SQL илэрхийллийг илгээхийн тулд PreparedStatement обьектыг үүсгэнэ.
    • Параметртай болон параметргүй SQL илэрхийллүүд нь PreparedStatement обьектод урьдчилан биелэж хадгалагдаж болно. Энэ обьект нь тухайн илэрхийллийг олон удаа үр ашигтайгаар хэрэгжүүлэхэд хэрэглэгдэнэ.




 

Query ажиллуулах 
  • Statement обьектод нь дараах дүрмүүд байдаг:
    • int executeUpdate() – баазыг өөрчлөөд мөрөн утга буцаадаггүй илэрхийлэл ажиллуулахад
      • Үүнд: DROP TABLE, CREATE TABLE, INSERT
      • Үр дүн хэрэгжсэн хүснэгт дэх мөрийн тоог буцаана
    • ResultSet executeQuery() Мөрийн утга буцаадаг илэрхийллүүдэд
      • Буцаах утга нь ResultSet обьект байна



 
Хүснэгт үүсгэх 
CREATE TABLE animal (
       id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
       PRIMARY KEY (id),
       name        CHAR(40),
       category    CHAR(40)
   )

 
Statement s = conn.createStatement ();
s.executeUpdate ("DROP TABLE IF EXISTS animal");
s.executeUpdate (
  "CREATE TABLE animal ("
     + "id INT UNSIGNED NOT NULL AUTO_INCREMENT,"
     + "PRIMARY KEY (id),

     + "name CHAR(40), category CHAR(40))"); 
 Хүснэгтэд утга оруулах 
int count;
count = s.executeUpdate (
       "INSERT INTO animal (name, category)"
         + " VALUES"
         + "('snake', 'reptile'),"
         + "('frog', 'amphibian'),"
         + "('tuna', 'fish'),"
         + "('racoon', 'mammal')");
 
s.close ();
System.out.println (count + " rows were inserted");

 
ResultSet 
  • executeQuery() нь ResultSet буцаана
    • ResultSet нь маш олон янзын getXXX дүрмүүдтэй, жишээ нь
      • public String getString(String columnName)
      • public String getString(int columnIndex)
    • Үр дүнгүүд нь тухайн очсон байгаа мөрнөөс авагдана
    • Мөрүүдийг гүйлгэхдээ:
      • public boolean next()
  • Statement, ResultSet обьектууд нь хэрэглэгдэж дуусаад хаагдах ёстой
    • public void close()
  
Жишээ 
Statement s = conn.createStatement ();
s.executeQuery ("SELECT id, name, category     FROM animal"); 
ResultSet rs = s.getResultSet ();
int count = 0; 
while (rs.next ()) {
    int idVal = rs.getInt ("id");
String nameVal = rs.getString ("name");
String catVal = rs.getString ("category");
System.out.println (
               "id = " + idVal 
              + ", name = " + nameVal
               + ", category = " + catVal);
++count;
} 
rs.close ();
s.close ();
System.out.println (count + " rows were      retrieved");

 
Бэлтгэгдсэн илэрхийллүүд 
Бэлтгэгдсэн илэрхийллүүд нь урьдчилан бэлтгэгдсэн
байдаг тул хэрэглэхэд илүү үр дүнтэй 
PreparedStatement s;
s = conn.prepareStatement (
         "INSERT INTO animal (name, category    VALUES(
?,?)"); 
s.setString (1, nameVal);
s.setString (2, catVal); 
int count = s.executeUpdate ();
s.close ();
System.out.println(count + " rows were inserted");
 Алдааг барих 
try {
    Statement s = conn.createStatement ();
s.executeQuery ("XYZ");
  // issue invalid query
s.close ();
}
catch (SQLException e) {
System.err.println ("Error message:
“ +  e.getMessage ());

System.err.println ("Error number:
“ +  e.getErrorCode ());
}

1 comment:

Anonymous said...

tanks (h)