Thursday, March 28, 2013




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 Сэтгэгдэл: