Учебники

iBATIS — Краткое руководство

iBATIS — Обзор

iBATIS — это постоянная среда, которая автоматизирует отображение между базами данных SQL и объектами в Java, .NET и Ruby on Rails. Отображения отделены от логики приложения путем упаковки операторов SQL в файлы конфигурации XML.

iBATIS — это облегченный фреймворк и API персистентности, которые хороши для постоянных POJO (простых старых объектов Java).

iBATIS — это то, что известно как преобразователь данных, и обеспечивает отображение параметров и результатов между свойствами класса и столбцами таблицы базы данных.

Существенным отличием между iBATIS и другими средами персистентности, такими как Hibernate, является то, что iBATIS подчеркивает использование SQL, в то время как другие платформы обычно используют пользовательский язык запросов, например Hibernate Query Language (HQL) или Enterprise JavaBeans Query Language (EJB QL).

iBATIS Дизайн Философии

В состав iBATIS входят следующие принципы дизайна:

  • Простота — iBATIS широко рассматривается как одна из простейших сред персистентности, доступных сегодня.

  • Быстрое развитие — iBATIS делает все возможное для ускорения разработки.

  • Переносимость — iBATIS может быть реализован практически для любого языка или платформы, таких как Java, Ruby и C # для Microsoft .NET.

  • Независимые интерфейсы — iBATIS предоставляет независимые от базы данных интерфейсы и API, которые помогают остальной части приложения оставаться независимой от любых ресурсов, связанных с постоянством.

  • Открытый исходный код — iBATIS является бесплатным и открытым программным обеспечением.

Простота — iBATIS широко рассматривается как одна из простейших сред персистентности, доступных сегодня.

Быстрое развитие — iBATIS делает все возможное для ускорения разработки.

Переносимость — iBATIS может быть реализован практически для любого языка или платформы, таких как Java, Ruby и C # для Microsoft .NET.

Независимые интерфейсы — iBATIS предоставляет независимые от базы данных интерфейсы и API, которые помогают остальной части приложения оставаться независимой от любых ресурсов, связанных с постоянством.

Открытый исходный код — iBATIS является бесплатным и открытым программным обеспечением.

Преимущества iBATIS

iBATIS предлагает следующие преимущества —

  • Поддерживает хранимые процедуры — iBATIS инкапсулирует SQL в форме хранимых процедур, так что бизнес-логика хранится вне базы данных, а приложение проще в развертывании и тестировании, а также более переносимо.

  • Поддерживает встроенный SQL — прекомпилятор не требуется, и у вас есть полный доступ ко всем функциям SQL.

  • Поддерживает динамический SQL — iBATIS предоставляет функции для динамического построения запросов SQL на основе параметров.

  • Поддержка O / RM — iBATIS поддерживает многие из тех же функций, что и инструмент O / RM, такие как отложенная загрузка, выборка соединений, кэширование, генерация кода во время выполнения и наследование.

Поддерживает хранимые процедуры — iBATIS инкапсулирует SQL в форме хранимых процедур, так что бизнес-логика хранится вне базы данных, а приложение проще в развертывании и тестировании, а также более переносимо.

Поддерживает встроенный SQL — прекомпилятор не требуется, и у вас есть полный доступ ко всем функциям SQL.

Поддерживает динамический SQL — iBATIS предоставляет функции для динамического построения запросов SQL на основе параметров.

Поддержка O / RM — iBATIS поддерживает многие из тех же функций, что и инструмент O / RM, такие как отложенная загрузка, выборка соединений, кэширование, генерация кода во время выполнения и наследование.

iBATIS использует язык программирования JAVA при разработке приложений, ориентированных на базы данных. Прежде чем продолжить, убедитесь, что вы понимаете основы процедурного и объектно-ориентированного программирования — управляющие структуры, структуры данных и переменные, классы, объекты и т. Д.

Чтобы понять JAVA в деталях, вы можете пройти наш учебник JAVA .

iBATIS — Окружающая среда

Вам нужно будет настроить подходящую среду для iBATIS, прежде чем начинать с реальной работы по разработке. В этой главе объясняется, как настроить рабочую среду для iBATIS.

Установка iBATIS

Выполните следующие простые шаги для установки iBATIS на вашем компьютере с Linux —

  • Загрузите последнюю версию iBATIS с сайта Download iBATIS .

  • Разархивируйте загруженный файл, чтобы извлечь файл .jar из пакета и сохранить их в соответствующем каталоге lib.

  • Установите переменные PATH и CLASSPATH в извлеченных файлах .jar соответствующим образом.

Загрузите последнюю версию iBATIS с сайта Download iBATIS .

Разархивируйте загруженный файл, чтобы извлечь файл .jar из пакета и сохранить их в соответствующем каталоге lib.

Установите переменные PATH и CLASSPATH в извлеченных файлах .jar соответствующим образом.

$ unzip ibatis-2.3.4.726.zip
inflating: META-INF/MANIFEST.MF
   creating: doc/
   creating: lib/
	
   creating: simple_example/
   creating: simple_example/com/
   creating: simple_example/com/mydomain/
   creating: simple_example/com/mydomain/data/
   creating: simple_example/com/mydomain/domain/
	
   creating: src/
	
  inflating: doc/dev-javadoc.zip
  inflating: doc/user-javadoc.zip
  
  inflating: jar-dependencies.txt
  inflating: lib/ibatis-2.3.4.726.jar
  inflating: license.txt
  inflating: notice.txt
  inflating: release.txt
  
$pwd
/var/home/ibatis
$set PATH=$PATH:/var/home/ibatis/
$set CLASSPATH=$CLASSPATH:/var/home/ibatis\
      /lib/ibatis-2.3.4.726.jar

Настройка базы данных

Создайте таблицу EMPLOYEE в любой базе данных MySQL, используя следующий синтаксис:

mysql> CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Создать SqlMapConfig.xml

