Статьи

IDE NetBeans 6.9: Java с Microsoft SQL 2005

Поскольку разработчики могут выбрать (или выбрали для них) свое программное обеспечение, у них были разные сценарии для работы. В основном компании используют C # с MSSQL или Java с Oracle. Сегодня я покажу немного смешанный сценарий, в котором разработчик использует Java в качестве языка программирования и Microsoft SQL 2005 в качестве своей базы данных. Я предоставлю наиболее популярные способы использования MSSQL 2005, такие как выполнение запроса из кода Java, использование хранимых процедур, работа с выходными параметрами и так далее. Мы начнем с нуля!

Требования

Я ожидаю, что вы знакомы с SQL и основами Java. Если вы не знаете, что такое JDBC, вы можете посмотреть по адресу:

http://en.wikipedia.org/wiki/Java_Database_Connectivity

 1) Загрузка драйвера JDBC.

В этой статье мы будем использовать самую свежую версию JDBC, предоставленную Microsoft: драйвер JDBC Microsoft SQL Server 3.0 ( sqljdbc_3.0.1301.101_enu.exe ). Вы можете скачать его с:

http://www.microsoft.com/downloads/details.aspx?FamilyID=%20a737000d-68d0-4531-b65d-da0f2a735707&displaylang=en

 2) Регистрация водителя и установление соединения.

После загрузки и извлечения всех файлов из sqljdbc_3.0.1301.101_enu.exe вы можете запустить NetBeans. Теперь выберите: вкладка «Службы» и щелкните правой кнопкой мыши на « Драйверы»  и выберите « Новый драйвер» . В новом окне нажмите кнопку Добавить … и найдите свой каталог  \ YourPath \ Драйвер JDBC Microsoft SQL Server 3.0 \ sqljdbc_3.0 \ enu \. Теперь выберите файл sqljdbc4.jar и нажмите Открыть . Вы должны увидеть автоматически выбранный класс драйвера: com.microsoft.sqlserver.jdbc.SQLServerDriver . Теперь нажмите ОК . Вы должны увидеть следующее окно:

 

Установление соединения:

2.1) Через режим аутентификации SQL

Если вы хотите соединиться с этим режимом, вы должны щелкнуть Базы данных и выбрать Новое соединение . В раскрывающемся списке с именем драйвера выберите Microsoft SQL Server 2005. При попытке подключения к локальному серверу введите имя хоста -> localhost , База данных -> yourDB , Имя пользователя -> yourSqlUser, Password -> UserPassword и нажмите OK . На вкладке « Дополнительно » выберите схему dbo (или, если dbo не виден, выберите db_owner ). 

 

 

2.2) Через режим аутентификации Windows

Здесь нам нужно сделать дополнительную работу. Когда вы смотрите в Microsoft SQL Server JDBC Driver 3.0 \ sqljdbc_3.0 \ enu \ auth, есть файл dll. Нам нужно включить этот файл в переменную вашей системы Windows PATH. Нажмите на свой старт меню и щелкните правой кнопкой мыши над компьютер рядом выберите свойства -> Расширенные настройки -> Системные переменные -> выберите PATH переменной и выберите редактирования. В конце вставки PATH : fullPath \ Драйвер JDBC Microsoft SQL Server 3.0 \ sqljdbc_3.0 \ enu \ auth \ x86 \ теперь нажмите OK и сохраните другие окна. Если вы завершили эту работу, снова перейдите на вкладку « Службы » и выберите « Новое соединение» . Снова выберите Microsoft SQL Server 2005, но теперь заполните эти поля значениями:

Host -> localhost, База данных: yourDb , Дополнительные свойства -> integratedSecurity = true; , Если вы знакомы с SQL Managment Studio или Visual Studio, вы найдете сходство с connectionString . Ваш URL должен выглядеть следующим образом: jdbc: sqlserver: // localhost; databaseName = mgr_db_1; integratedSecurity = true . На вкладке «Дополнительно» выберите схему dbo.

 

3) Запрос базы данных из окна запроса

3.1) Выбор

Теперь давайте сделаем запрос «Hello world», чтобы проверить наше соединение и увидеть некоторый результат:

 

 

 3.2) Выполнение хранимых процедур

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

DECLARE @LanguageName nvarchar(50),@LanguageDescription nvarchar(100),
@LanguageFlag nvarchar(256),@GblLanguageId int
SET @LanguageName = N'Polish'
SET @LanguageDescription = N'Choose Polish - wybierz język polski'
SET @LanguageFlag = 'http://www.eleonorandre.pl/intro/polish_flag.gif'
EXEC gblLanguage_InsertLanguage @LanguageName,@LanguageDescription,@LanguageFlag,@GblLanguageId OUTPUT

