В предыдущей статье основные принципы и использование Spring Boot были объяснены с помощью простой программы Helloworld. Эта статья в основном объясняет, как получить доступ к базе данных через Spring Boot. Эта статья продемонстрирует три способа доступа к базе данных. Первый - JDBCTemplate, второй - JPA, а третий - Mybatis. Как упоминалось ранее, эта серия будет использовать систему блога в качестве основы для объяснения, поэтому в этой статье объясняется хранение и доступ к статье (но не включает детали статьи). Поскольку окончательная реализация завершена через Mybatis, будет сделана только простая демонстрация JDBCTEMPLATE и JPA, а часть Mybatis полностью реализует добавление, удаление, модификацию и поиск статьи.
1. Подготовка
Прежде чем демонстрировать эти методы, вам нужно сначала что -то подготовить. Первый - это база данных. Эта система реализована с использованием MySQL. Нам нужно сначала создать таблицу tb_article:
DROP TABLE IF EXISTS `tb_article`;CREATE TABLE `tb_article` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL DEFAULT '', `summary` varchar(1024) NOT NULL DEFAULT '', `status` int(11) NOT NULL DEFAULT '0', `type` int(11) NOT NULL, `user_id` bigint (20) не null default '0', `create_time` timeStamp Не null default current_timestamp,` update_time` timeStamp, не нулевая по умолчанию current_timestamp, `public_time` timeStamp, а не null default uccule_timestamp, первичный ключ (` id`) engine = innodb default charset = utf8;
В последующей демонстрации эта таблица будет добавлена, удалена, изменена и проверена. Вы должны увидеть, что в этой таблице нет подробностей о статье. Причина в том, что детали статьи являются относительно длинными. Если помещать в эту таблицу, это легко повлияет на эффективность запроса списка статьи, поэтому детали статьи будут храниться в другой таблице отдельно. Кроме того, нам нужно настроить пул соединений базы данных. Здесь мы используем пул соединений друида. Кроме того, файл конфигурации настроен с использованием YAML, то есть Application.yml (вы также можете использовать файл конфигурации Application. Конфигурация пула соединений следующая:
Весна: DataSource: URL: JDBC: MySQL: //127.0.0.1: 3306/blog? useUnicode = true & haremencoding = utf-8 & usessl = false DriverClassNam
Наконец, нам также необходимо создать класс POJO, соответствующий базе данных, код заключается в следующем:
статья открытого класса {Private Long ID; Приватная строка название; Краткое изложение частной строки; частная дата создания времени; частная дата Publictime; частная дата обновления; Приватный длинный пользовательский иид; частное целое число; частное целочисленное тип;}Хорошо, это вся работа, которую вам нужно подготовить, и теперь начните реализацию операции базы данных.
2. Интеграция с JDBCTEMPLATE
Во -первых, мы сначала получили доступ к базе данных через JDBCTEMPLATE. Здесь мы демонстрируем только вставку данных. Как упоминалось в предыдущей статье, Spring Boot предоставляет много стартеров для поддержки различных функций. Чтобы поддержать JDBctemplate, нам нужно только представить следующий стартер:
<Depeication> <groupid> org.springframework.boot </GroupId> <artifactid> Spring-boot-starter-jdbc </artifactid> </dependency>
Теперь мы можем реализовать вставку данных через JDBctemplate:
публичный интерфейс articledao {long insertarticle (статья статья);} @RepositoryPublic Class articledaojdbctemplateimpl реализует articledao {@autowired private natedparameterjdbctemplate jdbctemplate; @Override public long insertarticle (статья статья) {string sql = "Вставка в tb_article (заголовок, сумма, user_id, create_time, public_time, update_time, status)" + "values (: teal,: summary: userId ,: createtime ,: publictime,: updateTime,: status)"; Map <string, object> param = new hashmap <> (); param.put ("title", article.gettitle ()); param.put ("specing", article.getsummary ()); param.put ("userid", article.getuserid ()); param.put ("status", article.getstatus ()); param.put ("createTime", article.getCreatetime ()); param.put ("createTime", article.getCreatetime ()); param.put ("publictime", article.getPublictime ()); param.put ("updateTime", article.getupDateTime ()); return (long) jdbctemplate.update (sql, param); }}Мы используем Junit для проверки вышеуказанного кода:
@Runwith (springjunit4classrunner.class) @springboottest (classe = Application.class) открытый класс articledaotest {@autowired private articledao articledao; @Test public void testinsert () {article article = new article (); article.settitle ("test title"); article.setsummary («Сводка тестов»); article.setuserid (1L); article.setStatus (1); article.setCreatetime (новая дата ()); article.setupdateTime (new Date ()); article.setPublictime (New Date ()); articledao.insertarticle (статья); }}Чтобы поддержать вышеуказанную программу тестирования, вам также необходимо представить стартер:
<Depective> <groupId> org.springframework.boot </GroupId> <artifactid> spring-boot-starter-test </artifactid> <cerpope> test </scope> </depertive>
Из приведенного выше кода мы видим, что на самом деле нет конфигурации, за исключением введения старта JDBC. Это автоматический процесс конфигурации пружинной загрузки. Приведенный выше код должен обратить внимание на местоположение класса приложений. Этот класс должен быть расположен в родительском пакете класса DAO. Например, DAO находится в пакете com.pandy.blog.dao. Теперь мы перемещаем класс Application.java из пакета com.pandy.blog в пакет com.pandy.blog, и появится следующая ошибка:
Вызвано: org.springframework.beans.factory.nosuchbeandefinitionException: нет квалификационного боба типа 'com.pandy.blog.dao.articledao': ожидается не менее 1 фасоли, которая квалифицируется как кандидат в автооверию. Аннотации зависимости: {@org.springframework.beans.factory.annotation.autowired (обязательно = true)} at org.springframework.beans.factory.support.defaultbeanbeablebeanfactory.raisenomatchingbeanfound (default letribebanfore.java :1493) org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedependency (default -lectablebeanfactory.java:1104) на org.springframework.beans.factory.support.defaultablebeanfactory.resolvendend org.springframework.beans.factory.annotation.autowiredantationbeanpostprocessor $ autowiredfieldelement.inject (AutowireDantationbeanpostprocessor.java:585) ... 28Другими словами, реализация Articledao не может быть найдена. В чем причина? В предыдущем сообщении мы видели, что аннотация @springbootapplication наследует @componentscan, который только сканирует пакеты и подпаки, где класс приложений находится по умолчанию. Следовательно, для приведенной выше ошибки, в дополнение к сохранению класса приложений в родительском пакете DAO, вы также можете указать отсканированный пакет для решения:
@SpringBootApplication@ComponentsCan ({"com.pandy.blog"}) открытый приложение класса {public static void main (string [] args) бросает исключение {springApplication.run (application.class, args); }}3. Интеграция с JPA
Теперь мы начнем объяснять, как реализовать операции базы данных через JPA. Это все еще похоже на jdbctemplate. Во -первых, нам нужно представить соответствующий стартер:
<Depeication> <groupid> org.springframework.boot </GroupId> <ArtifactId> Spring-Boot-Starter-Data-JPA </artifactid> </deperency>
Затем нам нужно добавить аннотацию сущности в класс POJO и указать имя таблицы (если не указано, имя таблицы по умолчанию - статья), а затем нам нужно указать идентификатор и его стратегию генерации. Это все знания JPA и не имеют ничего общего с Spring Boot. Если вы не знакомы с этим, вы можете посмотреть на точки знания JPA:
@Entity (name = "tb_article") открытый класс статья {@id @generatedValue Private Long ID; Приватная строка название; Краткое изложение частной строки; частная дата создания времени; частная дата Publictime; частная дата обновления; Приватный длинный пользовательский иид; частное целочисленное статус;}Наконец, нам нужно унаследовать класс jParePository. Здесь мы реализуем два метода запроса. Первый - это запрос, который соответствует спецификации именования JPA. JPA автоматически поможет нам завершить генерацию заявлений на запросы. Другим способом является внедрение JPQL (SQL-подобный запрос, поддерживаемый JPA).
Общественный интерфейс ArticLeRePository расширяет jParePository <статья, long> {public list <Catpe> findByUserid (long userId); @Query ("Select Art из com.pandy.blog.po.article Art, где название =: title") public list <start> Querybytitle (@param ("title") string title);}Хорошо, мы можем снова проверить приведенный выше код:
@Runwith (springjunit4classrunner.class) @springboottest (classe = Application.class) открытый класс articlerePositoryTest {@autowired Private ArticLeRePository articLeRePository; @Test public void testquery () {list <статья> articleList = articLeRePository.queryBytitle ("Test Title"); asserttrue (articlelist.size ()> 0); }}Обратите внимание, что здесь все еще есть проблемы, похожие на JDBctemplate. Вам необходимо сделать класс запуска приложения не в родительском пакете классов респозиции и объектов, в противном случае появится следующая ошибка:
Вызвано: org.springframework.beans.factory.nosuchbeandefinitionException: нет квалификационного боба типа 'com.pandy.blog.dao.articleRepository': ожидается не менее 1 боба, что соответствует кандидату на автоматическую. Аннотации зависимости: {@org.springframework.beans.factory.annotation.autowired (обязательно = true)} at org.springframework.beans.factory.support.defaultbeanbeablebeanfactory.raisenomatchingbeanfound (default letribebanfore.java :1493) org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedependency (default -lectablebeanfactory.java:1104) на org.springframework.beans.factory.support.defaultablebeanfactory.resolvendend org.springframework.beans.factory.annotation.autowiredantationbeanpostprocessor $ autowiredfieldelement.inject (AutowireDantationbeanpostprocessor.java:585) ... 28Конечно, вы также можете указать отсканированный пакет JPA, аннотируя @enablejparepositories, но он все еще не работает, и появится следующая ошибка:
Вызвано: java.lang.illegalargumentException: не управляемый тип: class com.pandy.blog.po.article at org.hibernate.jpa.internal.metamodel.metamodelimpl.managedtype (metamodelimpl.java:210) в org.springframework.data.jpa.repository.support.jpametamodelentityInformation org.springframework.data.jpa.repository.support.jpaentityInformationsupport.getentityInformation (jpaentityInformationsupport.java:68) в org.springframework.data.jpa.repository.support.jparepositoryfactory.getentityInformation (jparePositoryFactory.java:153) в org.springframework.data.jpa.repository.support.jparePositoryFactory.getTargetRepository (jparePositoryFactory.java:100) в org.springframework.data.jpa.repository.support.jparePositoryFactory.getTargetRepository (jparePositoryFactory.java:82) в org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository (RepositoryFactorySupport.java:199) в org.springframework.data.repository.core.support.repositoryfactorybeansupport.initandretur org.springframework.data.repository.core.support.repositoryfactorybeansupport.afterpropertiesset (Repositoryfactorybeansupport.java:263) в org.springframework.data.jpa.repository.support.jparepositoryfactorybean.afterpropertiesset (jparepositoryfactorybean.java:101) в org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.invokeinitMethods (Abstractautowirecapablebeanfactory.java:1687) AT org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean (Abstractautowirecapablebeanfactory.java:1624) ... 39
Эта ошибка указывает на то, что сущность не может быть распознана, поэтому вам также необходимо указать пакет объектов, аннотируя @EntityScan. Окончательная конфигурация заключается в следующем:
@SpringbootApplication@componentscan ({"com.pandy.blog"})@enablejparepositories (basepackages = "com.pandy.blog")@entityscan ("com.pandy.blog") public class application {public static void main (string [] args) toplows {spressapplication rabs (rags); }}4. Интеграция с mybatis
Наконец, давайте посмотрим, как достичь доступа к базе данных через Mybatis. Точно так же нам все еще нужно ввести стартер:
<Depective> <groupId> org.mybatis.spring.boot </GroupId> <artifactid> mybatis-spring-boot-starter </artifactid> <sersive> 1.1.1 </version> </sepect>
Поскольку стартер официально не предоставлен Spring Boot, номер версии не соответствует Spring Boot и должен быть указан вручную.
Mybatis, как правило, может указать SQL, который управляет базами данных через XML или аннотации. Лично я предпочитаю XML, поэтому эта статья демонстрирует доступ к базам данных через XML. Во -первых, нам нужно настроить каталог Mapper. Мы настроим его в Application.yml:
mybatis: config-locations: mybatis/mybatis-config.xml-mapper-location
Конфигурация здесь в основном включает в себя три части, одна из них - некоторые конфигурации самого Mybatis, такие как псевдоним для основных типов. Второе - указать местоположение файла Mapper, а третий - псевдоним для класса POJO. Эта конфигурация также может быть реализована с помощью конфигурации Java. Из -за проблем с пространством я не буду подробно объяснять здесь. Заинтересованные друзья могут реализовать это сами.
После конфигурации мы сначала записываем интерфейс Mapper:
публичный интерфейс articleMapper {public long insertarticle (статья статья); public void updatearticle (статья статьи); публичная статья QueryByid (Long Id); Общедоступный список <статья> QueryArticlicsBypage (@param ("article") статья, @param ("pagesize") int pagesize, @param ("offset") int offset);}Этот интерфейс временно определяет только четыре метода, а именно: добавление, обновление и запрос на основе идентификации и страниц. Это интерфейс, и он похож на JPA, поэтому вам не нужно внедрять классы. Затем мы пишем файл XML:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper.org/dtd/mybatis-3-mapper.dtd " namespace = "com.pandy.blog.dao.articlemapper"> <resultmap id = "articlemap" type = "com.pandy.blog.po.article"> <id column = "id" property = "id" jdbctype = "integer"/> <result = "title" title = "title" jdbcte = "/> <result =" title "=" COLMAN = "Сводка" Property = "summary" jdbctype = "varchar"/> <result column = "user_id" property = "userId" jdbctype = "integer"/> <result column = "status" property = "jdbctype =" integer "/> result column =" create_tume = "createtime" jdbcty column = "update_time" Propertive = "updateTime" jdbctype = "timeStamp"/> <result column = "public_time" property = "publictime" jdbctype = "timeStamp"/> </resultMap> <sql id = "base_column"> title, summary, user_id, create_time, udvert_time, upplect_time_time </reblumn </Qumture </rep> strumn </Qumture. id = "INSRESTARTICLE" PARAMETERTYPE = "Статья"> Вставка в TB_ARTICLE (<Inclate RefID = "base_column"/>) Value (#{title},#{summary},#{userId},#{status},#{createTime},#updateTem ParameterType = "статья"> Обновление tb_article <set> <if test = "title! = null"> title = #{title}, </if> <if test = "summary! = null"> summary = #{summary}, </if> <if test = "= null"> status = #{status}, </if> <if test = "null"> null "> null"> null "> null"> null "> null"> null " #{publicTime}, </if> <if test="updateTime !=null "> update_time = #{updateTime}, </if> </set> WHERE id = #{id} </update> <select id="queryById" parameterType="Long" resultMap="articleMap"> SELECT id,<include refid="base_column"></include> FROM tb_article, где id = #{id} </select> <select id = "QueryArticlicsBypage" resultMap = "articleMap"> select id, <включить refid = "base_column"> </include> from tb_article <where> <if test = "article.title! test = "article.userid! = null"> user_id = #{article.userid} </if> </where> limit #{offset}, #{pageize} </select> </mapper>Наконец, нам нужно вручную указать пакеты, отсканированные карт:
@SpringbootApplication@mapperscan ("com.pandy.blog.dao") открытый класс приложение {public static void main (string [] args) бросает исключение {SpringApplication.run (Application.class, args); }}Хорошо, интеграция с Mybatis также завершена, давайте снова проверим:
@Runwith (springjunit4classrunner.class) @springboottest (classe = application.class) открытый класс articlemappertest {@autowired private articlemapper mapper; @Test public void testinsert () {article article = new article (); article.settitle ("Test title 2"); article.setsummary («Сводка теста 2»); article.setuserid (1L); article.setStatus (1); article.setCreatetime (новая дата ()); article.setupdateTime (new Date ()); article.setPublictime (New Date ()); mapper.insertarticle (статья); } @Test public void testmybatisquery () {article article = mappper.querybyid (1l); AssertNotnull (статья); } @Test public void testupDate () {article article = mappper.querybyid (1L); article.setPublictime (New Date ()); article.setupdateTime (new Date ()); article.setStatus (2); mapper.updatearticle (статья); } @Test public void testquerybypage () {статья статья = new article (); article.setuserid (1L); Список <статья> list = mapper.queryarticlicsbypage (статья, 10,0); asserttrue (list.size ()> 0); }}5. Резюме
Эта статья демонстрирует интеграцию Spring Boot с JDBctemplate, JPA и Mybatis. В целом, конфигурация относительно проста. Студенты, которые делали связанные конфигурации раньше, должны чувствовать, что это очевидно. Spring Boot действительно оказал нам большую помощь в этом отношении. В последующих статьях мы будем использовать Mybatis только для выполнения операций базы данных. Еще одна вещь, которую нужно отметить, это то, что запрос на страниц Mybatis здесь написан от руки. Эта страница может быть завершена через плагины во время формальной разработки, но это не имеет ничего общего с Spring Boot, поэтому эта статья временно использует этот ручной метод для выполнения обработки лиц.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.