Рассмотрим следующее —

  • Мы собираемся использовать JDBC для доступа к базе данных testdb .

  • Драйвером JDBC для MySQL является «com.mysql.jdbc.Driver».

  • URL-адрес соединения: «jdbc: mysql: // localhost: 3306 / testdb».

  • Мы будем использовать имя пользователя и пароль как «root» и «root» соответственно.

  • Наши сопоставления операторов sql для всех операций будут описаны в «Employee.xml».

Мы собираемся использовать JDBC для доступа к базе данных testdb .

Драйвером JDBC для MySQL является «com.mysql.jdbc.Driver».

URL-адрес соединения: «jdbc: mysql: // localhost: 3306 / testdb».

Мы будем использовать имя пользователя и пароль как «root» и «root» соответственно.

Наши сопоставления операторов sql для всех операций будут описаны в «Employee.xml».

Исходя из вышеизложенных предположений, мы должны создать файл конфигурации XML с именем SqlMapConfig.xml со следующим содержимым. Здесь вам нужно предоставить все конфигурации, необходимые для iBatis —

Важно, чтобы оба файла SqlMapConfig.xml и Employee.xml присутствовали в пути к классам. На данный момент мы сохраним файл Employee.xml пустым и рассмотрим его содержимое в следующих главах.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <settings useStatementNamespaces="true"/>
	
   <transactionManager type="JDBC">
      <dataSource type="SIMPLE">
		
         <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
         <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/testdb"/>
         <property name="JDBC.Username" value="root"/>
         <property name="JDBC.Password" value="root"/>
			
      </dataSource>
   </transactionManager>
	
   <sqlMap resource="Employee.xml"/> 
</sqlMapConfig>

Вы также можете установить следующие необязательные свойства, используя файл SqlMapConfig.xml:

<property name="JDBC.AutoCommit" value="true"/>
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="150000"/> 
<property name="Pool.MaximumTimeToWait" value="500"/> 
<property name="Pool.PingQuery" value="select 1 from Employee"/> 
<property name="Pool.PingEnabled" value="false"/>

iBATIS — Создать операцию

Чтобы выполнить любую операцию Create, Read, Update и Delete (CRUD) с использованием iBATIS, вам нужно создать класс Plain Old Java Objects (POJO), соответствующий таблице. Этот класс описывает объекты, которые будут «моделировать» строки таблицы базы данных.

Класс POJO будет иметь реализацию для всех методов, необходимых для выполнения желаемых операций.

Предположим, у нас есть следующая таблица EMPLOYEE в MySQL:

CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Сотрудник POJO класса

Мы создали бы класс Employee в файле Employee.java следующим образом:

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   /* Define constructors for the Employee class. */
   public Employee() {}
  
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }
} /* End of Employee */

Вы можете определить методы для установки отдельных полей в таблице. Следующая глава объясняет, как получить значения отдельных полей.

Файл Employee.xml

Чтобы определить оператор отображения SQL с использованием iBATIS, мы использовали бы тег <insert>, а внутри этого определения тега мы бы определили «id», который будет использоваться в файле IbatisInsert.java для выполнения запроса SQL INSERT к базе данных.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee"> 

   <insert id="insert" parameterClass="Employee">
      insert into EMPLOYEE(first_name, last_name, salary)
      values (#first_name#, #last_name#, #salary#)

      <selectKey resultClass="int" keyProperty="id">
         select last_insert_id() as id
      </selectKey>
   </insert> 

</sqlMap>

Здесь parameterClass — может принимать значение в виде string, int, float, double или любого объекта класса в зависимости от требования. В этом примере мы передадим объект Employee в качестве параметра при вызове метода вставки класса SqlMap.

Если ваша таблица базы данных использует столбец IDENTITY, AUTO_INCREMENT или SERIAL или вы определили SEQUENCE / GENERATOR, вы можете использовать элемент <selectKey> в операторе <insert>, чтобы использовать или вернуть это значение, сгенерированное базой данных.

Файл IbatisInsert.java

Этот файл будет иметь логику прикладного уровня для вставки записей в таблицу Employee —

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisInsert{
   public static void main(String[] args)throws IOException,SQLException{
      Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

      /* This would insert one record in Employee table. */
      System.out.println("Going to insert record.....");
      Employee em = new Employee("Zara", "Ali", 5000);

      smc.insert("Employee.insert", em);

      System.out.println("Record Inserted Successfully ");
   }
} 

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisInsert.java, как показано выше, и скомпилируйте его.
  • Выполните двоичный файл IbatisInsert, чтобы запустить программу.

Вы получите следующий результат, и запись будет создана в таблице EMPLOYEE.

$java IbatisInsert
Going to insert record.....
Record Inserted Successfully

Если вы проверите таблицу EMPLOYEE, она должна отобразить следующий результат:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Zara       | Ali       |   5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)

iBATIS — операция чтения

В предыдущей главе мы обсудили, как выполнить операцию CREATE для таблицы с использованием iBATIS. В этой главе объясняется, как читать таблицу с помощью iBATIS.

У нас есть следующая таблица EMPLOYEE в MySQL —

CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Эта таблица имеет только одну запись следующим образом —

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Zara       | Ali       |   5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)

Сотрудник POJO класса

Чтобы выполнить операцию чтения, мы изменили бы класс Employee в Employee.java следующим образом:

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   /* Define constructors for the Employee class. */
   public Employee() {}
  
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }

   /* Here are the method definitions */
   public int getId() {
      return id;
   }
	
   public String getFirstName() {
      return first_name;
   }
	
   public String getLastName() {
      return last_name;
   }
	
   public int getSalary() {
      return salary;
   }
	
} /* End of Employee */

Файл Employee.xml

