Буквально пару недель назад мой начальник обратился ко мне с просьбой — создать простое приложение на C# для регистрации задач и проектов сотрудников нашего отдела. Ничего сложного, стандартная форма с текстовыми полями и кнопками, по заполнению которых в некоторый файл на сервере добавляется строка с введёнными данными.
Дополнительное приложение позволяет контролирующему органу извлекать из файла эту информацию, фильтровать и использовать в дальнейшем планировании. Казалось бы, что может быть проще. В этой истории лишь одна загвоздка. Я никогда не работал на C#.
Нет, безусловно, как и у любого «высокообразованного технаря», в университете у меня были курсы по программированию, где обучали в том числе и вышеобозначенному языку. Кстати, данный факт в резюме и привёл моего начальника со своей просьбой. Что ж, делать нечего, отбросив страх и лень, пришлось взяться за дело. Если вы никогда не кодили на C#, приглашаем вас пройти наш бесплатный интенсив по C# для новичков.
База данных на с++. Как сделать курсовую, практическую работу на с++.
Берёмся за дело
Прежде всего, необходим бесплатный дистрибутив. Приложение нам необходимо для личного пользования, поэтому можно смело идти на официальный сайт Visual Studio Community и запускать процесс скачивания. Почему именно VS, а не более простое решение? Если вкратце, то это большие возможности по развитию, графическому и программному.
Пока идёт долгий процесс скачивания и установки, освежаем знания. Основы C# или VS здесь описываться не будут. Просто допустим, что любой человек хоть немного изучавший программирование, прекрасно знает циклы, функции и операторы. Со структурой среды программирования можно разобраться просто скачав один из примеров на сайте разработчика и внимательно его изучив.
Мой же краткий план таков – на первом этапе пишем приложение, которое создаёт базу данных сотрудников и записывает её в формат XML. На втором этапе позаботимся о начальниках, подумав об извлечении информации с использованием различных фильтров. Чтобы немного усложнить конечную задачу, я решил поэкспериментировать с различными подходами – работа с БД напрямую и через коллекции.
В остальном, задача предельно ясна, поэтому можно приступать. Создадим пустой XML файл с требуемой структурой с использованием обыкновенного блокнота:
0 // порядковый номер задачи // отдел // должность // имя // проект // задача // дата
Заходим непосредственно в Visual Studio и приступаем к самому простому и приятному – созданию нашей формы:
Далее прямо в инициализации формы создадим объекты директории, файла и данных:
private string myDirectory = string.Empty; // инициализируем директорию private XmlDocument MyDoc = null; // нашу БД DataTable Emptable = null; // таблицу с данными DataSet Employees = null; // данные
Далее привяжем наш XML файл к проекту и загрузим из него данные:
Как работать с базой данных из Python
Осталось мелочь – по нажатию кнопки ОК организовать проверку заполнения полей и сохранение данных в созданный файл:
private void button1_Click(object sender, EventArgs e) // поочерёдно проверяем заполненность полей < if (textBox1.Text == «») return; if (textBox2.Text == «») return; if (textBox3.Text == «») return; if (textBox4.Text == «») return; if (textBox5.Text == «») return;
Найдём максимальный ID в нашей таблице, чтобы создать следующий элемент:
DataRow[] datarows = null; // создаём отдельную строку string s = string.Empty; // пустую строку try // находим старший индекс по последней заполненной строке < datarows = Emptable.Select(«id=max(id)»); s = datarows[0][«id»].ToString(); >catch (Exception) < >if (s == «» || s == string.Empty) // если строки пустые, индекс — 0
Создаем новую строку для нашей таблицы:
DataRow datarow = Employees.Tables[0].NewRow();
И добавляем в неё полученные данные:
datarow[0] = Convert.ToString(i); // комментарии излишни datarow[1] = textBox1.Text.Trim(); datarow[2] = textBox2.Text.Trim(); datarow[3] = textBox3.Text.Trim(); datarow[4] = textBox4.Text.Trim(); datarow[5] = textBox5.Text.Trim();
Для организации таблицы, извлечём системное время:
DateTime date1 = DateTime.Now; // текущее время datarow[6] = date1.ToString(«G»); // конвертируем в строку Employees.Tables[0].Rows.Add(datarow); // добавляем в таблицу
textBox1.Text=»»; textBox2.Text=»»; textBox3.Text=»»; textBox4.Text=»»; textBox5.Text=»»;
Вот, кажется, и всё. Сохраняем данные и перезагружаем файл:
Переходим ко второму этапу. Создаём форму с фильтрами, где поочерёдно структура таблицы будет представлена в формате ListBox-ов. Форма выглядит следующим образом:
Переходим к созданию нашего списка внутри программы. Создаём класс и инициализируем его:
public class Employee < public string EmployeeID < get; set; >public string DepartmentName < get; set; >public string ePosition < get; set; >public string EmployeeName < get; set; >public string ProjectName < get; set; >public string PostalCode < get; set; >public string TaskName < get; set; >>
Загружаем данные внутрь программных данных:
public List GetTaskList() // Проверка на пустые данные и загрузка < if (EmployeeList == null) createList(); return EmployeeList; >private void createList() // инициализация формата таблицы данных < EmployeeList = ( from e in XDocument.Load(«employees.xml»). // загружаем таблицу Root.Elements(«employee») select new Employee // записываем столбцы в память < EmployeeID = (string)e.Element(«id»), DepartmentName = (string)e.Element(«department»), ePosition = (string)e.Element(«position»), EmployeeName = (string)e.Element(«name»), ProjectName = (string)e.Element(«project»), TaskName = (string)e.Element(«task»), >) .ToList(); >
Теперь переходим непосредственно к фильтрам. Первый столбец (номинально второй) загружаем полностью.
List ourtasks = GetTaskList(); n = outasks.Count; foreach (var adddep in ourtasks) < ListBox1.Items.Add(adddep.DepartmentName); // загружаем, пока не закончатся строки >
После чего переходим к фильтрации при обработке изменения выбранного в ListBox:
var Tsks = // запускаем шаблон обработки данных linq. Внимание: работает только с версии 2008 года from myjob in OurTasks where myjob.DepartmentName == ListBox1.SelectedItem.ToString(); select myjob; foreach (var addPos in Tsks)
Послесловие
И далее по аналогии до бесконечности, пока последний запрос не выведет необходимые руководителю поля.
После некоторых доработок и отладок результат был достигнут, а торжественное «Спасибо» — произнесено. Злой рок судьбы теперь каждое утро сталкивает меня и моих коллег с первой частью результатов моего труда и постепенно наводит на размышление, которое я адресую дорогому читателю — а можно ли было сделать лучше и, что самое главное, проще?
Кстати, освоить разработку под Windows можно, обучаясь на профессии «Программист Windows».
Источник: gb.ru
Создание простого приложения для работы с данными с помощью ADO.NET
Область применения:Visual Studio
Visual Studio для Mac
Visual Studio Code
Наборы данных и связанные классы — это устаревшие технологии .NET с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти, пока приложения отключены от базы данных. Они особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения в базе данных. Хотя наборы данных оказались очень успешной технологией, мы рекомендуем использовать Entity Framework Core в новых приложениях .NET. Платформа Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей и имеет более простой программный интерфейс.
При создании приложения, которое работает с данными в базе данных, необходимо выполнить такие основные задачи, как определение строк подключения, вставка данных и выполнение хранимых процедур. В этом разделе вы узнаете, как взаимодействовать с базой данных из простого приложения Windows Forms «формы через данные» с помощью Visual C# или Visual Basic и ADO.NET. Все технологии данных .NET, включая наборы данных, LINQ to SQL и Entity Framework, в конечном итоге выполняют действия, которые очень похожи на описанные в этой статье.
В этой статье демонстрируется простой способ быстрого получения данных из базы данных. Если приложению необходимо изменять данные нетривиальными способами и обновлять базу данных, следует рассмотреть возможность использования Entity Framework и привязки данных для автоматической синхронизации элементов управления пользовательского интерфейса с изменениями в базовых данных.
С целью упрощения код не включает обработку исключений для выполнения в рабочей среде.
Полный код для этого руководства можно получить в репозитории GitHub документации По Visual Studio на C# и Visual Basic.
Предварительные требования
Для создания приложения вам потребуются следующие компоненты.
- приведенному.
- SQL Server Express LocalDB. Если у вас нет SQL Server Express LocalDB, его можно установить на странице скачивания SQL Server.
В этом разделе предполагается, что вы знакомы с основными функциями интегрированной среды разработки Visual Studio и можете создать приложение Windows Forms, добавить формы в проект, разместить кнопки и другие элементы управления в формах, задать свойства элементов управления и кодировать простые события. Если вы не знакомы с этими задачами, рекомендуется выполнить инструкции из руководства Создание приложения Windows Forms в Visual Studio с помощью Visual Basic или Создание приложения Windows Forms в Visual Studio с помощью C#, прежде чем приступить к работе с этим руководством.
Настройка образца базы данных
Создайте образец базы данных, выполнив следующие действия.
- В Visual Studio откройте окно Обозреватель сервера.
- Щелкните правой кнопкой мыши подключения к данным и выберите Создать базу данных SQL Server.
- В текстовом поле Имя сервера введите (localdb)mssqllocaldb.
- В текстовом поле Имя новой базы данных введите Продажи, а затем нажмите кнопку ОК. Пустая база данных Sales создается и добавляется в узел Подключения к данным в Обозреватель сервера.
- Щелкните правой кнопкой мыши подключение Данные о продажах и выберите Создать запрос. Откроется окно редактора запросов.
- Скопируйте скрипт Transact-SQL Sales в буфер обмена.
- Вставьте скрипт T-SQL в редактор запросов и нажмите кнопку Выполнить . Через некоторое время запрос завершает выполнение и создаются объекты базы данных. База данных содержит две таблицы: Customer и Orders. Эти таблицы изначально не содержат данных, но вы можете добавить данные при запуске создаваемого приложения. База данных также содержит четыре простые хранимые процедуры.
Создание форм и добавление элементов управления
- Создайте проект для приложения Windows Forms и назовите его SimpleDataApp. Visual Studio создает проект и несколько файлов, включая пустую форму Windows Forms с именем Form1.
- Добавьте две формы Windows Forms в проект, чтобы он включал три формы, и назначьте им следующие имена:
- Навигация
- NewCustomer
- FillOrCancel
- Для каждой формы добавьте текстовые поля, кнопки и другие элементы управления, которые отображаются на рисунках ниже. Для каждого элемента управления задайте свойства, указанные в таблицах.
Примечание Элементы управления «группа» и «надпись» обеспечивают большую ясность, но не используются в коде.
Форма навигации
Кнопка | Name = btnGoToAdd |
Кнопка | Name = btnGoToFillOrCancel |
Кнопка | Name = btnExit |
Форма NewCustomer
Форма FillOrCancel
Сохранение строки подключения
Когда приложение пытается открыть подключение к базе данных, оно должно иметь доступ к строке подключения. Чтобы избежать ввода строки вручную в каждой форме, сохраните ее в файлеApp.config в проекте и создайте метод, который возвращает строку при вызове метода из любой формы в приложении.
Чтобы найти строку подключения, щелкните правой кнопкой мыши подключение данные продаж в Обозреватель сервера и выберите Свойства. Найдите свойство ConnectionString , а затем нажмите клавиши CTRL+A, CTRL+C , чтобы выбрать и скопировать строку в буфер обмена.
- Если вы используете C#, в Обозреватель решений разверните узел Свойства в проекте, а затем откройте файл Settings.settings. Если вы используете Visual Basic, в Обозреватель решений щелкните Показать все файлы, разверните узел Мой проект и откройте файл Settings.settings.
- В столбце Имя введите connString .
- В списке Тип выберите (Строка подключения).
- В списке Область выберите Приложение.
- В столбце Значение введите строку подключения (без внешних кавычек), а затем сохраните изменения.
В реальном приложении строка подключения должна храниться безопасно, как описано в разделе Строки подключения и файлы конфигурации.
Написание кода для форм
В этом разделе содержатся краткие сведения о том, что делает каждая форма. Он также предоставляет код, определяющий базовую логику при нажатии кнопки в форме.
Форма навигации
Форма навигации открывается при запуске приложения. Кнопка Добавить учетную запись открывает форму NewCustomer. Кнопка Выполнение или отмена заказов открывает форму FillOrCancel. Кнопка Выход закрывает приложение.
Преобразование формы навигации в начальную форму
При использовании C# в обозревателе решений откройте файл Program.cs и измените строку Application.Run на следующую: Application.Run(new Navigation());
Если вы используете Visual Basic, в Обозреватель решений откройте окно Свойства, перейдите на вкладку Приложение, а затем выберите SimpleDataApp.Navigation в списке форм запуска.
Создание автоматически созданных обработчиков событий
Дважды щелкните три кнопки в форме навигации, чтобы создать пустые методы обработчика событий. При двойном щелчке кнопки также добавляется автоматически созданный код в файл кода конструктора, который позволяет нажатию кнопки вызывать событие.
Если пропустить действие двойного щелчка в конструкторе и просто скопировать код и вставить его в файлы кода, не забудьте задать для обработчика событий правильный метод. Это можно сделать в окне Свойства . Перейдите на вкладку События (используйте кнопку панели инструментов молнии) и найдите обработчик click .
Добавление кода для логики формы навигации
На кодовой странице формы навигации заполните тексты методов для обработчиков событий нажатия трех кнопок, как показано в следующем коде.
/// /// Opens the NewCustomer form as a dialog box, /// which returns focus to the calling form when it is closed. /// private void btnGoToAdd_Click(object sender, EventArgs e) < Form frm = new NewCustomer(); frm.Show(); >/// /// Opens the FillorCancel form as a dialog box. /// private void btnGoToFillOrCancel_Click(object sender, EventArgs e) < Form frm = new FillOrCancel(); frm.ShowDialog(); >/// /// Closes the application (not just the Navigation form). /// private void btnExit_Click(object sender, EventArgs e)
»’ »’ Opens the NewCustomer form as a dialog box, which returns focus to the calling form when it closes. »’ Private Sub btnGoToAdd_Click(sender As Object, e As EventArgs) Handles btnGoToAdd.Click Dim frm As Form = New NewCustomer() frm.Show() End Sub »’ »’ Opens the FillOrCancel form as a dialog box. »’ Private Sub btnGoToFillOrCancel_Click(sender As Object, e As EventArgs) Handles btnGoToFillOrCancel.Click Dim frm As Form = New FillOrCancel() frm.ShowDialog() End Sub »’ »’ Closes the application (not just the navigation form). »’ Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Me.Close() End Sub
Код для этого руководства доступен в C# и Visual Basic. Чтобы переключить язык кода на этой странице между C# и Visual Basic, используйте переключатель языка кода в верхней части страницы справа.
Форма NewCustomer
При вводе имени клиента и нажатии кнопки Создать учетную запись форма NewCustomer создает учетную запись клиента и SQL Server возвращает значение IDENTITY в качестве нового идентификатора клиента. Затем можно разместить заказ для новой учетной записи, указав сумму и дату заказа и нажав кнопку Разместить заказ .
Создание автоматически созданных обработчиков событий
Создайте пустой обработчик событий Click для каждой кнопки в форме NewCustomer, дважды щелкнув каждую из четырех кнопок. При двойном щелчке кнопки также добавляется автоматически созданный код в файл кода конструктора, который позволяет нажатию кнопки вызывать событие.
Добавление кода для логики формы NewCustomer
Чтобы выполнить логику формы NewCustomer, выполните следующие действия.
System.Data.SqlClient Доведите пространство имен в область, чтобы вам не нужно было полностью определять имена его членов.
using System.Data.SqlClient;
Imports System.Data.SqlClient
Добавьте в класс некоторые переменные и вспомогательные методы, как показано в следующем коде.
// Storage for IDENTITY values returned from database. private int parsedCustomerID; private int orderID; /// /// Verifies that the customer name text box is not empty. /// private bool IsCustomerNameValid() < if (txtCustomerName.Text == «») < MessageBox.Show(«Please enter a name.»); return false; >else < return true; >> /// /// Verifies that a customer ID and order amount have been provided. /// private bool IsOrderDataValid() < // Verify that CustomerID is present. if (txtCustomerID.Text == «») < MessageBox.Show(«Please create customer account before placing order.»); return false; >// Verify that Amount isn’t 0. else if ((numOrderAmount.Value < 1)) < MessageBox.Show(«Please specify an order amount.»); return false; >else < // Order can be submitted. return true; >> /// /// Clears the form data. /// private void ClearForm()
‘ Storage for ID values returned from the database.
Private parsedCustomerID As Integer Private orderID As Integer »’ »’ Verifies that the customer name text box is not empty. »’ Private ReadOnly Property IsCustomerNameValid As Boolean Get If txtCustomerName.Text = «» Then MessageBox.Show(«Please enter a name.») Return False Else Return True End If End Get End Property »’ »’ Verifies the order data is valid. »’ Private Function IsOrderDataValid() As Boolean ‘ Verify that CustomerID is present. If txtCustomerID.Text = «» Then MessageBox.Show(«Please create a customer account before placing order.») Return False ‘ Verify that order amount isn’t 0. ElseIf (numOrderAmount.Value < 1) Then MessageBox.Show(«Please specify an order amount.») Return False Else ‘ Order can be submitted. Return True End If End Function »’ »’ Clears values from controls. »’ Private Sub ClearForm() txtCustomerName.Clear() txtCustomerID.Clear() dtpOrderDate.Value = DateTime.Now numOrderAmount.Value = 0 Me.parsedCustomerID = 0 End Sub
Завершите тело метода для обработчиков событий нажатия четырех кнопок, как показано в следующем коде.
Форма FillOrCancel
Форма FillOrCancel выполняет запрос для возврата заказа при вводе идентификатора заказа, а затем нажмите кнопку Найти заказ . Возвращенная строка отображается в сетке данных только для чтения. Вы можете пометить заказ как отмененный (X), если нажать кнопку Отменить заказ , или вы можете пометить заказ как заполненный (F) при нажатии кнопки Заполнить заказ . Если снова нажать кнопку Найти заказ , появится обновленная строка.
Создание автоматически созданных обработчиков событий
Создайте пустые обработчики событий Click для четырех кнопок в форме FillOrCancel, дважды щелкнув кнопки. При двойном щелчке кнопки также добавляется автоматически созданный код в файл кода конструктора, который позволяет нажатию кнопки вызывать событие.
Добавление кода для логики формы FillOrCancel
Чтобы выполнить логику формы FillOrCancel, выполните следующие действия.
Принесите следующие два пространства имен в область, чтобы вам не нужно было полностью определять имена их членов.
using System.Data.SqlClient; using System.Text.RegularExpressions;
Imports System.Data.SqlClient Imports System.Text.RegularExpressions
Добавьте переменную и вспомогательный метод в класс , как показано в следующем коде.
‘ Storage for OrderID. Private parsedOrderID As Integer »’ »’ Verifies that OrderID is valid. »’ Private Function IsOrderIDValid() As Boolean ‘ Check for input in the Order ID text box. If txtOrderID.Text = «» Then MessageBox.Show(«Please specify the Order ID.») Return False ‘ Check for characters other than integers. ElseIf Regex.IsMatch(txtOrderID.Text, «^D*$») Then ‘ Show message and clear input. MessageBox.Show(«Please specify integers only.») txtOrderID.Clear() Return False Else ‘ Convert the text in the text box to an integer to send to the database. parsedOrderID = Int32.Parse(txtOrderID.Text) Return True End If End Function
Завершите тело метода для обработчиков событий нажатия четырех кнопок, как показано в следующем коде.
Тестирование приложения
Запустите приложение и попробуйте создать несколько клиентов и заказов, чтобы убедиться, что все работает должным образом. Чтобы убедиться, что база данных обновлена с учетом изменений, откройте узел Таблицы в Обозреватель сервера, щелкните правой кнопкой мыши узлы Клиенты и Заказы и выберите пункт Показать данные таблицы.
См. также
Источник: learn.microsoft.com
Часть 3. Создаем скелет нашей базы, первые SQL команды на примерах java.sql.
Вернёмся к Java-приложению. Вариант из предыдущей части был создан в HelloWorld-стиле, чтобы проконтролировать корректность начальных действий. Мы реализуем трёхзвенную (трёхслойную) архитектуру, которую в англоязычной литературе часто называют 3tier/3layer. Её краткая суть следующая:
- Все сущности оформлены в виде моделей (Model). Это — объекты, которые содержат:
- Набор атрибутов (приватные поля класса).
- Конструктор(ы).
- Сеттеры и геттеры для установки/чтения атрибутов.
- Важно, что иного кода, помимо вышеперечисленного в них нет. Часто подобные объекты называют POJO (Plain Old Java Object).
Зачем нам вообще нужно составлять такой конгломерат? Дело в том, что каждый слой максимально изолирован от других. Если вместо БД у нас будет набор текстовых файлов, то нам достаточно поменять только реализацию Repository, не трогая остальной код. Аналогично мы можем подключить/добавить другой Service с минимальными изменениями. Для больших систем мы можем отдать реализацию разных слоёв разным людям или экспериментировать, комбинируя оптимальные реализации разных слоёв. Создадим пакеты model, repository, service для нашего приложения, где будут находиться соответствующие классы. К слою Service мы вернёмся в следующих частях, а пока уделим внимание моделям и репозиториям.
Model
Все наши сущности (акции, трейдеры, курсы и действия трейдеров) и их табличные эквиваленты имеют общую черту – искусственный первичный ключ. Поэтому оформим базовый класс BaseModel . Все модели будут наследоваться от него.
Ниже представлена модель акции для примера. Остальные листинги моделей вы можете посмотреть по ссылке на github-репозиторий в конце статьи.
package sql.demo.model; import java.math.BigDecimal; // Модель акции public class Share extends BaseModel < // поля SQL таблицы и соответствующие им поля модели // типы данных SQL private String name; // Наименование private BigDecimal startPrice; // Начальная цена private int changeProbability; // Вероятность смены курса (в процентах) private int delta; // Максимальное колебание (в процентах)стоимости акции в результате торгов public Share() < >public Share(long id, String name, BigDecimal startPrice, int changeProbability, int delta) < super(id); this.name = name; this.startPrice = startPrice; this.changeProbability = changeProbability; this.delta = delta; >public String getName() < return name; >public void setName(String name) < this.name = name; >. оставшиеся сеттеры/геттеры >
JDBC
В первой части мы научились устанавливать соединение с БД и закрывать его. Теперь пойдем дальше. Этапы работы с JDBC отображены на следующей схеме:
- Class.forName() загружает класс и регистрирует его в DriverManager;
- DriverManager.getConnection() вернёт Connection – соединение с указанной в аргументе метода базой данных и использованием соответствующего JDBC драйвера (который был загружен с использованием Class.forName() ).
- createStatement() возвратит нам Statement – объект, на основе которого можно формировать запросы к БД. Существуют также:
-
CallableStatement для вызова собственных СУБД SQL-функций и процедур (их называют хранимыми).
- PreparedStatement облегчающий создание параметризованных и пакетных запросов.
Следует иметь в виду, что после работы с СУБД для экономии ресурсов желательно закрыть за собой (в правильном порядке!) объекты ResultSet , Statement и Connection для экономии ресурсов. Помните, закрывая вышестоящий в последовательности на схеме объект, вы каскадно закроете все порождённые в процессе работы с ним объекты. Таким образом, закрытие соединения (Connection) приведёт к закрытию всех его Statement и всех ResultSet , полученных при их помощи.
Реализация Repository
После теоретической JDBC-части, перейдём к реализации репозитория. Архитектурно реализуем его следующим образом:
- Наиболее общие части по работе с СУБД вынесем в общего предка – BaseTable ;
- Логические операции, которые мы будем выполнять, объявим в интерфейсе TableOperation ;
Новый репозиторий будет наследоваться от класса BaseTable и реализовывать интерфейс TableOperation . Таким образом, нам необходимо прописать реализацию методов, объявленных в интерфейсе TableOperation . При этом мы можем использовать методы родительского класса BaseTable . В данный момент в интерфейсе объявлены методы по созданию таблиц:
package sql.demo.repository; import java.sql.SQLException; // Операции с таблицами public interface TableOperations < void createTable() throws SQLException; // создание таблицы void createForeignKeys() throws SQLException; // создание связей между таблицами void createExtraConstraints() throws SQLException; // создание дополнительных правил для значений полей таблиц >
- Добавим очередную возможность работы с таблицей в виде нового метода интерфейса.
- Далее, в имплементирующих интерфейс классах, опишем программную реализацию в новых методах, порожденных интерфейсом.
Листинги других репозиториев и родительского класса доступны по ссылке на github-репозиторий в конце статьи. Разумеется, можно сделать другой дизайн программы или более тщательный рефакторинг программы: вынести общие части в родительский класс, выделить общие методы и так далее. Но основная цель цикла статей – непосредственная работа с базой данных, так что при желании дизайн программы и тому подобное, вы можете выполнить самостоятельно. Текущая структура проекта: Кроме репозиториев и моделей мы дополнительно создали класс StockExchangeDB для общего управления нашей эмуляцией. На данном этапе мы управляем репозиториями (в следующих частях перейдем на сервисы). Объявляем их, запускаем создание таблиц:
package sql.demo; import org.h2.tools.DeleteDbFiles; import sql.demo.repository.*; import java.sql.*; public class StockExchangeDB < // Блок объявления констант public static final String DB_DIR = «c:/JavaPrj/SQLDemo/db»; public static final String DB_FILE = «stockExchange»; public static final String DB_URL = «jdbc:h2:/» + DB_DIR + «/» + DB_FILE; public static final String DB_Driver = «org.h2.Driver»; // Таблицы СУБД Traiders traiders; ShareRates shareRates; Shares shares; TraiderShareActions traiderShareActions; // Получить новое соединение с БД public static Connection getConnection() throws SQLException < return DriverManager.getConnection(DB_URL); >// Инициализация public StockExchangeDB(boolean renew) throws SQLException, ClassNotFoundException < if (renew) DeleteDbFiles.execute(DB_DIR, DB_FILE, false); Class.forName(DB_Driver); // Инициализируем таблицы traiders = new Traiders(); shares = new Shares(); shareRates = new ShareRates(); traiderShareActions = new TraiderShareActions(); >// Инициализация по умолчанию, без удаления файла БД public StockExchangeDB() throws SQLException, ClassNotFoundException < this(false); >// Создание всех таблиц и внешних ключей public void createTablesAndForeignKeys() throws SQLException < shares.createTable(); shareRates.createTable(); traiders.createTable(); traiderShareActions.createTable(); // Создание ограничений на поля таблиц traiderShareActions.createExtraConstraints(); shares.createExtraConstraints(); // Создание внешних ключей (связи между таблицами) shareRates.createForeignKeys(); traiderShareActions.createForeignKeys(); >public static void main(String[] args) < try< StockExchangeDB stockExchangeDB = new StockExchangeDB(true); stockExchangeDB.createTablesAndForeignKeys(); >catch (SQLException e) < e.printStackTrace(); System.out.println(«Ошибка SQL !»); >catch (ClassNotFoundException e) < System.out.println(«JDBC драйвер для СУБД не найден!»); >> >
Результат выполнения:
Резюме
- Типы данных SQL.
- Таблицы БД.
- Проектирование БД: структур таблиц и отношений между ними.
- Язык запросов SQL в части создания таблиц БД, установки ограничений на поля и связей между таблицами.
- Больше о взаимодействии с JDBC.
- Трехзвенная (трехслойная) Model/Repository/Service архитектура приложения работы с данными.
Полезные ссылки
- H2 Database Engine (English);
- Описание SQL команд (English);
- Типы данных в H2(English);
- Список зарезервированных слов SQL;
- Книга «Понимание SQL (Understanding SQL)» Мартина Грабера;
- Основы работы с BigDecimal;
- GitHub репозиторий
Источник: javarush.com