Увы, я недавно ничего не писал в последнее время. Из -за рабочих причинах я вступил в контакт с базовой структурой ORM, разработанной компанией. Я случайно обнаружил, что при вызове операций JDBC структура относится к SimpleJdbctemplate в Hibernate. Здесь я подумал о простой инкапсуляции JDBC, которую я использовал, когда учился в колледже. Теперь я опубликую код и поделюсь им с вами:
Класс конфигурации: прочитайте файл конфигурации подключения к базе данных в том же пакете, чтобы лучше для соображений обобщения.
пакет com.tly.dbutil; import java.io.ioexception; import java.util.properties; public class config {private static properties prop = new Properties (); static {try {// загрузить dbconfig.properties configuration file prop.load (config.class.getresourceasstream ("dbconfig.properties")); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }} // Установить постоянную публичную статическую конечную строку class_name = prop.getproperty ("class_name"); Public Static Final String Database_url = prop.getProperty ("database_url"); public Static Final String Server_ip = prop.getProperty ("server_ip"); public Static Final String Server_port = prop.getProperty ("server_port"); public Static Final String Database_sid = prop.getProperty ("Database_sid"); public Static Final String username = prop.getProperty («Имя пользователя»); Public Static Final String Password = prop.getProperty ("пароль"); }dbconfig.properties: файл конфигурации базы данных, вы также можете использовать формат XML и т. Д., Обратите внимание на местоположение вызова файла в классе конфигурации
Class_name = com.mysql.jdbc.driverdatabase_url = jdbc: mysqlserver_ip = localhostserver_port = 3306database_sid = emplocationusername = rootpassword = 1
Следующим является вспомогательный класс базы данных DBConn
пакет com.mployees.dbutil; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedStatement; импорт java.sql.Resultset; импорт java.sql.sqlexcection; public class dbconn {//three Propertes and neperties interne in inceperse; Private PresectStatement PSTMT = NULL; Частный результат RS = NULL; // Четыре метода // Метод1: Создать соединение с базой данных public Connection getConntion () {try {// 1: загрузить драйвер соединения, принцип отражения Java class.forname (config.class_name); // 2: Создайте объект интерфейса соединения для получения объекта соединения базы данных MySQL. Три параметра: строка Соединения URL -адреса Строка пароля string url = config.database_url+": //"+config.server_ip+":"+config.server_port+"/"+config.database_sid; conn = drivermanager.getConnection (url, config.username, config.password); } catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; } // method2: метод для закрытия базы данных public void closeconn () {if (rs! = null) {try {rs.close (); } catch (sqlexception e) {e.printstacktrace (); }} if (pstmt! = null) {try {pstmt.close (); } catch (sqlexception e) {e.printstacktrace (); }} if (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); }}} // method3: метод, специально используемый для отправки добавления, удаления и изменения операторов Public int Execother (PreditStatement pstmt) {try {// 1. Используйте объект оператора, чтобы отправить оператор SQL int intecualRows = pstmt.executeUpdate (); // 2. Вернуть результат, возвращаемый AfficeRows; } catch (sqlexception e) {e.printstacktrace (); возврат -1; }} // method4: специально используется для отправки операторов запроса public resultset execquery (подготовка pstmt) {try {// 1. Используйте объект оператора, чтобы отправить оператор SQL RS = PSTMT.ExecUteQuery (); // 2. Вернуть результат return rs; } catch (sqlexception e) {e.printstacktrace (); вернуть ноль; }}}Обычно использование приведенного выше кода может решить некоторые простые приложения CRUD, но есть много ограничений. Например, каждый раз, когда программа принимает соединение, она увеличивает бремя на системе, нет транзакций, никаких данных и т. Д. Сегодня я видел друга в парке, который пишет статью в саду, используя отражение, чтобы решить CRUD непосредственно в параметрах объекта. Я писал это раньше, но я не закончил. В основном я хочу написать общий dbutil. Наконец, я изучил его и обнаружил, что он приближается к SimpleJdbctemplate в Hibernate, поэтому я пошел посмотреть исходный код Hibernate. Кроме того, в это время было кое -что, и у меня не было времени, поэтому я оставил этот вопрос. Теперь я восполняю эту вещь и рассмотрю это для себя.
Основы класс
Package Com.mployees.dao; импорт java.io.inputstream; import java.lang.reflect.method; импорт java.lang.reflect.parametizedtype; импорт java.sql.connection; импорт Java.sql.date; импорт java.sql.preedStatement; java.util.arraylist; import java.util.iterator; import java.util.list; import com.employees.dbutil.dbconn; открытый класс basedao <t> {dbconn conn = new dbconn (); Подключение к частному соединению = null; @Suppresswarnings («неиспользованный») частный класс <T> PersistentClass; @Suppresswarnings ("unchecked") public foundao () {initconnection (); // Получить параметризованный тип параметризованный тип type = (parameterizedType) getClass (). GetGenericSuperClass (); PersistentClass = (class <t>) type.getActualtyPearguments () [0]; } / *** получить подключение к базе данных* / public void initConnection () {connection = conn.getConntion (); } /** * Сохранить * /public void Said (t Entity) бросает исключение {// sql оператор, вставьте в имя таблицы (string sql = "insert in" + entity.getClass (). GetSiMplename (). Tolowercase () + "(" // Получить объект всех методов с помощью строки get -list> list = this.matchpohods (estity "; Вставка заказа поля (ID, Имя, Имя, Электронная почта, while (iter.hasnext ()) {Метод метод = iTer.next (); sql + = method.mobling (3). sql.substring (0, sql.lastindexof (",")) +") значения ("; // встать предварительно скомпилированный оператор SQL в INSERT в имя таблицы (ID, имя, электронная почта) значения (?,? name (id, name, email) значения (?,?,?); // Получить ссылку на предварительно скомпилированный объект sturning sturning = connection.prepareStatement (SQL); int i = 0; // переместить указатель на последнюю строку итератора на первую строку. iter = list.iterator (); while (iter.hasnext ()) {method method = iter.next (); // Это изначально определяет тип возвращаемого значения, потому что некоторые форматы значений поля необходимо изменить при сохранении в базе данных. Например, string, оператор SQL -«+abc+» '' if (method.getReturnType (). GetSiMplEname (). Indexof ("String")! = -1) {ratection.setString (++ i, this.getString (метод, Entity)); } else if (method.getReturnType (). getSiMplEname (). indexof ("date")! = -1) {atportion.setDate (++ i, this.getDate (method, entity)); } else if (method.getReturnType (). getSiMplEname (). indexof ("inputStream")! = -1) {atportion.setAsciistream (++ i, this.getBlob (метод, объект), 1440); } else {ratement.setInt (++ i, this.getInt (method, entity)); }} // Выполнить conn.execother (ratement); // sloseConn (); } / ** * modify * / public void update (t Entity) Throws Exception {string sql = "update" + entity.getClass (). GetSiMplename (). ToLowerCase () + "set"; // Получите все коллекции объектов METHOOL этого списка классов <Thod> list = this.matchPojomethods (Entity, "Get"); // Временный метод объект, ответственный за итерацию объекта метода моды. Метод Tempmethod = null; // Поскольку идентификатор не требуется, чтобы быть измененным при изменении, добавление параметров в порядке должно переместить идентификатор до конца. Метод idmethod = null; Iterator <method> iter = list.iterator (); while (iter.hasnext ()) {tempmethod = iter.next (); // Если имя метода содержит идентификационную строку, а длина - 2, он считается идентификатором. if (tempmethod.getName (). LastIndexof ("id")! = -1 && tempmethod.getName (). substring (3) .length () == 2) {// Сохранить объект поля ID в переменную и удалите его в коллекции. idmethod = tempmethod; iter.remove (); // Если имя метода удалено, и строка SET/GET несовместима с POJO + "ID" (CASE нечувствительным), это считается идентификатором} else if ((entity.getClass (). GetSiMplename () + "id"). Equalsignorecase (tempmethod.getname (). Substring (3))) {idmethod =; iter.remove (); }} // переместить итеративный указатель на первую позицию iter = list.iterator (); while (iter.hasnext ()) {tempmethod = iter.next (); sql + = tempmethod.getName (). substring (3) .tolowerCase () + "=?,"; } // Удалить последний, символ sql = sql.substring (0, sql.lastindexof (",")); // Добавить условие sql + = "где" + idmethod.getName (). Substring (3) .tolowerCase () + "=?"; // SQL -сплайсинг завершается, печатать SQL -операторы System.out.println (SQL); Заявление подготовки = this.connection.prepareStatement (SQL); int i = 0; iter = list.iterator (); while (iter.hasnext ()) {method method = iter.next (); // Это изначально определяет тип возвращаемого значения, поскольку некоторые форматы значений поля необходимо изменить при сохранении в базе данных, например, String, SQL -оператор: «+ABC+" '' if (method.getReturnType (). GetSiMplename (). Indexof ("String")! = -1) {ratection.setStringString (++ I, this. } else if (method.getReturnType (). getSiMplEname (). indexof ("date")! = -1) {atportion.setString (++ i, this.getString (method, Entity)); } else if (method.getReturnType (). getSiMplEname (). indexof ("date")! = -1) {atportion.setDate (++ i, this.getDate (method, entity)); } else if (method.getReturnType (). getSiMplEname (). indexof ("inputStream")! = -1) {atportion.setAsciistream (++ i, this.getBlob (метод, объект), 1440); } else {ratement.setInt (++ i, this.getInt (method, entity)); }} // Добавить значение в поле ID if (idmethod.getReturnType (). GetSiMplename (). Indexof ("string")! = -1) {ratement.setString (++ i, this.getString (idmethod, entity)); } else {antage.setint (++ i, this.getint (idmethod, entity)); } // Выполнить оператор SQL. // закрыть предварительный оператор объекта.close (); // закрыть connection.close (); } / ** * DELETE * / public void DELETE (T ENTITY) THROHS EXCECTION {String SQL = "DELETE" + ENTITY.GETCLASS (). GetSiMplEname (). TOLOWERCASE () + "Где"; // хранение объекта поля с помощью строки "ID" метод idmethod = null; // Получение объекта поля с помощью строки "ID" List <Method> list = this.matchpojomethods (entity "get"); Iterator <method> iter = list.iterator (); while (iter.hasnext ()) {method tempmethod = iter.next (); // Если имя метода содержит идентификационную строку, а длина - 2, он считается идентификатором. if (tempmethod.getName (). LastIndexof ("id")! = -1 && tempmethod.getName (). substring (3) .length () == 2) {// Сохранить объект поля ID в переменной и удалить его в наборе. idmethod = tempmethod; iter.remove (); // Если имя метода удалено, и строка Set/Get несовместима с pojo + "id" (case нечувствительный), это считается идентификатором} else if ((entity.getClass (). GetSiMplename () + "id"). Equalsignorecase (tempmethod.getname (). Substring (3)))) {idmethod = tempmothod; iter.remove (); }} sql + = idmethod.getName (). substring (3) .tolowerCase () + "=?"; Заявление подготовки = this.connection.prepareStatement (SQL); // Добавить значение в поле ID int i = 0; if (idmethod.getReturnType (). getSiMplename (). indexof ("string")! = -1) {ratement.setString (++ i, this.getString (idMethod, Entity)); } else {antage.setint (++ i, this.getint (idmethod, entity)); } // Выполнить conn.exeCother (оператор); // sloseConn (); } / *** Запрос по id* / public t findbyId (объект объекта) Throws Exception {string sql = "select* from" + persistentClass.getSimplEname (). ToLowerCase () + "где"; // Используйте конструктор подкласса для получения конкретного типа параметризованного типа. Например, FASTAO <T>, то есть получить конкретный тип t Entity = PersistentClass.newinStance (); // хранилище объект метода, который хранит первичный ключ из POJO (или управляемого таблицы) метод iDmethod = null; List <Method> list = this.matchpojomethods (Entity, "set"); Iterator <method> iter = list.iterator (); // Фильтр для получения объекта метода while (iter.hasnext ()) {method empmethod = iter.next (); if (tempmethod.getName (). indexof ("id")! = -1 && tempmethod.getName (). substring (3) .length () == 2) {idmethod = tempmethod; } else if ((entity.getClass (). getSiMplename () + "id"). equalsignorecase (tempmethod.getName (). substring (3))) {idmethod = tempmethod; }} // Первая буква преобразуется в нижний регистр sql += idmethod.getname (). Substring (3,4) .toloarcecase () +idmethod.getName (). Substring (4) +"=?"; // После оператора инкапсуляции распечатайте SQL System.out.println (SQL); // Получить подключение к оператору подготовки = this.connection.prepareStatement (SQL); // судить тип идентификатора if (exante -ancementof integer) {atportion.setint (1, (integer) object); } else if (exantef string string) {atportion.setString (1, (String) Object); } // Выполните SQL, чтобы получить набор результатов запроса. Resultset RS = conn.execquery (оператор); // Зарегистрируйтесь, записывайте циклы на количество полей int i = 0; // укажите указатель на первую строку итератора iter = list.iterator (); // инкапсулировать while (rs.next ()) {while (iter.hasnext ()) {method method = iter.next (); if (method.getParameterTypes () [0] .getSimplEname (). indexof ("string")! = -1) {// Потому что в наборе списков порядок получения объекта метода не согласуется с порядком поля базы данных (например: первый метод, и в соответствии с «Соответствующим значением». имя. this.setString (Method, Entity, Rs.getString (method.getName (). substring (3) .tolowerCase ())); } else if (method.getParameterTypes () [0] .getSimplEname (). indexof ("date")! = -1) {this.setDate (метод, объект, rs.getDate (method.getName (). substring (3) .tolowerCase ())); } else if (method.getParameterTypes () [0] .getSimplEname (). IndexOf ("inputStream")! = -1) {this.setBlob (метод, объект, rs.getblob (method.getName (). substring (3) .TolowerateCame (). getBinaryStream ()); } else {this.setInt (метод, Entity, rs.getint (method.getName (). substring (3) .tolowerCase ())); }}} // Закрыть набор результатов rs.close (); // закрыть предварительный оператор объекта.close (); вернуть сущность; } /*** Фильтруя все объекты метода с входящими строками в текущем классе POJO и верните коллекцию списков. */Private List <Метод> MatchPojomethods (t Entity, String MethodName) {// Получить все текущие методы метода POJO [] methods = entity.getClass (). getDeclaredMethods (); // Список контейнеров хранит все объекты метода с помощью List String List <Thod> list = new ArrayList <Method> (); // фильтровать все объекты метода с помощью строк GET в текущем классе POJO и сохранить их в контейнере списка для (int index = 0; index <methods.length; index ++) {if (method [index] .getName (). Indexof (методнэм)! = -1) {list.add (methodex]); }} return List; } /*** Метод возвращает значение оператора SQL, когда тип int или целое число. Соответствует GET */ public integer getInt (Метод метода, t Entity) бросает Exception {return (integer) method.invoke (entity, new Object [] {}); } /*** Метод возвращает значение сборки оператора SQL, когда тип является строкой. Например, «ABC», соответствующий Get */ public String getString (метод метода, t Entity) выбрасывает exection {return (string) method.invoke (entity, new Object [] {}); } /*** Метод возвращает оператор SQL, собранное значение, когда тип Blob. Соответствует получению */ public inputstream getBlob (метод метода, t Entity), выбросит Exception {return (inputStream) Method.invoke (Entity, New Object [] {}); } / ** * Метод возвращает оператор SQL, собранное значение, когда тип даты, соответствующий GET * / Public Date GetDate (Метод метода, t ENTITY), бросает исключение {return (date) method.invoke (entity, new Object [] {}); } / ** * Когда тип параметра является целым числом или int, установите параметры для поля объекта, соответствующего установке * / public integer setInt (метод метода, t Entity, Integer arg) Throws Exception {return (integer) method.invoke (entity, new Object [] {arg}); } / ** * Когда тип параметра - это строка, установите параметры для поля объекта, соответствующего установке * / public String setString (метод метода, t entity, string arg), выбросит исключение {return (string) method.invoke (entity, new Object [] {arg}); } / ** * Когда тип параметра является входным потоком, установите параметры для поля объекта, соответствующего установке * / public inputstream setBlob (метод метода, t Entity, inputStream arg) THRES Exception {return (inputStream) Method.Invoke (Entity, New Object [] {arg}); } / ** * Когда тип параметра - дата, установите параметры для поля объекта, соответствующего установке * / public date setdate (метод метода, t Entity, date arg) выбрасывает exection {return (date) method.invoke (entity, new Object [] {arg}); }}Сотрудники, да, наследует основанный на основании и может напрямую использовать метод родительского класса, добавляя повторное использование кода
пакет com.mployees.dao; import java.util.arraylist; import java.util.list; import com.mployees.po.employee; public Class employsdao расширяет basedao <Сотрудники> {// Операция по добавлению информации сотрудников Общественные логические добавки (окончательные сотрудники) THROHS Exclive {Save Commories); вернуть истину; } // Добавить информацию о сотрудниках в таблицу Общедоступный список <Сотрудники> AddeMployee (INT ID) Throws Exception {List <Сотрудники> LSTEMPOUTIES = NEW ARRAYLILD <SOMPANTION> (); Сотрудники сотрудников = findbyid (id); // загружать в настоящее время прилагаемые данные в Object LSTEMPOUTIES.ADD (сотрудники); вернуть Lstempopeees; } public void deleteemp (конечная организация сотрудников) бросает исключение {this.delete (entity); } public void UpdateEmp (конечная организация сотрудников) бросает исключение {this.update (entity); }}Я не буду размещать код слоя PO, теперь использую JUNIT4, чтобы сделать тест
пакет com.mployees.dao; import org.junit.test; import com.mployees.po.empupies; Public Class employmesdaotest {@Test public void testAdd () бросает исключение {сотрудники emp = new сотрудники (); emp.setpname ("tly"); emp.setpsex ("мужчина"); emp.setpbeliefs ("xxxxx"); emp.setpaddr ("tianhe"); emp.setphobby («играть в баскетбол»); emp.setpsubject ("computer"); Emp.Setptel ("123456"); Сотрудникидао DAO = новые сотрудникидао (); dao.addemployees (EMP); } @Test public void testupDate () throws Exception {effectyDao dao = new сотрудникидао (); Сотрудники emp = dao.findbyid (14); emp.setptel ("999999"); dao.updateemp (emp); } @Test public void testDelete () выбрасывает Exception {effectionDao dao = new сотрудникидао (); Сотрудники EMP = DAO.FINDBYID (15); dao.deleteemp (emp); }}После тестирования эти три метода могут работать нормально, время устремляется. Некоторые коды используются другими приятелями. Некоторые места могут не считаться очень полными, или некоторые коды будут избыточными. Генеральная операция CRUD в основании не была написана полностью. Если какой -нибудь друг заинтересован, вы можете написать его снова, например, запрос, пакетная операция и т. Д. Если тест проходит, не забудьте прислать мне копию, ха -ха
Вышеуказанная простая и общая вспомогательная упаковка JDBC (пример) - это весь контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.