Чтобы определить оператор отображения SQL с использованием iBATIS, мы добавили бы тег <select> в файл Employee.xml, а внутри этого определения тега мы бы определили «id», который будет использоваться в файле IbatisRead.java для выполнения запроса SQL SELECT в базе данных.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">

   <insert id="insert" parameterClass="Employee">
      INSERT INTO EMPLOYEE(first_name, last_name, salary)
      values (#first_name#, #last_name#, #salary#)

      <selectKey resultClass="int" keyProperty="id">
         select last_insert_id() as id
      </selectKey>
   </insert>
	
   <select id="getAll" resultClass="Employee">
      SELECT * FROM EMPLOYEE
   </select>
	
</sqlMap>

Здесь мы не использовали предложение WHERE с оператором SQL SELECT. В следующей главе мы продемонстрируем, как можно использовать предложение WHERE с оператором SELECT и как передавать значения в это предложение WHERE.

Файл IbatisRead.java

Этот файл имеет логику уровня приложения для чтения записей из таблицы Employee —

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisRead{
   public static void main(String[] args)throws IOException,SQLException{
      Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

      /* This would read all records from the Employee table. */
      System.out.println("Going to read records.....");
      List <Employee> ems = (List<Employee>)
         smc.queryForList("Employee.getAll", null);
      Employee em = null;
		
      for (Employee e : ems) {
         System.out.print("  " + e.getId());
         System.out.print("  " + e.getFirstName());
         System.out.print("  " + e.getLastName());
         System.out.print("  " + e.getSalary());
         em = e; 
         System.out.println("");
      }    
		
      System.out.println("Records Read Successfully ");
   }
} 

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisRead.java, как показано выше, и скомпилируйте его.
  • Выполните двоичный файл IbatisRead, чтобы запустить программу.

Вы получите следующий результат, и запись из таблицы EMPLOYEE будет считана следующим образом:

Going to read records.....
   1  Zara  Ali  5000
Record Reads Successfully

iBATIS — Операция обновления

В предыдущей главе мы обсудили, как выполнить операцию READ для таблицы с помощью iBATIS. В этой главе объясняется, как вы можете обновлять записи в таблице с помощью iBATIS.

У нас есть следующая таблица EMPLOYEE в MySQL —

CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Эта таблица имеет только одну запись следующим образом —

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Zara       | Ali       |   5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)

Сотрудник POJO класса

Для выполнения операции udpate вам необходимо изменить файл Employee.java следующим образом:

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   /* Define constructors for the Employee class. */
   public Employee() {}
  
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }

   /* Here are the required method definitions */
   public int getId() {
      return id;
   }
	
   public void setId(int id) {
      this.id = id;
   }
	
   public String getFirstName() {
      return first_name;
   }
	
   public void setFirstName(String fname) {
      this.first_name = fname;
   }
	
   public String getLastName() {
      return last_name;
   }
   public void setlastName(String lname) {
      this.last_name = lname;
   }
	
   public int getSalary() {
      return salary;
   }
	
   public void setSalary(int salary) {
      this.salary = salary;
   }

} /* End of Employee */

Файл Employee.xml

Чтобы определить оператор отображения SQL с использованием iBATIS, мы добавили бы тег <update> в Employee.xml, а внутри этого определения тега мы бы определили «id», который будет использоваться в файле IbatisUpdate.java для выполнения запроса SQL UPDATE в базе данных.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">

   <insert id="insert" parameterClass="Employee">
      INSERT INTO EMPLOYEE(first_name, last_name, salary)
      values (#first_name#, #last_name#, #salary#)

      <selectKey resultClass="int" keyProperty="id">
         select last_insert_id() as id
      </selectKey>
   </insert>

   <select id="getAll" resultClass="Employee">
      SELECT * FROM EMPLOYEE
   </select>

   <update id="update" parameterClass="Employee">
      UPDATE EMPLOYEE
      SET    first_name = #first_name#
      WHERE  id = #id#
   </update>
	
</sqlMap>

Файл IbatisUpdate.java

Этот файл имеет логику уровня приложения для обновления записей в таблице Employee —

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisUpdate{
   public static void main(String[] args)
   throws IOException,SQLException{
      Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

      /* This would update one record in Employee table. */
      System.out.println("Going to update record.....");
      Employee rec = new Employee();
      rec.setId(1);
      rec.setFirstName( "Roma");
      smc.update("Employee.update", rec );
      System.out.println("Record updated Successfully ");

      System.out.println("Going to read records.....");
      List <Employee> ems = (List<Employee>)
         smc.queryForList("Employee.getAll", null);
      Employee em = null;
		
      for (Employee e : ems) {
         System.out.print("  " + e.getId());
         System.out.print("  " + e.getFirstName());
         System.out.print("  " + e.getLastName());
         System.out.print("  " + e.getSalary());
         em = e; 
         System.out.println("");
      }    

      System.out.println("Records Read Successfully ");
   }
} 

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisUpdate.java, как показано выше, и скомпилируйте его.
  • Выполните двоичный файл IbatisUpdate, чтобы запустить программу.

Вы получите следующий результат, и запись будет обновлена ​​в таблице EMPLOYEE, а позже эта же запись будет считана из таблицы EMPLOYEE.

Going to update record.....
Record updated Successfully
Going to read records.....
   1  Roma  Ali  5000
Records Read Successfully

iBATIS — Удалить операцию

В этой главе описывается, как удалять записи из таблицы с помощью iBATIS.

У нас есть следующая таблица EMPLOYEE в MySQL —

CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Предположим, что в этой таблице две записи:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Zara       | Ali       |   5000 |
|  2 | Roma       | Ali       |   3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)

Сотрудник POJO класса

Для выполнения операции удаления вам не нужно изменять файл Employee.java. Давайте сохраним, как это было в предыдущей главе.

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   /* Define constructors for the Employee class. */
   public Employee() {}
  
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }

   /* Here are the required method definitions */
   public int getId() {
      return id;
   }
	
   public void setId(int id) {
      this.id = id;
   }
	
   public String getFirstName() {
      return first_name;
   }
	
   public void setFirstName(String fname) {
      this.first_name = fname;
   }
	
   public String getLastName() {
      return last_name;
   }
	
   public void setlastName(String lname) {
      this.last_name = lname;
   }
	
   public int getSalary() {
      return salary;
   }
	
   public void setSalary(int salary) {
      this.salary = salary;
   }

} /* End of Employee */

Файл Employee.xml