SELECT @GblLanguageId

 

 3.3) Создание хранимой процедуры

 

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[gblUserContact_InsertUserContact]
@UserId uniqueidentifier,
@Email varchar(150),
@Phone varchar(50),
@URL varchar(100),
@Description nvarchar(256),
@Address nvarchar(100),
@GblContactId int out
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ContactId int
-- executing one stored procedure from another one and retreive output parameter
EXEC gblContact_InsertContact @Email,@Phone,@URL,@Description,@Address,@ContactId OUTPUT

INSERT INTO gblUserContact VALUES(@UserId,@ContactId)
SET @GblContactId = SCOPE_IDENTITY()
END
GO

 

 

 4) Запрос базы данных из кода Java

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

4.1) Создание и настройка нового приложения.

Откройте вашу IDE и выберите  Файл -> Новый проект -> Приложение Java . Назовите свое приложение по своему желанию и нажмите « Готово» . Теперь нам нужно добавить библиотеку JDBC в ваше приложение. Щелкните правой кнопкой мыши по библиотекам и выберите « Добавить JAR / папку» . Найдите jdbcsql4.jar и нажмите Открыть. Ваше приложение должно выглядеть так:

 

 4.2) Работа с базой данных в Java

Пока все хорошо, но сейчас я покажу вам и немного объясню архитектуру JDBC. JDBC — это API (Advanced Programming Interface), который содержит огромный набор интерфейсов Java или абстрактных классов для унификации работы с любой базой данных. Когда разработчик хочет соединиться с определенной базой данных, ему или ей необходимо получить драйвер JDBC, который является реализацией JDBC API. В идеальных условиях разработчику нужно только изменить драйвер JDBC с Oracle на MSSQL (или любой другой механизм базы данных) и загрузить соответствующий класс. Им не нужно переписывать какой-либо код на уровне базы данных, но в реальном мире существует несколько различий в реализации API JDBC, и разработчики должны искать драйвер JDBC для перезаписи старого слоя БД. Это теория. Давай практиковаться.

Как я упоминал вначале, нам нужно скачать и загрузить соответствующий класс имен драйверов. Мы можем сделать это, вызвав Reflection API:

 

//Assuming SQLServerDriver is in our classpath
//otherwise ClassNotFoundException will be thrown.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

 Теперь мы просто создаем соединение с базой данных, используя класс Connection.

//Assuming dll file is in system PATH 
String connectionUrl = "jdbc:sqlserver://localhost:" +
"databaseName=AdventureWorks;integratedSecurity=true;";
Connection con = DriverManager.getConnection(connectionUrl);

 

 

String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;";
Connection con = null;//SqlConnection
Statement stmt = null;//SqlCommand
ResultSet rs = null;// IDataReader

try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(connectionUrl);
// Create and execute an SQL statement that returns some data.
String SQL = "SELECT TOP 10 * FROM Person.Contact";
stmt = con.createStatement();
rs = stmt.executeQuery(SQL);
// Iterate through the data in the result set and display it.
while (rs.next()) {
//Retrive 4 and 6 column value:
System.out.println(rs.getString(4) + " " + rs.getString(6));
}
}
catch (Exception ex){ex.printStackTrace();}
finally {
if (rs != null) try { rs.close(); } catch(Exception ex) {ex.printStackTrace();}
if (stmt != null) try { stmt.close(); } catch(Exception ex) {ex.printStackTrace();}
if (con != null) try { con.close(); } catch(Exception ex) {ex.printStackTrace();}
}

Приведенный выше код будет работать с любым драйвером jdbc, поскольку он содержит только базовые интерфейсы из API JDBC. Мы использовали AdventureWorks DB с режимом интегрированной безопасности.

 

