তথ্যের ধরণ

আসুন টেবিলটি দেখে নেওয়া যাক:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
আইডি java.lang.Integer আইএনটি 4
নাম java.lang.string ভার্চার 12
স্তর java.lang.Integer আইএনটি 4
তৈরীর তারিখ java.sql.date তারিখ 91
প্রস্থান কোড 0 দিয়ে প্রক্রিয়া শেষ হয়েছে

তৃতীয় কলামে আমরা প্রকারগুলি দেখতে পাই: INT , VARCHAR , DATE । এই SQL সার্ভার প্রকার. সার্ভার মানে সেই ধরনের ডেটা দেয় যা সে জানে। কিভাবে এই ধরনের জাভা ধরনের রূপান্তরিত হয়?

এটি ঠিক এমন একটি জিনিস যা JDBC এর সাথে প্রমিত করা হয়েছে। JDBC এর নির্মাতারা SQL প্রকারের একটি তালিকা ঠিক করে শুরু করেছেন। ধ্রুবক সহ একটি বিশেষ শ্রেণী রয়েছে:

class java.sql.Types {
   public static final int CHAR         =   1;
   public static final int NUMERIC    	=   2;
   public static final int DECIMAL     	=   3;
   public static final int INTEGER      =   4;
   public static final int FLOAT        =   6;
   public static final int REAL         =   7;}

নম্বরটি ক্লাসের একটি সিরিয়াল নম্বর নয়, তবে SQL স্পেসিফিকেশনে SQL প্রকারের তালিকায় একটি আইডি টাইপ। এই সংখ্যাগুলি আপনি বক্তৃতার শুরুতে উদাহরণে দেখেছেন।

এছাড়াও ResultSet ক্লাসে এমন পদ্ধতি রয়েছে যা একটি ডেটা টাইপকে অন্যটিতে রূপান্তর করতে পারে। সব ধরনের একে অপরের রূপান্তর করা যাবে না, কিন্তু যুক্তি যথেষ্ট পরিষ্কার. এখানে আপনার জন্য একটি ভাল স্প্রেডশীট রয়েছে:

পদ্ধতি এসকিউএল ডেটা টাইপ
int getInt() সংখ্যাসূচক, পূর্ণসংখ্যা, দশমিক
ফ্লোট getFloat() সংখ্যাসূচক, পূর্ণসংখ্যা, দশমিক, ফ্লোট, বাস্তব
ডাবল getDoublel() সংখ্যাসূচক, পূর্ণসংখ্যা, দশমিক, ফ্লোট, বাস্তব
তারিখ getDate() তারিখ, সময়, টাইমস্ট্যাম্প
সময় getTime() তারিখ, সময়, টাইমস্ট্যাম্প
টাইমস্ট্যাম্প getTimestamp() তারিখ, সময়, টাইমস্ট্যাম্প
স্ট্রিং getString() চর, ভার্চার

সমস্ত SQL প্রকারের মধ্যে, কিছু গোষ্ঠী স্পষ্টভাবে আলাদা করা যেতে পারে:

  • সংখ্যা
  • সময়
  • লাইন
  • বাইট বস্তু

যাইহোক, আপনি getInt() পদ্ধতি লক্ষ্য করেছেন ?

JDBC এবং NULL

আপনি কি লক্ষ্য করেছেন রেজাল্টসেট ক্লাসের getInt ( ) পদ্ধতিতে কী ভুল আছে ? আসুন আবার এর স্বাক্ষর দেখি:

int getInt(column)

এই পদ্ধতিটি একটি int প্রদান করে , একটি পূর্ণসংখ্যা নয়। কারণ যখন জেডিবিসি টাইপ ইন্টিজার তৈরি করা হয়েছিল, তখন এটি বিদ্যমান ছিল না। ঠিক আছে, বলি। তারপর আমার একটি প্রশ্ন আছে:

আমার কাছে একটি ডাটাবেসের একটি টেবিল আছে যেখানে একটি INT NULL কলাম রয়েছে যা INT হতে পারে তবে NULLও হতে পারে। আমি কিভাবে এই কলাম থেকে নাল মান পেতে পারি?

চিন্তা করবেন না, সবকিছু আপনার জন্য চিন্তা করা হয়েছে.

সমাধান এক । যদি জাভাতে এসকিউএল টাইপটি তারিখ বা স্ট্রিংয়ের মতো একটি রেফারেন্স টাইপ দ্বারা উপস্থাপিত হয়, তাহলে কোন সমস্যা নেই । এই ধরনের ভেরিয়েবল নাল মান নিতে পারে.

সমাধান দুইআদিম প্রকারগুলি শূন্য হতে পারে না, তাই getInt() এর মতো পদ্ধতিগুলি কেবল একটি ডিফল্ট মান প্রদান করবে । int এর জন্য এটি 0, float = 0.0f এর জন্য, ডবল = 0.0d এবং এর মতো।