Чтобы определить оператор отображения SQL с помощью iBATIS, мы добавили бы тег <delete> в Employee.xml, а внутри этого определения тега мы бы определили «id», который будет использоваться в файле IbatisDelete.java для выполнения запроса SQL DELETE в базе данных.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">

   <insert id="insert" parameterClass="Employee">
      INSERT INTO EMPLOYEE(first_name, last_name, salary)
      values (#first_name#, #last_name#, #salary#)

      <selectKey resultClass="int" keyProperty="id">
         select last_insert_id() as id
      </selectKey>
   </insert>

   <select id="getAll" resultClass="Employee">
      SELECT * FROM EMPLOYEE
   </select>

   <update id="update" parameterClass="Employee">
      UPDATE EMPLOYEE
      SET    first_name = #first_name#
      WHERE  id = #id#
   </update>

   <delete id="delete" parameterClass="int">
      DELETE FROM EMPLOYEE
      WHERE  id = #id#
   </delete>

</sqlMap>

Файл IbatisDelete.java

Этот файл имеет логику уровня приложения для удаления записей из таблицы Employee —

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisDelete{
   public static void main(String[] args)
   throws IOException,SQLException{
      Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

      /* This would delete one record in Employee table. */
      System.out.println("Going to delete record.....");
      int id = 1;

      smc.delete("Employee.delete", id );
      System.out.println("Record deleted Successfully ");

      System.out.println("Going to read records.....");
      List <Employee> ems = (List<Employee>)
         smc.queryForList("Employee.getAll", null);
      Employee em = null;
		
      for (Employee e : ems) {
         System.out.print("  " + e.getId());
         System.out.print("  " + e.getFirstName());
         System.out.print("  " + e.getLastName());
         System.out.print("  " + e.getSalary());
         em = e; 
         System.out.println("");
      }    

      System.out.println("Records Read Successfully ");
   }
} 

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisDelete.java, как показано выше, и скомпилируйте его.
  • Выполните бинарный файл IbatisDelete для запуска программы.

Вы получите следующий результат, и запись с ID = 1 будет удалена из таблицы EMPLOYEE, а остальные записи будут прочитаны.

Going to delete record.....
Record deleted Successfully
Going to read records.....
   2  Roma  Ali  3000
Records Read Successfully

iBATIS — Карты результатов

Элемент resultMap является наиболее важным и мощным элементом в iBATIS. Вы можете сократить кодирование JDBC до 90% с помощью iBATIS ResultMap, а в некоторых случаях это позволяет делать вещи, которые JDBC даже не поддерживает.

Конструкция ResultMaps такова, что простые операторы вообще не требуют явного отображения результатов, а более сложные операторы требуют не более, чем это абсолютно необходимо для описания отношений.

Эта глава представляет собой простое введение в iBATIS ResultMaps.

У нас есть следующая таблица EMPLOYEE в MySQL —

CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Эта таблица имеет две записи следующим образом —

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Zara       | Ali       |   5000 |
|  2 | Roma       | Ali       |   3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)

Сотрудник POJO класса

Чтобы использовать iBATIS ResultMap, вам не нужно изменять файл Employee.java. Давайте сохраним, как это было в предыдущей главе.

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   /* Define constructors for the Employee class. */
   public Employee() {}
  
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }

   /* Here are the required method definitions */
   public int getId() {
      return id;
   }
	
   public void setId(int id) {
      this.id = id;
   }
	
   public String getFirstName() {
      return first_name;
   }
	
   public void setFirstName(String fname) {
      this.first_name = fname;
   }
	
   public String getLastName() {
      return last_name;
   }
	
   public void setlastName(String lname) {
      this.last_name = lname;
   }
	
   public int getSalary() {
      return salary;
   }
	
   public void setSalary(int salary) {
      this.salary = salary;
   }

} /* End of Employee */

Файл Employee.xml

Здесь мы изменим Employee.xml, добавив тег <resultMap> </ resultMap>. Этот тег будет иметь идентификатор, который необходим для запуска этого resultMap в атрибуте resultMap нашего тега <select>.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">

   <!-- Perform Insert Operation -->
	
   <insert id="insert" parameterClass="Employee">
      INSERT INTO EMPLOYEE(first_name, last_name, salary)
      values (#first_name#, #last_name#, #salary#)

      <selectKey resultClass="int" keyProperty="id">
         select last_insert_id() as id
      </selectKey>
   </insert>

   <!-- Perform Read Operation -->
   <select id="getAll" resultClass="Employee">
      SELECT * FROM EMPLOYEE
   </select>

   <!-- Perform Update Operation -->
   <update id="update" parameterClass="Employee">
      UPDATE EMPLOYEE
      SET    first_name = #first_name#
      WHERE  id = #id#
    </update>

   <!-- Perform Delete Operation -->
   <delete id="delete" parameterClass="int">
      DELETE FROM EMPLOYEE
      WHERE  id = #id#
   </delete>

   <!-- Using ResultMap -->
   <resultMap id="result" class="Employee">
      <result property="id" column="id"/>
      <result property="first_name" column="first_name"/>
      <result property="last_name" column="last_name"/>
      <result property="salary" column="salary"/>
   </resultMap> 
	
   <select id="useResultMap" resultMap="result">
      SELECT * FROM EMPLOYEE
      WHERE id=#id#
   </select>

</sqlMap>

Файл IbatisResultMap.java

Этот файл имеет логику уровня приложения для чтения записей из таблицы Employee с помощью ResultMap —

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisResultMap{
   public static void main(String[] args)
   throws IOException,SQLException{
      Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

      int id = 1;
      System.out.println("Going to read record.....");
      Employee e = (Employee)smc.queryForObject ("Employee.useResultMap", id);

      System.out.println("ID:  " + e.getId());
      System.out.println("First Name:  " + e.getFirstName());
      System.out.println("Last Name:  " + e.getLastName());
      System.out.println("Salary:  " + e.getSalary());
      System.out.println("Record read Successfully ");
   }
} 

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisResultMap.java, как показано выше, и скомпилируйте его.
  • Выполните двоичный файл IbatisResultMap, чтобы запустить программу.

Вы получите следующий результат, который является операцией чтения таблицы EMPLOYEE.

Going to read record.....
ID:  1
First Name:  Zara
Last Name:  Ali
Salary:  5000
Record read Successfully

iBATIS — Хранимые процедуры

Вы можете вызвать хранимую процедуру, используя конфигурацию iBATIS. Прежде всего, давайте разберемся, как создать хранимую процедуру в MySQL.

У нас есть следующая таблица EMPLOYEE в MySQL —

CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Давайте создадим следующую хранимую процедуру в базе данных MySQL —

DELIMITER $$

   DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$
   CREATE PROCEDURE `testdb`.`getEmp` 
   (IN empid INT)
	
   BEGIN
      SELECT * FROM EMPLOYEE
      WHERE ID = empid;
   END $$

DELIMITER;

Давайте рассмотрим, что таблица EMPLOYEE имеет две записи следующим образом:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Zara       | Ali       |   5000 |
|  2 | Roma       | Ali       |   3000 |
+----+------------+-----------+--------+
2 row in set (0.00 sec)

Сотрудник POJO класса

Чтобы использовать хранимую процедуру, вам не нужно изменять файл Employee.java. Давайте сохраним, как это было в предыдущей главе.

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   /* Define constructors for the Employee class. */
   public Employee() {}
  
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }

   /* Here are the required method definitions */
   public int getId() {
      return id;
   }
	
   public void setId(int id) {
      this.id = id;
   }
	
   public String getFirstName() {
      return first_name;
   }
	
   public void setFirstName(String fname) {
      this.first_name = fname;
   }
	
   public String getLastName() {
      return last_name;
   }
	
   public void setlastName(String lname) {
      this.last_name = lname;
   }
	
   public int getSalary() {
      return salary;
   }
	
   public void setSalary(int salary) {
      this.salary = salary;
   }

} /* End of Employee */

