Предисловие
Spring's JDBC Templet - это базовая инкапсуляция, которую Spring использует для JDBC. В основном это помогает программистам управлять подключениями к базе данных, а остальные методы использования не имеют большого различия от непосредственного использования JDBC.
Бизнес -требования
Все знакомы с использованием JDBC. Это в основном для демонстрации шагов для использования Spring JDBC Templet в Springboot, поэтому мы разработали простое требование. Работа творога пользовательского объекта. Объект имеет два свойства, одно идентификатор, а другой - имя. Хранится в таблице Auth_user в MySQL.
Создать новые проекты и добавить зависимости
Создайте пустой проект Springboot в Intellij Idea. Ссылка на конкретные шаги
Графическое руководство IntelliJ Idea для создания проектов Spring-Boot. В соответствии с требованиями этого примера нам необходимо добавить следующие три зависимости
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <groupId> mysql </GroupId> <ArtifactId> mySQL-Connector-java </artifactId> <sersive> 6.0.6 </version> </vehysE>
Поскольку мы хотим опубликовать службу HTTP REST, мы добавляем зависимость от Spring-Boot-Starter-Web. Здесь мы хотим использовать метод JDBC Tempet для доступа к базе данных, поэтому мы добавляем зависимость Spring-Boot-Starter-JDBC для доступа к базе данных MySQL, поэтому мы добавляем последнюю версию драйвера JDBC MySQL.
Подготовьте среду базы данных
Предположим, что MySQL 5.7 уже установлен в операционной системе Linux. Следующие операции выполняются в командной строке операционной системы, входящей в систему в командную строку клиента MySQL через пользователя root.
Создайте базу данных и таблицу
Создать базу данных Springboot_jdbc; создать таблицу auth_user (uuid bigint not null, имя varchar (32), первичный ключ (uuid)) по умолчанию charset = utf8mb4;
Установите разрешения пользователя
предоставить все привилегии на springboot_jdbc.* to 'springboot'@'%' идентифицирован "Springboot '; привилегии промывки;
Настройка источника данных (Pool Connection Pool)
Источник данных Springboot автоматически настроен. В Springboot 2.0 доступно несколько конфигураций источника данных, и они выбирают, какой источник данных фактически использовать в последнем порядке Hikaricp -> Tomcat Pooling -> Commons DBCP2.
Когда проект добавляет зависимость Spring-Boot-Starter-JDBC, зависимость от источника данных HikaricP уже включена, поэтому источник данных пула подключений HikaricP автоматически настроен здесь.
Добавить следующую конфигурацию в Appplications.properties
#Генеральная конфигурация источника данных spring.datasource.driver-class-name = com.mysql.cj.jdbc.driverspring.datasource.url = jdbc: mysql: //10.110.2.5: 3306/spri ng-boot-jdbc? charset = utf8mb4 & usessl = falsspring.datasource.username = springbootspring.datasource.password = springboot# Хикари источник данных Специфическая конфигурация Spring.datasource.hikari.maximum-pool-size = 20spring.datasource.hikari.minimum-idle = 5
Среди них большинство конфигураций источника данных Хикари показаны на рисунке ниже. Вы можете проверить значение каждой конфигурации
Разработка программы
Пользовательская база данных объект
Согласно требованиям, соответствующая объект пользовательских данных имеет два атрибута, один - ID, а другой - имя. Это чистый объект pojo.
пакет com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao;/*** Объект объекта пользователя** @author yang gaochao* @since 2018-03-09*/public userdo {private long id; Приватное название строки; public long getId () {return id; } public void setId (long id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; }} Общий http rest объект возврата
Обычно в интерфейсе REST HTTP мы не только хотим напрямую возвращать контент бизнес -объекта, но и вернуть некоторую общую информацию, такую как результат интерфейсного вызова, пользовательское текстовое сообщение, возвращаемое при вызове, и т. Д. Затем нам нужно установить два общих объекта RETER, в дополнение к возврату результатов общего интерфейса и текстовых сообщений, один включает в себя отдельный бизнес -контент и один содержит коллекцию. Конкретное определение заключается в следующем
Возврат объект для отдельного бизнес -контента
пакет com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo;/*** Один объект возвращает результат** @author yang gaochao* @since 2018-03-09*/public class restitemresult <t> {private String Result; Приватное строковое сообщение; частный T Item; public String getResult () {return Result; } public void setResult (String Result) {this.Result = result; } public String getMessage () {return message; } public void setMessage (String Message) {this.message = сообщение; } public t getItem () {return item; } public void setItem (t item) {this.item = item; }} Коллекция бизнес -контента возвращает объект
Пакет com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo; импорт java.util.collection;/*** Объект коллекции возвращает результат** @author yang gaochao* @since 2018-03-09*/public class restcollectionresult <t> {private String Результат; Приватное строковое сообщение; частная коллекция <T> предметы; public String getResult () {return Result; } public void setResult (String Result) {this.Result = result; } public String getMessage () {return message; } public void setMessage (String Message) {this.message = сообщение; } public Collection <t> getItems () {return ements; } public void setItems (collection <t> eptions) {this.items = items; }} Разработка уровня устойчивости данных
Определение интерфейса интерфейса пользовательских данных
Пакет com.yanggaochao.springboot.learn.springbootjdbclearn.dao; импорт com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; импорт java.util.list;/*** 2018-03-09*/public interface userdao {/*** Сохранить нового пользователя в базе данных** @param пользовательский объект, чтобы сохранить* @return, независимо ли успешное усиление мышц*/boolean add (userdo user); / *** Обновите пользователя в базе данных** @param пользователь пользователя, чтобы обновить* @return, является ли обновление успешным*/ boolean update (userdo user); / *** Удалить указанного пользователя** @param id Идентификация пользователя, чтобы удалить* @return, является ли удаление успешным*/ boolean delete (long id); / *** Точный запрос указанного пользователя** @param id Идентификация пользователя, чтобы запросить* @return, если его можно запросить, вернуть информацию пользователя, в противном случае возвращает Null*/ userdo location (long id); / *** Запрос пользователя по имени** @param name Имя нечеткого* @return Список пользователей на запрос*/ list <userdo> matchname (string name);} Реализация устойчивости пользовательских данных.
Пакет com.yanggaochao.springboot.learn.springbootjdbclearn.dao.impl; Импорт com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; импорт com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; импорт org.springframework.beans.factory.antation.autowired; импорт org.springframework.jdbc.core.jdbctemplate; импорт org.springframework.jdbc.support.rowset.sqlrowset; import org.springframework.stereotype.repository; import java.util.arraylist; импорт java.util.list;/*** Класс реализации базы объекта пользователя 2018 года. */@RepositoryPublic Class UserDaoJdbctempletImpl реализует userdao {private final jdbctemplate jdbctemplate; @Autowired public userdaojdbctempletimpl (jdbctemplate jdbctemplate) {this.jdbctemplate = jdbctemplate; } @Override public boolean add (userdo user) {string sql = "in in auth_user (uuid, name) values (?,?)"; return jdbctemplate.update (sql, user.getid (), user.getname ())> 0; } @Override public boolean update (userdo user) {string sql = "Обновление auth_user set name =? Где uuid =?"; return jdbctemplate.update (sql, user.getname (), user.getid ())> 0; } @Override public boolean delete (long id) {string sql = "удалить из auth_user, где uuid =?"; return jdbctemplate.update (sql, id)> 0; } @Override public userdo locate (long id) {string sql = "select * from auth_user, где uuid =?"; Sqlrowset rs = jdbctemplate.queryforrowset (sql, id); if (rs.next ()) {return GenerateEntity (rs); } return null; } @Override public list <userdo> matchname (string name) {string sql = "select * из auth_user, где имя нравится?"; Sqlrowset rs = jdbctemplate.queryforrowset (sql, "%" + name + "%"); Список <userDo> users = new ArrayList <> (); while (rs.next ()) {users.add (GenerateEntity (RS)); } вернуть пользователи; } private userdo GenerateEntity (sqlRowset RS) {userDo weChatpay = new userdo (); weChatpay.setid (rs.getlong ("uuid")); weChatpay.setName (rs.getString ("name")); вернуть WeChatpay; }} Здесь мы сначала используем аннотацию @Repository, чтобы указать, что это класс уровня стойки данных, и Springboot автоматически создаст этот класс. Затем добавьте @autowired в конструктор. Когда Springboot создает этот класс, он автоматически внедрит экземпляр JDBCTEMPLET в этот класс. Здесь экземпляр JDBCTEMPLET автоматически настроен Springboot на основе конфигурации, связанной с источником данных, в приложениях. Согласно алгоритму Springboot для автоматической настройки источников данных, источник данных, который будет настроен здесь, является Hikaricp.
Остальные похожи на обычную весеннюю разработку JDBCTEMPLET. Вручную конвертируя между объектами и базами данных SQL программистами, пользователи могут быть добавлены, модифицированы, удаляются, нечеткие сопоставления, точный запрос и другие функции.
Разработка бизнес -уровня данных
Определение интерфейса уровня службы данных
пакет com.yanggaochao.springboot.learn.springbootjdbclearn.service; import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; импорт java.util.list;/*** 2018-03-09 */public interface userservice {userdo add (userdo user); UserDo Update (userdo user); Boolean Delete (Long Id); UserDo найти (Long Id); Список <userDo> matchName (string name);} Реализация уровня службы данных
Пакет com.yanggaochao.springboot.learn.springbootjdbclearn.service.impl; импорт com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; импорт com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; импорт com.yanggaochao.springboot.learn.springbootjdbclearn.service.userservice; импорт org.spramework.beans.factory.annotation org.springframework.stereotype.service; import java.util.date; import java.util.list;/*** Класс реализации бизнес-уровня пользователя*** @author yang gaochao* @since 2018-03-09*/ @ @servicepublic class userserviceimplessivemplames userservice {private final userda userda userda; @Autowired public userserviceimpl (userdao userdao) {this.userdao = userdao; } @Override public userdo add (userdo user) {user.setid (new date (). Gettime ()); if (userdao.add (user)) {return user; } return null; } @Override public userdo update (userdo user) {if (userdao.update (user)) {return location (user.getid ()); } return null; } @Override public boolean delete (long id) {return userdao.delete (id); } @Override public userdo location (long id) {return userdao.locate (id); } @Override public list <userdo> matchname (string name) {return userdao.matchname (name); }} Здесь этот класс реализации объявляется как класс на уровне бизнеса через аннотацию @Service. Пользовательский уровень настойчивости позволяет Springboot создавать экземпляры этого класса бизнес -уровня через @autowired и автоматически вводить соответствующий класс уровня стойкости в этот бизнес -класс.
Здесь, при добавлении пользовательских объектов, при настройке идентификации для пользователя миллисекундное количество текущего времени просто используется в качестве идентификации. Во время реального процесса разработки это место должно использовать глобально уникальный механизм, чтобы гарантировать, что этот логотип не может быть повторен.
Разработка внешнего уровня обслуживания
пакет com.yanggaochao.springboot.learn.springbootjdbclearn.web; import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo.restcollectionResult; импорт com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; импорт com.yanggaochao.springboot.learn.springbootjdbclearn.service.userservice; импорт org.spramework.beans.factory.annotation org.springframework.web.bind.annotation.*; import java.util.list;/*** Пользователь http reste Interface** @author yang gaochao* @since 2018-03-09*/ @ @restcontroller @requestmapping ("API/V1/пользователь пользователей") пользователь пользователей класса). @Requestmapping (value = "/add", method = requestMethod.post) public restIteMresult <userDo> add (@Requestbody userdo user) {restiteMresult <userDo> resulteMresult <> (); user = userservice.add (user); if (user! = null) {result.setitem (user); result.setResult («успех»); } else {result.setMessage ("новый пользователь не удался"); result.setResult ("сбой"); } return Result; } @RequestMapping (value = "/update", method = requestMethod.post) public restIteMresult <userDo> update (@Requestbody userdo user) {restiteMresult <userDo> result = new RestiTemResult <> (); user = userservice.update (user); if (user! = null) {result.setitem (user); result.setResult («успех»); } else {result.setMessage ("userDo не удалось изменить пользователя"); result.setResult ("сбой"); } return Result; } @Requestmapping (value = "/delete/{uuid}", method = requestMethod.get) public restiteMresult <userDo> delete (@Pathvariable long uuid) {restiteMresult <userDo> result = new RestiteMresult <> (); if (userservice.delete (uuid)) {result.setresult ("успех"); } else {result.setMessage ("удалить пользователь Faile"); result.setResult ("сбой"); } return Result; } @RequestMapping (value = "/locate/{uuid}", method = requestMethod.get) public restiteMresult <userDo> locate (@pathvarible long uuid) {restitemresult <userdo> result = new RestitemResult <> (); Userdo user = userservice.locate (uuid); if (user! = null) {result.setitem (user); result.setResult («успех»); } else {result.setMessage ("Query User Faile"); result.setResult ("сбой"); } return Result; } @RequestMapping (value = "/match/{name}", method = requestMethod.get) public restCollectionResult <userDo> match (@pathvariable string name) {restcollectionResult <userDo> result = new RestCollectionResult <> (); Список <userdo> users = userservice.matchname (name); result.setItems (пользователи); result.setResult («успех»); результат возврата; }} Здесь @RestController используется, чтобы заявить, что это класс интерфейса HTTP REST. Маршрут вызовов для каждого интерфейса сформируется путем объединения @Requestmapping в классе и @Requestmaping на методе. Свойство метода в @Requestmapping на методе объявляет метод, вызванный HTTP. @Requestbody Annotation автоматически преобразует объект JSON в данных POST в объект POJO. @Pathvariable автоматически преобразует данные в пути URL HTTP в параметры метода обслуживания.
Http rest test test test
Проверьте службу REST HTTP, вызывается через HTTPClient of Apache Commons.
Http resst вызывает вспомогательные классы
Пакет com.yanggaochao.springboot.learn.springbootjdbclearn; импорт org.apache.commons.httpclient.defaulthttpmethodretryhandler; import org.apache.commons.httpclient.httpclient; import org.apache.commons.httpclient.httpclient; import.Apache.commons.httpclient.httpclient; import. org.apache.commons.httpclient.methods.getmethod; import org.apache.commons.httpclient.methods.stringrequestentity; импорт org.apache.commons.httpclient.params.httpmethodparams; импорт java.buffudearder; java.io.inputStreamReader; Import java.io.reader; import java.util.map;/*** @author yang gaochao* @since 2018-03-09*/public class httpclientHelper {/*** Используйте метод Get, чтобы инициировать доступ к http* @param url http текст ответа, полученный после */ public String httpgetRequest (string url, map <string> heders) {try {httpclient httppclient = new httpclient (); GetMethod Method = new GetMethod (URL); method.setrequestheader ("Content-type", "Application/json; charset = utf-8"); method.getParams (). setParameter (httpmethodparams.retry_handler, новый Defaulthttpmethodretryhandler (3, false)); if (заголовки! = null) {for (string key: headers.keyset ()) {method.setrequestheader (key, headers.get (key)); }} int statuscode = httpclient.executemethod (method); if (statuscode == 200) {return parseinputstream (method.getResponsebodyAssTream ()); } else {System.out.println (url + "status =" + statusCode); }} catch (Exception e) {e.printstackTrace (); } return null; } / *** Используйте метод post, чтобы инициировать http -запрос** @param URL URL -адрес http, который будет доступен* @param данных в запросе* @return текст ответа, полученный после доступа к http* / public string httppoStrequest (строка url, строки, map <string> wearders) Httpclient (); Postmethod Method = новый постметод (URL); method.setrequestheader ("Content-type", "Application/json; charset = utf-8"); method.setrequestheader («пользователь-агент», «Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebkit/537.36 (khtml, как гекко) хром/34.0.1847.131 Safari/537.36"); if (заголовки! = null) {for (string key: headers.keyset ()) {method.setrequestheader (key, headers.get (key)); }} method.setRequestentity (new StringRequestentity (data, "json", "UTF-8")); int statuscode = httpclient.executemethod (method); if (statuscode == 200) {return parseinputstream (method.getResponsebodyAssTream ()); } else {System.out.println (url + "status =" + centusCode + parseinputStream (method.getResponseBodyAssTream ())); }} catch (Exception e) {e.printstackTrace (); } return null; } / *** Диаграммы текстовых данных от java.io.reader** @param rd java.io.reader объект* @throhs исключение вызывает ошибку, когда возникает ошибка* / private String parsereader (reader rd), бросает исключение {BufferedReader Brd = new BufferedReader (rd); Строка; StringBuilder resplowseContext = new StringBuilder (); while ((line = brd.readline ())! = null) {responsecontext.append (line) .append ("/n"); } //rd.close (); if (responsecontext.length ()> 0) {responsecontext.deletecharat (responsecontext.length () - 1); } return resplowsecontext.toString (); } / *** Текстовые данные анализа из входного потока** @param - это поток ввода* @Throws Исключение бросает исключение, когда возникает ошибка* / private String ParseInputStream (inputStream IS) Throws Exception {return parsereader (new BufferedReader (новый inputStreamReader (is))); }} Здесь мы в основном реализуем метод вызова HTTP Service с использованием методов GET и публикации.
Тестовые случаи
Используйте Junit для выполнения тестовых случаев. Для реализации теста мы добавили следующую зависимость Maven
<dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> <scope>test</scope></dependency><dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.3</version> <Scope> test </scope> </deperiance>
Пакет com.yanggaochao.springboot.learn.springbootjdbclearn; импорт org.codehaus.jettison.json.jsonobject; импорт org.junit.fter; импорт org.junit.before; import.junit.test; импорт java.net.Urlencoder; java.util.list;/** * Описание: * * @author yang gaochao * @since 2018-03-09 */public class userapitest {private string userAddurl = "http: // localhost: 3030/security/api/v1/user/add"; Private String userLocateUrl = "http: // localhost: 3030/security/api/v1/user/locate/"; Private String userDeleteUrl = "http: // localhost: 3030/security/api/v1/user/delete/"; Private String userUpdateurl = "http: // localhost: 3030/security/api/v1/user/update"; private String usermatchurl = "http: // localhost: 3030/security/api/v1/user/match/"; JsonObject adduser = new jsonObject (); Long AddUserid = null; List <long> userids = new ArrayList <> (); @Before public void до () бросает исключение {adduser.put ("name", "Beautiful Sheep"); Jsonobject addresultjson = new jsonObject (new httpclientHelper (). HttppoStrequest (userAddurl, adduser.toString (), null)); assert ("успех" .equals (addresultjson.getString ("result"))); adduserid = addresultjson.getjsonObject ("item"). getLong ("id"); JsonObject user = new jsonObject (); user.put ("name", "приятный коз"); addresultjson = new jsonobject (new httpclientHelper (). httppoStrequest (userAdDurl, user.toString (), null)); assert ("успех" .equals (addresultjson.getString ("result"))); userids.add (addresultjson.getjsonobject ("item"). getlong ("id")); user.put ("name", "Grey Wolf"); addresultjson = new jsonobject (new httpclientHelper (). httppoStrequest (userAdDurl, user.toString (), null)); assert ("успех" .equals (addresultjson.getString ("result"))); userids.add (addresultjson.getjsonobject ("item"). getlong ("id")); } @Test public void testupDateUser () бросает exception {jsonObject user = new jsonObject (); user.put ("name", "Smad Sheep"); user.put ("id", adduserid); new httpclientHelper (). httppoStrequest (userUpdateurl, user.toString (), null); JsonObject locaterSultjson = new jsonObject (new httpclientHelper (). HttpgetRequest (userlocateurl + adduserid, null)); assert (user.getString ("name"). equals (locaterSultjson.getJsonObject ("item"). getString ("name"))); } @Test public void testmatchuser () throws exception {jsonObject matchresultjson = new jsonObject (new httpclientHelper (). HttpgetRequest (usermatchurl + urlencoder.encode («овец», «UTF-8»), null)); assert (matchresultjson.has ("items") && matchresultjson.getjsonarray ("items"). Length () == 2); MatchResultjson = new JSonObject (new httpclientHelper (). httpgetRequest (usermatchurl + urlencoder.encode ("wolf", "utf-8"), null)); assert (matchresultjson.has ("items") && matchresultjson.getjsonarray ("items"). Length () == 1); } @After public void After () Throws Exception {if (adduserId! = Null) {jsonObject deleterESultjson = new jsonObject (new httpclientHelper (). HttpgetRequest (userDeleteUrl + adduserid, null)); assert ("успех" .equals (deleteresultjson.getString ("result"))); } for (long userid: userids) {jsonObject deleterESultjson = new jsonObject (new httpclientHelper (). httpgetRequest (userDeleTeeUrl + userId, null)); assert ("успех" .equals (deleteresultjson.getString ("result"))); }}} Здесь два тестовых случая объявляются в @Test, один тестирует функцию модификации пользователя, а другой проверяет функцию нечеткого запроса пользователя. @Before объявляет о приготовлении, которые должны быть сделаны перед выполнением каждого тестового примера. Здесь мы сначала вставляем три части данных в базу данных, и в то же время мы также проверяем функцию добавления данных и точного запроса. @After объявляет о очистке после выполнения каждого тестового примера. Здесь мы в основном удаляем ранее вставленные данные. Функция удаления пользователя тестируется синхронно здесь.
PostScript
Вот полный пример Springboot с использованием JDBC Templet. Если у вас есть опыт использования JDBC Templet под пружиной, то основная цель - уменьшить много конфигурационных работ весной.
Код, участвующий в этой статье, был загружен в GitHub, и вы также можете загрузить его локально
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.