Spring MVC и JDBC (Spring JDBC example). Подключение и настройка JDBC datasource, пример работы с JDBC в Spring
Spring MVC и JDBC Hello world example. Начало работы с Java DataBase Connectivity в приложении Spring MVC.
Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
- Spring MVC 4.2.4.Release
- HSQLDB 2.3.3
- Spring JDBC 4.2.4
- Maven 3.2.5
- IntelliJ IDEA 15.0.2
1. Описание задачи
Подключить и настроить работу с Java DataBase Connectivity (JDBC) в Spring MVC. Посмотреть как используется и конфигурируется dataSource в файле настроек Spring. Создать тестовую HSQLDB (in memory) базу данных, добавить данные и получить к ним доступ с помощью веб приложения.
2. Структура проекта
Были добавлены два класса для работы с данными (JDBCController, JDBCExample). В представлениях появился файл jdbc/jdbc.jsp на которой будут отображаться результаты обращения к базе данных. В качестве модели созданы классы DBLog и User, которые соответствуют данным из пакета resources. В нем вы можете увидеть sql файл с описанием таблиц, которые будут созданы на старте приложения и тестовые данные test-data.sql. Настройки подключения и базы данных вынесены в файл utils.properties. Отдельно был добавлен один тестовый класс (JDBCExampleTest) в пакете test.
3. Зависимости в pom.xml
Относительно предыдущего этапа (загрузка файлов и создание PDF, Excel документов) здесь были добавлены следующие зависимости:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<!-- HSQLDB embedded database. Встроенная база данных--> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.3.3</version> </dependency> <!-- Spring JDBC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- Test Artifacts with Spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> <!-- Logging with SLF4J & LogBack --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> <scope>compile</scope> </dependency> <build> .... .... <!--need to find configs in tests in package web-inf like @ContextConfiguration(locations = {"classpath:/config/application-context.xml" --> <testResources> <testResource> <directory>src/main/webapp/WEB-INF/config</directory> </testResource> </testResources> </build> |
Из обязательных — spring-jdbc и hsqldb. Логирование и тестирование в прямую не относится к началу работы с JDBC в Spring MVC, но будет здесь и далее использоваться в проекте.
Полный файл pom.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ru.javastudy</groupId> <artifactId>mvc_html5_angular</artifactId> <version>1.0</version> <properties> <!-- Generic properties --> <java.version>1.8</java.version> <!-- Web --> <jsp.version>2.2</jsp.version> <jstl.version>1.2</jstl.version> <servlet.version>3.1.0</servlet.version> <!-- Spring --> <spring-framework.version>4.2.4.RELEASE</spring-framework.version> <!-- JUnit test --> <junit.version>4.12</junit.version> <!-- Logging --> <logback.version>1.0.13</logback.version> <slf4j.version>1.7.13</slf4j.version> </properties> <dependencyManagement> <!--all spring dependencies --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring-framework.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!--bootstrap webjars.org--> <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <!-- Other Servlet Web dependencies --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <!-- Apache Commons File Upload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- Excel view --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.12</version> </dependency> <!-- PDF view --> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.5</version> </dependency> <!-- HSQLDB embedded database. Встроенная база данных--> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.3.3</version> </dependency> <!-- Spring JDBC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- Test Artifacts with Spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> <!-- Logging with SLF4J & LogBack --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> </plugins> <!--need to find configs in tests in package web-inf like @ContextConfiguration(locations = {"classpath:/config/application-context.xml" --> <testResources> <testResource> <directory>src/main/webapp/WEB-INF/config</directory> </testResource> </testResources> </build> </project> |
4. Настройка конфигурации Spring MVC
Для начала работы с JDBC нам необходимо прописать в конфигурационном файле Spring бин для работы с базой данных и источник этих данных. Эти настройки были добавлены в application-context.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd "> <!--find property file. See bean id='dataSource' for example ${jdbc.hsqldb.driverClass}--> <context:property-placeholder location="classpath:util.properties" /> <!-- XML Bean Definitions --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.hsqldb.driverClass}" /> <property name="url" value="${jdbc.hsqldb.url}" /> <property name="username" value="${jdbc.hsqldb.username}" /> <property name="password" value="${jdbc.hsqldb.password}" /> </bean> <!-- initialize Embedded DataSource. Встроенная база данных--> <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:dbschema.sql"/> <jdbc:script location="classpath:test-data.sql"/> </jdbc:initialize-database> </beans> |
property-placeholder указывает где нужно искать файл со свойствами (будет приведен чуть ниже). Эти свойства используются в описании бина id=dataSource. В свойствах указываются стандартные настройки вроде логина, драйвера для работы с БД и путь к ней. Ниже прописан путь к самим данным (dbschema.sql — скрипты создания БД, test-data.sql — сами данные).
util.properties:
1 2 3 4 5 |
#HSQLDB Specific properties jdbc.hsqldb.driverClass=org.hsqldb.jdbcDriver jdbc.hsqldb.url=jdbc:hsqldb:mem://localhost jdbc.hsqldb.username=sa jdbc.hsqldb.password= |
dbschema.sql:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
DROP TABLE IF EXISTS AUTHORITIES; DROP TABLE IF EXISTS USER; DROP TABLE IF EXISTS LOG; --USER TABLE CREATE TABLE IF NOT EXISTS USER ( IDUSER INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, USERNAME VARCHAR(255) NOT NULL PRIMARY KEY, PASSWORD VARCHAR(255) NOT NULL, ENABLED BOOLEAN NOT NULL ); --AUTHORITIES TABLE CREATE TABLE IF NOT EXISTS AUTHORITIES( USERNAME VARCHAR(255) NOT NULL, AUTHORITY VARCHAR(255) NOT NULL, CONSTRAINT FK_AUTHORITIES_USER FOREIGN KEY(USERNAME) REFERENCES USER(USERNAME)); ; --LOG TABLE CREATE TABLE IF NOT EXISTS LOG ( IDLOG INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, LOGSTRING VARCHAR(1000) NULL, PRIMARY KEY (IDLOG) ); --TEST TABLE CREATE TABLE IF NOT EXISTS TEST ( IDTEST INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, TESTCOLUMN VARCHAR(1000) NULL, PRIMARY KEY (IDTEST) ); |
test-data.sql:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
--USERS INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('admin@gmail.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('javastudy@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test1@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test2@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test3@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test4@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test5@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test6@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test7@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('test8@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('roleuser@outlook.com','12345',TRUE); INSERT INTO USER (USERNAME, PASSWORD, ENABLED) VALUES ('superuser@outlook.com','12345',TRUE); --AUTHORITIES INSERT INTO AUTHORITIES (USERNAME,AUTHORITY) VALUES ('admin@gmail.com','ROLE_ADMIN'); INSERT INTO AUTHORITIES (USERNAME,AUTHORITY) VALUES ('roleuser@outlook.com','ROLE_USER'); INSERT INTO AUTHORITIES (USERNAME,AUTHORITY) VALUES ('superuser@outlook.com','ROLE_SUPER_USER'); --LOG INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 1'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 2'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 3'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 4'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 5'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 6'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 7'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 8'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 9'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 10'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 11'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 12'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 13'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 14'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 15'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 16'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 17'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 18'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 19'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 20'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 21'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 22'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 23'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 24'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 25'); INSERT INTO LOG(LOGSTRING) VALUES('TEST LOG 26'); --TEST INSERT INTO TEST(TESTCOLUMN) VALUES('TEST COLUMN 1'); INSERT INTO TEST(TESTCOLUMN) VALUES('TEST COLUMN 2'); INSERT INTO TEST(TESTCOLUMN) VALUES('TEST COLUMN 3'); INSERT INTO TEST(TESTCOLUMN) VALUES('TEST COLUMN 4'); |
mvc-config.xml (для примера по JDBC ничего полезного, нужен для работы приложения целиком):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- context:component-scan This tag will scan @Component, @Repository, @Service, @Controller and also resolves @Autowired and @Qualifier --> <context:component-scan base-package="ru.javastudy.mvcHtml5Angular.mvc" /> <!-- mvc:annotation-driven configures Spring MVC annotations Support for validating @Controller inputs with @Valid, if a JSR-303 Provider is present on the classpath. HttpMessageConverter support for @RequestBody method parameters and @ResponseBody method return values from @RequestMapping or @ExceptionHandler methods. --> <mvc:annotation-driven/> <!--org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [/jdbcUpdate/user/username/user@javastudy.ru/enabled/resources/css/bootstrap.css] in DispatcherServlet with name 'dispatcherServlet'--> <!--<mvc:default-servlet-handler/>--> <!-- ViewResolver bean config for mapping strings to jsp views --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/view/showMessage.jsp' --> <property name="order" value="1" /> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> <!-- File Upload bean config--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- set the maximum file size in bytes --> <property name="maxUploadSize" value="1000000"/> </bean> <!--Excel and PDF xml view configuration --> <!--disabling for jUnit test. --> <bean class="org.springframework.web.servlet.view.XmlViewResolver"> <property name="order" value="0" /> <property name="location" value="/WEB-INF/config/excel-pdf-config.xml"/> </bean> <mvc:view-controller path="/index.html" view-name="/index"/> <mvc:view-controller path="/about.html" view-name="/about/about"/> <mvc:view-controller path="/file.html" view-name="/file/file"/> <mvc:view-controller path="/jdbc.html" view-name="/jdbc/jdbc"/> <!-- Static Resources Configuration (get access to static sources such as CSS and JavaScript files) --> <mvc:resources mapping="/resources/**" location="/resources/" /> <!-- themes can be put in different folder such as <mvc:resources mapping="/resources/**" location="/resources/themeBlue" /> <mvc:resources mapping="/resources/**" location="/resources/themeGreen" /> --> </beans> |
5. web.xml
Для этого примера также ничего нового и полезного.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>mvc-html5-angularjs</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> WEB-INF/config/application-context.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/WEB-INF/view/index.jsp</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/WEB-INF/view/error/errorpage.jsp</location> </error-page> </web-app> |
6. Java классы для работы с JDBC в Spring MVC
Контроллер обрабатывает запросы с jsp страницы нашего приложения. JDBCController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
package ru.javastudy.mvcHtml5Angular.mvc.jdbc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import ru.javastudy.mvcHtml5Angular.mvc.bean.DBLog; import ru.javastudy.mvcHtml5Angular.mvc.bean.User; import java.util.List; /** * Created for JavaStudy.ru on 24.02.2016. */ @Controller public class JDBCController { @Autowired JDBCExample jdbcExample; @RequestMapping(value = "/jdbcQueryAllUsers", method = RequestMethod.GET) public ModelAndView jdbcSelectAllUsers() { System.out.println("JDBCController jdbcSelectAllUsers() is called"); List<User> users = jdbcExample.queryAllUsers(); return new ModelAndView("/jdbc/jdbc", "resultObject", users); } @RequestMapping(value = "/jdbcInsert/logstring/{logstring}", method=RequestMethod.GET) public ModelAndView jdbcInsert(@PathVariable(value="logstring") String logstring) { System.out.println("JDBCController jdbcInsert is called"); DBLog dblog = new DBLog(); dblog.setLOGSTRING(logstring); boolean result = jdbcExample.insertLog(dblog); return new ModelAndView("/jdbc/jdbc", "resultObject", result); } @RequestMapping(value = "/jdbcSelectLogs", method=RequestMethod.GET) public ModelAndView jdbcSelect() { System.out.println("JDBCController jdbcSelect is called"); List<DBLog> dbLogs = jdbcExample.queryAllLogs(); return new ModelAndView("/jdbc/jdbc", "resultObject", dbLogs); } @RequestMapping(value = "/jdbcDelete/user/{iduser}", method=RequestMethod.GET) public ModelAndView jdbcDelete( @PathVariable(value="iduser") int iduser) { System.out.println("JDBCController jdbcDelete is called"); boolean result = jdbcExample.deleteUSER(iduser); return new ModelAndView("/jdbc/jdbc", "resultObject", result); } @RequestMapping(value = "/jdbcUpdate/user/username/{username}/enabled/{enabled}", method=RequestMethod.GET) public ModelAndView jdbcUpdate(@PathVariable(value="username") String username, @PathVariable(value="enabled") boolean enabled) { System.out.println("JDBCController jdbcUpdate is called"); User user = new User(); user.setUsername(username); boolean result = jdbcExample.updateUserEnable(user, enabled); return new ModelAndView("/jdbc/jdbc", "resultObject", result); } } |
Как видите в нем происходит автосвязывание с классом-репозиторием JDBCExample. Он служит для непосредственного обращения к данным в базе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
package ru.javastudy.mvcHtml5Angular.mvc.jdbc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import ru.javastudy.mvcHtml5Angular.mvc.bean.DBLog; import ru.javastudy.mvcHtml5Angular.mvc.bean.User; import javax.annotation.PostConstruct; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; /** * Created for JavaStudy.ru on 24.02.2016. */ @Repository public class JDBCExample { @Autowired DataSource dataSource; //look to application-context.xml bean id='dataSource' definition private JdbcTemplate jdbcTemplate; @PostConstruct public void init() { System.out.println("JDBCExample postConstruct is called. datasource = " + dataSource); jdbcTemplate = new JdbcTemplate(dataSource); } //JDBC TEMPLATE INSERT EXAMPLE public boolean insertLog(DBLog log) { System.out.println("JDBCExample: log(final String log) is called"); final String INSERT_SQL = "INSERT INTO LOG (LOGSTRING) VALUES (?)"; jdbcTemplate.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); preparedStatement.setString(1, log.getLOGSTRING()); return preparedStatement; } }); return true; } //JDBC TEMPLATE SELECT EXAMPLE public List<DBLog> queryAllLogs() { System.out.println("JDBCExample: queryAllLogs() is called"); final String QUERY_SQL = "SELECT * FROM LOG ORDER BY IDLOG"; List<DBLog> dbLogList = this.jdbcTemplate.query(QUERY_SQL, new RowMapper<DBLog>() { public DBLog mapRow(ResultSet resulSet, int rowNum) throws SQLException { System.out.println("Getting log: "+ rowNum + " content: " + resulSet.getString("LOGSTRING")); DBLog dbLog = new DBLog(); dbLog.setIDLOG(resulSet.getInt("IDLOG")); dbLog.setLOGSTRING(resulSet.getString("LOGSTRING")); return dbLog; } }); return dbLogList; } public List<User> queryAllUsers() { System.out.println("JDBCExample: queryAllUsers is called"); final String QUERY_SQL = "SELECT * FROM USER ORDER BY IDUSER"; List<User> userList = this.jdbcTemplate.query(QUERY_SQL, new RowMapper<User>() { public User mapRow(ResultSet resulSet, int rowNum) throws SQLException { User user = new User(); user.setIdUser(resulSet.getInt("IDUSER")); user.setUsername(resulSet.getString("USERNAME")); user.setPassword(resulSet.getString("PASSWORD")); user.setEnabled(resulSet.getBoolean("ENABLED")); return user; } }); return userList; } //JDBC TEMPLATE DELETE EXAMPLE public boolean deleteUSER(int iduser) { System.out.println("JDBCExample: deleteUSER called"); final String DELETE_SQL = "DELETE FROM USER WHERE IDUSER LIKE ?"; int result = jdbcTemplate.update(DELETE_SQL,new Object[]{iduser}); System.out.println("r" + result); if (result > 0) { System.out.println("User is deleted: " + iduser); return true; } else { return false; } } //JDBC TEMPLATE UPDATE EXAMPLE public boolean updateUserEnable(User u, boolean enable) { System.out.println("JDBCExample: updateUserEnable called"); final String UPDATE_SQL = "UPDATE USER SET ENABLED = ? WHERE USERNAME = ?"; int result = jdbcTemplate.update(UPDATE_SQL,new Object[]{enable, u.getUsername()}); if (result > 0) { System.out.println("User is updated: " + u.getUsername()); return true; } else { return false; } } } |
Здесь нужно обратить внимание на начало класса и использование JdbcTemplate, в конструктор которому передается dataSource, который мы указали в файле конфигурации. С помощью jdbcTemplate можно выполнять CRUD (вставка, обновление, удаление) операции.
Классы User и DBLog — сущности для тестовых данных из test-data.sql. Достаточно тривиальны.
User:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package ru.javastudy.mvcHtml5Angular.mvc.bean; /** * Created for JavaStudy.ru on 25.02.2016. */ public class User { private int idUser; private String username; private String password; private boolean enabled; public int getIdUser() { return idUser; } public void setIdUser(int idUser) { this.idUser = idUser; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } } |
DBLog (аннотация XMLElement здесь не нужна и осталась из полного проекта. Будет использоваться в статьях по XML, JSON):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package ru.javastudy.mvcHtml5Angular.mvc.bean; import javax.xml.bind.annotation.XmlElement; import java.io.Serializable; /** * Created for JavaStudy.ru on 26.02.2016. */ public class DBLog implements Serializable { private static final long serialVersionUID = 1L; private int IDLOG; private String LOGSTRING; public DBLog() { } public DBLog (int idLog, String logString) { this.IDLOG = idLog; this.LOGSTRING = logString; } public int getIDLOG() { return IDLOG; } @XmlElement public void setIDLOG(int iDLOG) { IDLOG = iDLOG; } public String getLOGSTRING() { return LOGSTRING; } @XmlElement public void setLOGSTRING(String lOGSTRING) { LOGSTRING = lOGSTRING; } } |
7. JSP страница
Создана, использующая шаблон (пояснение в статье по загрузке файлов и создания pdf документов), страница.
jdbc.jsp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="page" tagdir="/WEB-INF/tags" %> <page:template> <jsp:body> <c:url value="/jdbcQueryAllUsers" var="jdbcQueryAllUsers" /> <c:url value="/jdbcInsert" var="jdbcInsert" /> <c:url value="/jdbcSelectLogs" var="jdbcSelectLogs" /> <c:url value="/jdbcDelete" var="jdbcDelete" /> <c:url value="/jdbcUpdate" var="jdbcUpdate" /> <!-- Page Content --> <div class="container"> <!-- Page Heading/Breadcrumbs --> <div class="row"> <div class="col-lg-12"> <h1 class="page-header">JDBC в Spring <small>JDBCTemplate</small> </h1> <ol class="breadcrumb"> <li><a href="index.html">Home</a> </li> <li class="active">JDBC sidebar page</li> </ol> </div> </div> <!-- /.row --> <!-- Content Row --> <div class="row"> <!-- Sidebar Column --> <div class="col-md-3"> <div class="list-group"> <a href="index.html" class="list-group-item">Home</a> <a href="${jdbcQueryAllUsers}" class="list-group-item">get all users</a> <a href="${jdbcInsert}/logstring/jdbcTestLogString" class="list-group-item">Jdbc insert</a> <a href="${jdbcSelectLogs}" class="list-group-item">Select all Logs</a> <a href="${jdbcDelete}/user/8" class="list-group-item">Delete User</a> <a href="${jdbcUpdate}/user/username/user@javastudy.ru/enabled/false" class="list-group-item">Update User</a> </div> </div> <!-- Content Column --> <div class="col-md-9"> <c:if test="${not empty resultObject}"> Result: <c:if test="${resultObject == 'true'}"> <font color="green"><b>${resultObject}</b></font> </c:if> <c:if test="${resultObject == 'false'}"> <font color="red"><b>${resultObject}</b></font> </c:if> <c:if test="${resultObject !='true' and resultObject != 'false'}"> <p>${resultObject}</p> </c:if> </c:if> </div> </div> <!-- /.row --> <hr> </div> <!-- /.container --> </jsp:body> </page:template> |
В меню слева прописаны ссылки, по которым будет срабатывать JDBCController. Справа получим результаты:
Исходные коды
MVC_AngularJS_Html5 full project — полный проект Spring MVC + AngularJS + Bootstrap + HTML5.
3. MVC Jdbc example — код для этой статьи (внутри sql скрипты).
Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
16
6 thoughts on “Spring MVC и JDBC (Spring JDBC example). Подключение и настройка JDBC datasource, пример работы с JDBC в Spring”
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
Добрый день,
Не работает jdbc.html
Впрочем как и все файлы на базе tag template.
Пустая страница открывается, без ошибок, но пустая…
Проверил исходник в конце статьи. Работает как и должно. Возможно у вас что-либо не подключено.
Вопрос по ходу: зачем в jsp странице указывать <!DOCTYPE html>?
Указывает тип текущего документа страницы. Он может быть разный и для нормальной работы желательно указывать необходимый тип для вашей страницы.
Смотрел в других примерах, говорилось не указывать ))
Исходники скачал, действительно все работает…
Набирал сам, с экрана, все индентично, по строчкам проверял — не запускается (
Кстати, index.jsp отличается от того, что в тексте описан…
Добрый день, за уроки спасибо, есть пару замечаний по коду:
в jdbc.jsp на 62 стоке уберите лишний закрывающий тег </form>
вместо такой записи <font color=«green»><b>${resultObject}</b></font> лучше использовать стили, хотя бы хардкодно <span style=«color: green; font-weight: bold;»>${resultObject}</span> , это отношения к джаве и вообще к теме не имеет никакого, но было бы правильнее делать именно так.