Файл Employee.xml

Здесь мы бы изменили Employee.xml, добавив теги <method> </ protocol> и <parameterMap> </ parameterMap>. Здесь тег <method> </ protocol> будет иметь идентификатор, который мы будем использовать в нашем приложении для вызова хранимой процедуры.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">

   <!-- Perform Insert Operation -->
   <insert id="insert" parameterClass="Employee">
      INSERT INTO EMPLOYEE(first_name, last_name, salary)
      values (#first_name#, #last_name#, #salary#)

      <selectKey resultClass="int" keyProperty="id">
         select last_insert_id() as id
      </selectKey>
   </insert>

   <!-- Perform Read Operation -->
   <select id="getAll" resultClass="Employee">
      SELECT * FROM EMPLOYEE
   </select>

   <!-- Perform Update Operation -->
   <update id="update" parameterClass="Employee">
      UPDATE EMPLOYEE
      SET    first_name = #first_name#
      WHERE  id = #id#
   </update>

   <!-- Perform Delete Operation -->
   <delete id="delete" parameterClass="int">
      DELETE FROM EMPLOYEE
      WHERE  id = #id#
   </delete>

   <!-- To call stored procedure. -->
   <procedure id="getEmpInfo" resultClass="Employee" parameterMap="getEmpInfoCall">
      { call getEmp( #acctID# ) } 
   </procedure>
	
   <parameterMap id="getEmpInfoCall" class="map">
      <parameter property="acctID" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
   </parameterMap>

</sqlMap>

Файл IbatisSP.java

Этот файл имеет логику уровня приложения для чтения имен сотрудников из таблицы Employee с помощью ResultMap —

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisSP{
   public static void main(String[] args)
   throws IOException,SQLException{
      Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

      int id = 1;
      System.out.println("Going to read employee name.....");
      Employee e = (Employee) smc.queryForObject ("Employee.getEmpInfo", id);

      System.out.println("First Name:  " + e.getFirstName());
      System.out.println("Record name Successfully ");
   }
} 

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisSP.java, как показано выше, и скомпилируйте его.
  • Выполните двоичный файл IbatisSP для запуска программы.

Вы получите следующий результат:

Going to read record.....
ID:  1
First Name:  Zara
Last Name:  Ali
Salary:  5000
Record read Successfully

iBATIS — динамический SQL

Динамический SQL — очень мощная функция iBATIS. Иногда вам нужно изменить критерий предложения WHERE в зависимости от состояния вашего объекта параметра. В таких ситуациях iBATIS предоставляет набор динамических тегов SQL, которые можно использовать в отображаемых операторах для повышения возможности повторного использования и гибкости SQL.

Вся логика помещена в файл .XML с использованием некоторых дополнительных тегов. Ниже приведен пример, в котором оператор SELECT будет работать двумя способами:

Если вы передадите идентификатор, он вернет все записи, соответствующие этому идентификатору.

В противном случае он вернет все записи, в которых идентификатор сотрудника имеет значение NULL.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">

   <select id="findByID" resultClass="Employee">
      SELECT * FROM EMPLOYEE
		
      <dynamic prepend="WHERE ">
         <isNull property="id">
            id IS NULL
         </isNull>
			
         <isNotNull property="id">
            id = #id#
         </isNotNull>
      </dynamic>
		
   </select>
</sqlMap>

Вы можете проверить условие, используя тег <isNotEmpty> следующим образом. Здесь условие будет добавлено, только если переданное свойство не пусто.

..................
<select id="findByID" resultClass="Employee">
   SELECT * FROM EMPLOYEE
	
   <dynamic prepend="WHERE ">
      <isNotEmpty property="id">
         id = #id#
      </isNotEmpty>
   </dynamic>
	
</select>
..................

Если вам нужен запрос, в котором мы можем выбрать идентификатор и / или имя сотрудника, ваш оператор SELECT будет выглядеть следующим образом:

..................
<select id="findByID" resultClass="Employee">
   SELECT * FROM EMPLOYEE
	
   <dynamic prepend="WHERE ">
      <isNotEmpty prepend="AND" property="id">
         id = #id#
      </isNotEmpty>
		
      <isNotEmpty prepend="OR" property="first_name">
         first_name = #first_name#
      </isNotEmpty>
   </dynamic>
</select>
..................

Пример динамического SQL

В следующем примере показано, как написать оператор SELECT с помощью динамического SQL. Учтите, у нас есть следующая таблица EMPLOYEE в MySQL:

CREATE TABLE EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

Давайте предположим, что эта таблица имеет только одну запись следующим образом —

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
|  1 | Zara       | Ali       |   5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)

Сотрудник POJO класса

Чтобы выполнить операцию чтения, давайте создадим класс Employee в Employee.java следующим образом:

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   /* Define constructors for the Employee class. */
   public Employee() {}
  
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }

   /* Here are the method definitions */
   public int getId() {
      return id;
   }
	
   public String getFirstName() {
      return first_name;
   }
	
   public String getLastName() {
      return last_name;
   }
	
   public int getSalary() {
      return salary;
   }
	
} /* End of Employee */