এবং তাহলে কিভাবে বুঝবেন যে কলামে কি ছিল: 0 বা NULL? আর এই প্রশ্নের উত্তর আছে দলের কাছে।

সমাধান তিন । ResultSet ক্লাসে একটি বিশেষ wasNull() পদ্ধতি রয়েছে যা সত্য রিটার্ন করে যদি পদ্ধতিটি NULL এর পরিবর্তে একটি ভিন্ন মান প্রদান করে

আমি এখানে লিখেছি সবকিছু ঠিক কাজ করে. উদাহরণ:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    int level = results.getInt("level");

if (results.wasNull()) {
    System.out.println("Level is null");
} else {
   System.out.println("Level is " + level);
    }

getInt() মেথড কল করার সময় যদি null রিটার্ন করার কথা ছিল , তাহলে wasNull() মেথড true রিটার্ন করবে, অন্যথায় wasNull() মেথড মিথ্যা রিটার্ন করবে।

এটি শুধুমাত্র আদিম ধরনের জন্য কাজ করে না:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    String name = results.getString("name");

 	if (results.wasNull()) {
 	    System.out.println("Name is null");
 	} else {
 	   System.out.println("User name is " + name);
    }

এটি অবশ্যই একটি ক্রাচ। কিন্তু NullPointerException এর সাথে কোন সমস্যা নেই । সবকিছুর ইতিবাচক দিক দেখুন :)

JDBC-তে ডেটা টাইপের ক্ষেত্রে কী ভুল?

পরীক্ষা চালিয়ে যাওয়া যাক। GetDate(কলাম) পদ্ধতি ঘনিষ্ঠভাবে দেখুন ? তার সমস্যা কি? এই পদ্ধতির নিম্নলিখিত ধরণের ফলাফল রয়েছে:

java.sql.Date

এটা নাল সংরক্ষণ করতে পারেন, যা যথেষ্ট ভাল. কিন্তু তবুও, তার সাথে কিছু ভুল আছে। ক্লু ! এখানে সঠিক তারিখের ধরনটি কেমন দেখাচ্ছে:

java.util.Date

তাদের বিভিন্ন প্যাকেজ আছে! এগুলি সাধারণত বিভিন্ন ধরণের ডেটা। এবং এখানে কারণ ...

20 শতকের 70 এর দশক থেকে ডেটাবেসগুলি সময় সংরক্ষণের জন্য 3 ধরণের ডেটা সমর্থন করে:

  • DATE - তারিখ সংরক্ষণ করে: বছর, মাস, দিন।
  • TIME - সময় সঞ্চয় করে: ঘন্টা, মিনিট, সেকেন্ড।
  • টাইমস্ট্যাম্প - সময়ের মধ্যে একটি নির্দিষ্ট বিন্দু সঞ্চয় করে: তারিখ, সময় এবং মিলিসেকেন্ড।

জাভা ভাষার অস্তিত্বের প্রথম 10 বছরের জন্য শুধুমাত্র একটি ডেটা টাইপ ছিল, java.util.Date , যা UNIX TIME ফরম্যাটে সময়ের মধ্যে একটি বিন্দু সংরক্ষণ করে: 1970 এর শুরু থেকে মিলিসেকেন্ডের সংখ্যা।

অতএব, জেডিবিসি স্ট্যান্ডার্ডের নির্মাতারা জাভাতে আরও তিনটি ডেটা টাইপ যোগ করেছেন - বিশেষ করে জেডিবিসির জন্য:

  • java.sql.date
  • java.sql.Time
  • java.sqlTimestamp

এবং তাই রেজাল্টসেট ইন্টারফেসের পদ্ধতিতে নির্দিষ্ট ডেটা প্রকার রয়েছে:

এসকিউএল টাইপ জাভা টাইপ পদ্ধতি
তারিখ java.sql.date java.sql.date getDate()
টাইম java.sql.Time java.sql.Time getTime()
টাইমস্ট্যাম্প java.sql.timestamp java.sql.Timestamp getTimestamp()

এবং এই ধরনের আপনি এখানে দেখতে পাচ্ছেন:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
আইডি java.lang.Integer আইএনটি 4
নাম java.lang.string ভার্চার 12
স্তর java.lang.Integer আইএনটি 4
তৈরীর তারিখ java.sql.date তারিখ 91
প্রস্থান কোড 0 দিয়ে প্রক্রিয়া শেষ হয়েছে

অনুমান করুন এখানে কি অনুপস্থিত? জাভা ডেটটাইম এপিআই-তে উপস্থিত ডেটা প্রকারগুলি:

  • স্থানীয় তারিখ
  • স্থানীয় সময়
  • স্থানীয় তারিখের সময়