В приведенном выше коде мы видим, что в коде Java объявлен оператор SQL. Не очень удобно помещать код SQL в классы Java, потому что ядру СУБД необходимо скомпилировать и проверить правильность SQL-запроса. В addlition движок SQL не может создать план выполнения SQL, который может ускорить работу нашей базы данных. Несмотря на все аспекты производительности, ваш Java-код будет очень сложно поддерживать и трудно читать. Insted Я предпочитаю вызывать хранимые процедуры из кода Java.

 

 4.3) Работа с хранимыми процедурами в коде Java

 Теперь мы создадим тестовую таблицу с наиболее распространенными типами данных и столбец с нулем:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TestTable](
[TestId] [int] IDENTITY(1,1) NOT NULL,
[TestNvarchar] [nvarchar](256) NOT NULL,
[TestBit] [bit] NOT NULL,
[TestDecimal] [decimal](16, 6) NOT NULL,
[TestDateTime] [datetime] NOT NULL,
[TestNullValue] [nvarchar](50) NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[TestId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

 

 И создайте простые хранимые процедуры:

--INSERT
USE [AdventureWorks]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestTable_Insert]
@TestNvarchar nvarchar(256),@TestBit bit,
@TestDecimal decimal(16, 6),@TestDateTime datetime,
@TestNullValue nvarchar(50),@TestId int out
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO AdventureWorks.dbo.TestTable VALUES(@TestNvarchar,@TestBit,@TestDecimal,
@TestDateTime,@TestNullValue)
SET @TestId = SCOPE_IDENTITY()
END
GO
--UPDATE
CREATE PROCEDURE [dbo].[TestTable_Update]
@TestId int,@TestNvarchar nvarchar(256),
@TestBit bit,@TestDecimal decimal(16, 6),
@TestDateTime datetime,@TestNullValue nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
UPDATE AdventureWorks.dbo.TestTable SET TestNvarchar = @TestNvarchar,
TestBit = @TestBit,TestDecimal = @TestDecimal,TestDateTime = @TestDateTime,
TestNullValue = @TestNullValue WHERE TestId = @TestId
END
GO
--DELETE
CREATE PROCEDURE [dbo].[TestTable_Delete]
@TestId int
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM AdventureWorks.dbo.TestTable WHERE TestId = @TestId
END
GO
--GET
CREATE PROCEDURE [dbo].[TestTable_GetById]
@TestId int
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM AdventureWorks.dbo.TestTable WHERE TestId = @TestId
END
GO

 Давайте сделаем Java-кодирование для всех хранимых процедур выше:

String connectionUrl = "jdbc:sqlserver://localhost;databaseName=AdventureWorks;userName=test;password=test";
try {
// Establish the connection.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection(connectionUrl);
//each "?" is something like parameter place holder
CallableStatement cs = con.prepareCall("{call TestTable_Insert (?,?,?,?,?,?)}");
//SQLServerCallableStatement SQLCallStmt = (SQLServerCallableStatement) cs;
cs.setNString("TestNvarchar", "NVARCHAR Parameter example, źółżą");
cs.setBoolean("TestBit", true);
cs.setBigDecimal("TestDecimal", BigDecimal.valueOf(22.123456));
cs.setTimestamp("TestDateTime",Timestamp.valueOf("2010-07-01 13:00:01"));
cs.setNString("TestNullValue", "not null");
//For having null in table:
//cs.setNString("TestNullValue", null); or:
//cs.setNull("TestNullValue", java.sql.Types.NULL);
//Getting SCOPE_IDENTITY() from Stored Procedure
cs.registerOutParameter("TestId", java.sql.Types.INTEGER);
cs.execute();
System.out.println("Last inserted Test Id: "+cs.getInt("TestId"));
}
catch (Exception ex){System.out.println(ex.toString());
ex.printStackTrace();}

 В приведенном выше коде мы использовали интерфейс CallableStatement (из JDBC API), что означает, что этот код не зависит от используемого нами драйвера. Java автоматически обнаруживает и загружает драйвер, вызывая Class.forName («driverClass»), а затем переключает CallableStatement с помощью собственной имплементации SQLServerCallableStatement из Microsoft JDBC Driver. Так что, если вы разрабатываете, постарайтесь использовать как можно больше JDBC Iterfaces. Если вы используете SQLServerCallableStatement напрямую, как показано в закомментированной строке: SQLServerCallableStatement SQLCallStmt, вы не сможете быстро заменить драйвер без дополнительного кодирования.

 Так что остальные 3 хранимые процедуры похожи и выглядят так:

 

//Update
CallableStatement cs = con.prepareCall("{call TestTable_Update (?,?,?,?,?,?)}");
cs.setInt("TestId", 1);
cs.setNString("TestNvarchar", "NVARCHAR Update");
cs.setBoolean("TestBit", false);
cs.setBigDecimal("TestDecimal",BigDecimal.valueOf(12.123456));
cs.setTimestamp("TestDateTime",Timestamp.valueOf("2010-07-01 13:00:01"));
cs.setNString("TestNullValue", "After update");
cs.execute();
//Delete
CallableStatement cs = con.prepareCall("{call TestTable_Delete (?)}");
cs.setInt("TestId", 1);
cs.execute();
//Get by Id
CallableStatement cs = con.prepareCall("{call TestTable_GetById (?)}");
cs.setInt("TestId", 2);
ResultSet result = cs.executeQuery();
while (result.next()){
System.out.println("--------- \n"+"TestId: "+ result.getInt("TestId")+"\n"+"TestNvarchar: "+
result.getNString("TestNvarchar")+"\n"+"TestBit: "+ result.getBoolean("TestBit")
+"TestDecimal: "+result.getBigDecimal("TestDecimal")+"\n"
+"TestDateTime: "+result.getTimestamp("TestDateTime")+"\n"
+"TestNullValue: " + result.getNString("TestNullValue"));
}

 

5) Важные ресурсы

В этой статье показано только наиболее распространенное использование Microsoft SQL 2005 с языком Java. Если вы хотите получить более полную информацию, вам следует проверить эти ссылки:

http://www.jdbc-tutorial.com/

http://www.java2s.com/Code/JavaAPI/java.sql/Catalogjava.sql.htm

http://msdn.microsoft.com/en-us/library/ms378749.aspx

Многие примеры (включая XML DataType) находятся в справочной директории внутри \ Microsoft SQL Server JDBC Driver 3.0 \ sqljdbc_3.0 \ enu \ help \ samples \