Файл Employee.xml

Чтобы определить оператор отображения SQL с помощью iBATIS, мы добавили бы следующий измененный тег <select> в Employee.xml, а внутри этого определения тега мы бы определили «id», который будет использоваться в IbatisReadDy.java для выполнения запроса Dynamic SQL SELECT в база данных.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">
   <select id="findByID" resultClass="Employee">
      SELECT * FROM EMPLOYEE
	
      <dynamic prepend="WHERE ">
         <isNotNull property="id">
            id = #id#
         </isNotNull>
      </dynamic>
		
   </select>
</sqlMap>

Вышеуказанное выражение SELECT будет работать двумя способами:

  • Если вы передаете идентификатор, он возвращает записи, соответствующие этому идентификатору. В противном случае он возвращает все записи.

Если вы передаете идентификатор, он возвращает записи, соответствующие этому идентификатору. В противном случае он возвращает все записи.

Файл IbatisReadDy.java

Этот файл имеет логику прикладного уровня для чтения условных записей из таблицы Employee —

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisReadDy{
   public static void main(String[] args)
   throws IOException,SQLException{
      Reader rd=Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc=SqlMapClientBuilder.buildSqlMapClient(rd);

      /* This would read all records from the Employee table.*/
      System.out.println("Going to read records.....");
      Employee rec = new Employee();
      rec.setId(1);

      List <Employee> ems = (List<Employee>)  
         smc.queryForList("Employee.findByID", rec);
      Employee em = null;
		
      for (Employee e : ems) {
         System.out.print("  " + e.getId());
         System.out.print("  " + e.getFirstName());
         System.out.print("  " + e.getLastName());
         System.out.print("  " + e.getSalary());
         em = e; 
         System.out.println("");
      }    
      System.out.println("Records Read Successfully ");
   }
} 

Компиляция и запуск

Вот шаги для компиляции и запуска вышеупомянутого программного обеспечения. Убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisReadDy.java, как показано выше, и скомпилируйте его.
  • Выполните двоичный файл IbatisReadDy, чтобы запустить программу.

Вы получите следующий результат, и запись будет считана из таблицы EMPLOYEE.

Going to read records.....
   1  Zara  Ali  5000
Record Reads Successfully

Попробуйте приведенный выше пример, передав null как smc.queryForList («Employee.findByID», null) .

iBATIS OGNL Выражения

iBATIS предоставляет мощные выражения на основе OGNL для устранения большинства других элементов.

  • если заявление
  • выбрать, когда, в противном случае заявление
  • где заявление
  • оператор foreach

Заявление if

Наиболее распространенная вещь, которую нужно сделать в динамическом SQL, это условно включить часть предложения where. Например —

<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
   SELECT * FROM BLOG
   WHERE state = 'ACTIVE.
	
   <if test="title != null">
      AND title like #{title}
   </if>
	
</select>

Этот оператор предоставляет необязательный тип текстового поиска. Если вы не укажете название, все активные блоги будут возвращены. Но если вы передадите заголовок, он будет искать заголовок с заданным аналогичным условием.

Вы можете включить несколько, если следующие условия —

<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
   SELECT * FROM BLOG
   WHERE state = 'ACTIVE.
	
   <if test="title != null">
      AND title like #{title}
   </if>
	
   <if test="author != null">
      AND author like #{author}
   </if>
	
</select>

Выбор, когда и в противном случае Заявления

iBATIS предлагает элемент выбора, который похож на оператор переключения Java. Это помогает выбрать только один случай среди множества вариантов.

В следующем примере поиск будет выполняться только по заголовку, если он указан, и только по автору, если он указан. Если ни один из них не предоставлен, он возвращает только избранные блоги —

<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
   SELECT * FROM BLOG
   WHERE state = 'ACTIVE.
	
   <choose>
      <when test="title != null">
         AND title like #{title}
      </when>
		
      <when test="author != null and author.name != null">
         AND author like #{author}
      </when>
		
      <otherwise>
         AND featured = 1
      </otherwise>
   </choose>
	
</select>

Где заявление

Взгляните на наши предыдущие примеры, чтобы увидеть, что произойдет, если не будет выполнено ни одно из условий. В итоге вы получите SQL, который выглядит так:

SELECT * FROM BLOG
WHERE

Это не получится, но у iBATIS есть простое решение с одним простым изменением, все работает отлично —

<select id="findActiveBlogLike" parameterType="Blog" resultType="Blog">
   SELECT * FROM BLOG
	
   <where>
      <if test="state != null">
         state = #{state}
      </if>
		
      <if test="title != null">
         AND title like #{title}
      </if>
		
      <if test="author != null>
         AND author like #{author}
      </if>
   </where>
	
</select>

Элемент where вставляет WHERE, только когда содержащие теги возвращают какой-либо контент. Кроме того, если этот контент начинается с И или ИЛИ, он знает, как удалить его.

Заявление foreach

Элемент foreach позволяет указать коллекцию и объявить переменные элемента и индекса, которые можно использовать внутри тела элемента.

Это также позволяет вам указывать открывающую и закрывающую строки и добавлять разделитель для размещения между итерациями. Вы можете построить условие IN следующим образом:

<select id="selectPostIn" resultType="domain.blog.Post">
   SELECT *
   FROM POST P
   WHERE ID in
	
   <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
      #{item}
   </foreach>
	
</select>

iBATIS — отладка

