Технологии Java для работы с базами данных (1127026)
Текст из файла
Технологии Java для работы с базами данныхВзаимодействие с базами данных с помощью JDBCИмеется несколько способов организовать взаимодействие с базой данных в программе наJava. Наиболее простой и прямой — использовать API JDBC (Java Database Connectivity).Более сложные, но зато более гибкие решения — использование JDO (Java Data Objects)или одной из библиотек ORM (Object-Relational Mapping), например, Hibernate.JDBC предоставляет общий программный интерфейс (API) для доступа к базам данных врамках различных СУБД.
Для такого доступа необходимо наличие для данной СУБДдрайвера, реализующего этот API.В рамках JDBC данные представлены в той же структуре, что и в реляционных СУБД, —как записи, состоящие из нескольких полей и размещенные в таблицах. Данные могутизвлекаться в виде отношений, для этого JDBC предоставляет интерфейс для выполнениязапросов на SQL. В отличие от этого подхода, ORM предоставляют доступ к хранимымданным в виде объектов.Классы и интерфейсы JDBC находятся в пакетах java.sql и javax.sql (последний входит всостав J2EE).
Основной механизм получения доступа к данным — посылка запросов наSQL, оформленных в виде объектов, реализующих интерфейс Statement. Для получениятаких объектов, нужно установить с базой данных соединение (представлено как объектConnection), используя классы драйвера JDBC для нужной СУБД, либо классDriverManager, либо интерфейс DataSource. Использование последнего предпочтительнопри необходимости поддерживать распределенные транзакции, пул соединений и SQLзапросов, т.е. в сложных системах, которые должны эффективно обслуживать многопараллельно работающих пользователей и связываться одновременно с несколькимиисточниками данных.Простейшая программа, связывающаяся с СУБД при помощи JDBC, выглядит примернотак.importimportimportimportimportjava.sql.Connection;java.sql.ResultSet;java.sql.SQLException;java.sql.Statement;java.util.Properties;import org.hsqldb.jdbcDriver; // используется JDBC драйвер HyperSQLpublic class JDBCRequest{public static void main(String[] args){try{Properties props = new Properties();props.setProperty("username", "username");props.setProperty("password", "password");Connection cnx = jdbcDriver.getConnection("jdbc:hsqldb:hsql://localhost", props);Statement stmt = cnx.createStatement();// предполагаем, что есть таблица book с полями title, isbn и issuetimestmt.execute("SELECT title, isbn, issuetime FROM book");ResultSet rs = stmt.getResultSet();while(rs.next()){System.out.println("" + rs.getRow() + ": Title: " + rs.getString(1)+ "; ISBN: " + rs.getString(2)+ "; Time: " + rs.getTimestamp(3));}}catch (SQLException e){e.printStackTrace();}}}Другие классы JDBC служат обертками для типов данных SQL, позволяюторганизовывать кэширование данных и транзакции при работе с базами данных,использовать заранее скомпилированные SQL-запросы с устанавливаемыми при ихвыполнении параметрами для повышения эффективности работы и пр.Взаимодействие с базами данных с помощью HibernateHibernate является примером преобразователя реляционных данных в объектноепредставление (Object-Relational Mapper, ORM).
Для Java другими примерами такого родаявляются также реализации JDO (например, JPOX), iBATIS, EclipseLink, TopLink.ORM позволяют работать с данными как с обычными объектами, независимо от того, какони представлены в базе данных.При этом, естественно, нужно определить классы, которые будут использоваться как типыхранимых объектов, и способ отображения таблиц и их полей на эти классы. Hibernateпозволяет в качестве классов хранимых объектов использовать произвольные Java классы.Отображение полей таблиц на свойства этих классов (свойство типа Type с именемsomething в Java — это один или пара методов Type getSomething(), voidsetSomething(Type v), для свойств булевского типа вместо getSomething() пишется методisSomething()) описывается либо в специальном формате на базе XML, либо с помощьюаннотаций классов и их свойств.Для примера рассмотрим базу данных с изображенной на Рисунке 1 схемой.
Она содержиттри основных таблицы, содержащие данные о книгах (book), их авторах (author) ииздателях (publisher). Поскольку связь между книгами и авторами множественная с обеихсторон, введена вспомогательная таблица bookauthor.Данные этих таблиц будем представлять в виде объектов трех классов — Book, Author иPublisher, код которых представлен ниже.bookauthorFK aid intFK bid intauthor1,10,Nidintname varchar (255)0,Nid intti tle varchar (255)1,10,Nbookidti tleisbnFK pidintvarchar (255)char(13)intpubli sher1,1Рисунок 1. Схема базы данныхpublic class Book{private int id;private String title;private String isbn;private Set<Author> authors;private Publisher publisher;public int getId()public void setId(int id){ return id;}{ this.id = id; }public String getTitle(){ return title;}public void setTitle(String title) { this.title = title; }public String getISBN()public void setISBN(String isbn){ return isbn;}{ this.isbn = isbn; }public Set<Author> getAuthors(){ return authors; }public void setAuthors(Set<Author> authors) { this.authors = authors; }public Publisher getPublisher() { return publisher; }public void setPublisher(Publisher publisher){ this.publisher = publisher; }}public class Author{private int id;private String name;private String isbn;private Set<Book> books;public int getId()public void setId(int id){ return id;}{ this.id = id; }public String getName(){ return name;}public void setName(String name) { this.name = name; }public Set<Book> getBooks(){ return books; }public void setBooks(Set<Book> books) { this.books = books; }}public class Publisher{private int id;private String title;private Set<Book> books;public int getId()public void setId(int id){ return id;}{ this.id = id; }public String getTitle(){ return title;}public void setTitle(String title) { this.title = title; }public Set<Book> getBooks(){ return books; }public void setBooks(Set<Book> books) { this.books = books; }}Заметим, что в этом коде скалярные поля таблиц (имеющие элементарные типы,например, id, title, isbn) представлены так же, как и связи в виде свойств.
Множественныесвязи представлены в виде коллекций объектов, связанных с данным, причем связь«многие ко многим» представлена двумя полями-коллекциями в соответствующихклассах.Чтобы определить отображение полей в свойства необходим конфигурационный файлпримерно следующего вида.<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="Author" table="author"><id name="id" column="id" type="int"><generator class="identity"/></id><property name="Name" column="name" type="string"/><set name="Books" lazy="true" table="bookauthor"><key column="aid"/><many-to-many class="Book" column="bid"/></set></class><class name="Publisher" table="publisher"><id name="id" column="id" type="int"><generator class="identity"/></id><property name="Title" column="title" type="string"/><set name="Books" inverse="true" lazy="true"><key column="pid"/><one-to-many class="Book"/></set></class><class name="Book" table="book"><id name="id" column="id" type="int"><generator class="identity"/></id><property name="Title" column="title" type="string"/><property name="ISBN" column="isbn" type="string"/><many-to-one name="Publisher" class="Publisher" column="pid"/><set name="Authors" inverse="true" lazy="true" table="bookauthor"><key column="bid"/><many-to-many class="Author" column="aid"/></set></class></hibernate-mapping>В этом файле определяется соответствие между полями таблиц и свойствами классов.Если имена классов и таблиц или свойств и полей совпадают, достаточно указыватьтолько имя класса или свойства.При определении множественных связей используются специфические конструкции.Чтобы получить работоспособный пример, нужен некоторый код, который будетвыполнять запросы к базе данных, используя библиотеку Hibernate.
Такие запросыстроятся с помощью методов createQuery() и createCriteria() класса org.hibernate.Session.Пример работы с описанной базой может выглядеть так.public class DBManager{public static void main(String[] args){Session s = new Configuration().configure().buildSessionFactory().getCurrentSession();s.beginTransaction();List<Book> l = s.createQuery("from Book").list();for(Book b : l){System.out.println("ID: " + b.getId()+ "; Title: " + b.getTitle()+ "; ISBN: " + b.getISBN()+ "; Publisher: " + b.getPublisher().getTitle());System.out.print('{');for(Author a : b.getAuthors()){System.out.print("" + a.getName() + "; ");}System.out.println('}');}}}Для завершения примера необходим только еще один конфигурационный файл Hibernate,определяющий свойства соединения с базой данных. Он может выглядеть так.<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/HibernateConfiguration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernateconfiguration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">org.hsqldb.jdbcDriver</property><property name="connection.url">jdbc:hsqldb:hsql://localhost</property><property name="connection.username">sa</property><!-- SQL dialect --><property name="dialect">org.hibernate.dialect.HSQLDialect</property><!-- JDBC connection pool (use the built-in) --><property name="connection.pool_size">1</property><!-- Enable Hibernate's automatic session context management --><property name="current_session_context_class">thread</property><!-- Disable the second-level cache --><property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property><!-- Echo all executed SQL to stdout --><!-- <property name="show_sql">true</property> --><mapping resource="library.hbm.xml"/></session-factory></hibernate-configuration>Основные параметры, которые нужно установить — свойства соединения JDBC, включаякласс драйвера.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.