Отладить вашу программу легко, работая с iBATIS. iBATIS имеет встроенную поддержку ведения журналов и работает со следующими библиотеками журналов и ищет их в этом порядке.

  • Jakarta Commons Logging (JCL).
  • Log4J
  • JDK логирование

Вы можете использовать любую из перечисленных выше библиотек вместе с iBATIS.

Отладка с помощью Log4J

Предполагая, что вы собираетесь использовать Log4J для регистрации. Прежде чем продолжить, вам необходимо перепроверить следующие пункты —

  • Файл JAR Log4J (log4j- {версия} .jar) должен находиться в CLASSPATH.
  • У вас есть log4j.properties, доступные в CLASSPATH.

Ниже приведен файл log4j.properties. Обратите внимание, что некоторые строки закомментированы. Вы можете раскомментировать их, если вам нужна дополнительная отладочная информация.

# Global logging configuration
log4j.rootLogger = ERROR, stdout

log4j.logger.com.ibatis = DEBUG

# shows SQL of prepared statements
#log4j.logger.java.sql.Connection = DEBUG

# shows parameters inserted into prepared statements
#log4j.logger.java.sql.PreparedStatement = DEBUG

# shows query results
#log4j.logger.java.sql.ResultSet = DEBUG

#log4j.logger.java.sql.Statement = DEBUG

# Console output
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %5p [%t] − %m%n

Вы можете найти полную документацию для Log4J с сайта ApacheДокументация Log4J .

Пример отладки iBATIS

Следующий класс Java является очень простым примером, который инициализирует, а затем использует библиотеку журналов Log4J для приложений Java. Мы будем использовать вышеупомянутый файл свойств, который находится в CLASSPATH.

import org.apache.log4j.Logger;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisUpdate{
   static Logger log = Logger.getLogger(IbatisUpdate.class.getName());

   public static void main(String[] args)
   throws IOException,SQLException{
      Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

      /* This would insert one record in Employee table. */
      log.info("Going to update record.....");
      Employee rec = new Employee();
      rec.setId(1);
      rec.setFirstName( "Roma");
      smc.update("Employee.update", rec );
      log.info("Record updated Successfully ");

      log.debug("Going to read records.....");
      List <Employee> ems = (List<Employee>) 
         smc.queryForList("Employee.getAll", null);
      Employee em = null;
		
      for (Employee e : ems) {
         System.out.print("  " + e.getId());
         System.out.print("  " + e.getFirstName());
         System.out.print("  " + e.getLastName());
         System.out.print("  " + e.getSalary());
         em = e;
         System.out.println("");
      }
      log.debug("Records Read Successfully ");
   }
}

Компиляция и запуск

Прежде всего, убедитесь, что вы правильно установили PATH и CLASSPATH, прежде чем приступить к компиляции и выполнению.

  • Создайте Employee.xml, как показано выше.
  • Создайте Employee.java, как показано выше, и скомпилируйте его.
  • Создайте IbatisUpdate.java, как показано выше, и скомпилируйте его.
  • Создайте log4j.properties, как показано выше.
  • Выполните двоичный файл IbatisUpdate, чтобы запустить программу.

Вы бы получили следующий результат. Запись будет обновлена ​​в таблице EMPLOYEE, а позже эта же запись будет считана из таблицы EMPLOYEE.

DEBUG [main] - Created connection 28405330.
DEBUG [main] - Returned connection 28405330 to pool.
DEBUG [main] - Checked out connection 28405330 from pool.
DEBUG [main] - Returned connection 28405330 to pool.
   1  Roma  Ali  5000
   2  Zara  Ali  5000
   3  Zara  Ali  5000

Методы отладки

В приведенном выше примере мы использовали только метод info () , однако вы можете использовать любой из следующих методов в соответствии с вашими требованиями:

public void trace(Object message);
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);

iBATIS — Hibernate

Между iBATIS и Hibernate есть серьезные различия. Оба решения работают хорошо, учитывая их конкретную область. iBATIS предлагается в случае —

  • Вы хотите создавать свои собственные SQL и готовы поддерживать их.
  • Ваша среда управляется реляционной моделью данных.
  • Вы должны работать над существующими и сложными схемами.

Используйте Hibernate, если среда управляется объектной моделью и должна автоматически генерировать SQL.

Разница между iBATIS и Hibernate

И Hibernate, и iBATIS являются инструментами объектно-реляционного сопоставления (ORM) с открытым исходным кодом, доступными в отрасли. Использование каждого из этих инструментов зависит от контекста, который вы используете.

В следующей таблице приведены различия между iBATIS и Hibernate.

Ibatis зимовать
iBATIS проще. Это входит в намного меньший размер пакета. Hibernate генерирует SQL для вас, что означает, что вам не нужно тратить время на генерацию SQL.
iBATIS является гибким. Это предлагает более быстрое время разработки. Hibernate обладает высокой масштабируемостью. Это обеспечивает намного более продвинутый кеш.
iBATIS использует SQL, который может зависеть от базы данных. Hibernate использует HQL, который относительно независим от баз данных. Проще изменить дб в спящем режиме.
iBatis сопоставляет ResultSet из JDBC API с вашими объектами POJO, поэтому вам не нужно заботиться о структурах таблиц. Hibernate сопоставляет ваши объекты Java POJO с таблицами базы данных.
Использовать хранимую процедуру в iBATIS довольно просто. Использование хранимых процедур в Hibernate немного сложнее.

И Hibernate, и iBATIS получают хорошую поддержку от среды SPRING, поэтому выбор одного из них не должен быть проблемой.

iBATOR — Введение

iBATOR — генератор кода для iBATIS. iBATOR анализирует одну или несколько таблиц базы данных и генерирует артефакты iBATIS, которые можно использовать для доступа к таблицам.

Позже вы можете написать свой собственный код SQL или хранимую процедуру, чтобы удовлетворить ваши требования. iBATOR генерирует следующие артефакты —

  • SqlMap XML-файлы
  • Классы Java для соответствия первичному ключу и полям таблицы
  • Классы DAO, которые используют вышеуказанные объекты (необязательно)

iBATOR может работать как отдельный JAR-файл, или как задача Ant, или как плагин Eclipse. В этом руководстве описан самый простой способ создания файлов конфигурации iBATIS из командной строки.

Скачать iBATOR

Загрузите автономный JAR, если вы используете IDE, отличную от Eclipse. Автономный JAR включает задачу Ant для запуска iBATOR, или вы можете запустить iBATOR из командной строки Java-кода.

Вы можете скачать zip-файл с Download iBATOR .

Вы можете проверить онлайн документацию — Документация iBATOR .

Создание файла конфигурации

Чтобы запустить iBATOR, выполните следующие действия:

Шаг 1

Создайте и заполните файл конфигурации ibatorConfig.xml соответствующим образом. Как минимум, вы должны указать —

  • Элемент <jdbcConnection> для указания способа подключения к целевой базе данных.

  • Элемент <javaModelGenerator> для указания целевого пакета и целевого проекта для созданных объектов модели Java.

  • Элемент <sqlMapGenerator> для указания целевого пакета и целевого проекта для созданных файлов карт SQL.

  • Элемент <daoGenerator> для указания целевого пакета и целевого проекта для сгенерированных интерфейсов и классов DAO (вы можете опустить элемент <daoGenerator>, если вы не хотите создавать DAO).

  • По крайней мере, один элемент <table> базы данных

Элемент <jdbcConnection> для указания способа подключения к целевой базе данных.

Элемент <javaModelGenerator> для указания целевого пакета и целевого проекта для созданных объектов модели Java.

Элемент <sqlMapGenerator> для указания целевого пакета и целевого проекта для созданных файлов карт SQL.

Элемент <daoGenerator> для указания целевого пакета и целевого проекта для сгенерированных интерфейсов и классов DAO (вы можете опустить элемент <daoGenerator>, если вы не хотите создавать DAO).

По крайней мере, один элемент <table> базы данных

ПРИМЕЧАНИЕ. — См. Страницу « Ссылка на файл конфигурации XML» для примера файла конфигурации iBATOR.

Шаг 2

Сохраните файл в удобном месте, например, по адресу: \ temp \ ibatorConfig.xml.

Шаг 3

Теперь запустите iBATOR из командной строки следующим образом:

java -jar abator.jar -configfile \temp\abatorConfig.xml -overwrite

Он сообщит, что iBATOR должен запускаться с использованием вашего файла конфигурации. Он также скажет iBATOR перезаписать любые существующие файлы Java с тем же именем. Если вы хотите сохранить любые существующие файлы Java, пропустите параметр -overwrite .

В случае конфликта iBATOR сохраняет вновь созданный файл с уникальным именем.

После запуска iBATOR вам необходимо создать или изменить стандартные конфигурационные файлы iBATIS, чтобы использовать только что сгенерированный код. Это объясняется в следующем разделе.

Задачи после запуска iBATOR

После запуска iBATOR вам необходимо создать или изменить другие артефакты конфигурации iBATIS. Основные задачи заключаются в следующем —

  • Создайте или измените файл SqlMapConfig.xml.
  • Создайте или измените файл dao.xml (только если вы используете iBATIS DAO Framework).

Каждая задача подробно описана ниже —

Обновление файла SqlMapConfig.xml

iBATIS использует файл XML, обычно называемый SqlMapConfig.xml, для указания информации для соединения с базой данных, схемы управления транзакциями и файлов XML карты SQL, которые используются в сеансе iBATIS.

iBATOR не может создать этот файл для вас, потому что он ничего не знает о вашей среде выполнения. Однако некоторые элементы в этом файле имеют непосредственное отношение к элементам, сгенерированным iBATOR.

Конкретные потребности iBATOR в файле конфигурации следующие:

  • Пространства имен операторов должны быть включены.
  • Сгенерированные iBATOR файлы XML карты SQL должны быть перечислены.

Например, предположим, что iBATOR сгенерировал XML-файл карты SQL с именем MyTable_SqlMap.xml и что этот файл был помещен в пакет test.xml вашего проекта. Файл SqlMapConfig.xml должен содержать следующие записи:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <!-- Statement namespaces are required for Abator -->
   <settings useStatementNamespaces="true" />

   <!-- Setup the transaction manager and data source that are
   appropriate for your environment
   -->
	
   <transactionManager type="...">
      <dataSource type="...">
      </dataSource>
   </transactionManager>

   <!-- SQL Map XML files should be listed here -->
   <sqlMap resource="test/xml/MyTable_SqlMap.xml" />

</sqlMapConfig>

Если существует более одного XML-файла карты SQL (как это обычно бывает), файлы могут быть перечислены в любом порядке с повторяющимися элементами <sqlMap> после элемента <actionManager>.

Обновление файла dao.xml

Инфраструктура iBATIS DAO настраивается с помощью XML-файла, обычно называемого dao.xml.

Инфраструктура iBATIS DAO использует этот файл для управления информацией о подключении к базе данных для DAO, а также для перечисления классов реализации DAO и интерфейсов DAO.

В этом файле вы должны указать путь к файлу SqlMapConfig.xml и все сгенерированные iBATOR интерфейсы DAO и классы реализации.

Например, предположим, что iBATOR сгенерировал интерфейс DAO с именем MyTableDAO и класс реализации с именем MyTableDAOImpl, и что файлы были помещены в пакет test.dao вашего проекта.

Файл dao.xml должен иметь эти записи —

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE daoConfig PUBLIC "-//ibatis.apache.org//DTD DAO Configuration 2.0//EN" "http://ibatis.apache.org/dtd/dao-2.dtd">

<daoConfig>

   <context>
	
      <transactionManager type="SQLMAP">
         <property name="SqlMapConfigResource" value="test/SqlMapConfig.xml"/>
      </transactionManager>

      <!-- DAO interfaces and implementations should be listed here -->
      <dao interface="test.dao.MyTableDAO" implementation="test.dao.MyTableDAOImpl" />
   </context>
	
</daoConfig>

ПРИМЕЧАНИЕ. — Этот шаг требуется только в том случае, если вы сгенерировали DAO для структуры iBATIS DAO.