Spring in action读书笔记(八) Spring JDBC操作数据库示例
1、所需jar包
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <servletApiVersion>3.1.0</servletApiVersion> <springSecurityVersion>3.2.0.RELEASE</springSecurityVersion> <springVersion>4.0.7.RELEASE</springVersion> <thymeleafVersion>2.1.3.RELEASE</thymeleafVersion> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${springSecurityVersion}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${springSecurityVersion}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring4</artifactId> <version>${thymeleafVersion}</version> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity3</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servletApiVersion}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> </dependencies>
2、WEB应用配置类
package test; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import test.config.RootConfig; import test.config.WebConfig; public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{RootConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{WebConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
其中
RootConfig类
package test.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @Configuration @ComponentScan(basePackages = {"test"}, excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) }) public class RootConfig { }
WebConfig类
package test.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect; import org.thymeleaf.spring4.SpringTemplateEngine; import org.thymeleaf.spring4.view.ThymeleafViewResolver; import org.thymeleaf.templateresolver.ServletContextTemplateResolver; import org.thymeleaf.templateresolver.TemplateResolver; @Configuration @EnableWebMvc @ComponentScan("test") public class WebConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine); return viewResolver; } @Bean public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver); templateEngine.addDialect(new SpringSecurityDialect()); return templateEngine; } @Bean public TemplateResolver templateResolver() { TemplateResolver templateResolver = new ServletContextTemplateResolver(); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML5"); return templateResolver; } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/login").setViewName("login"); } }
3、定义实体类
Category.java
package test; public class Category { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Category{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
创建数据库
create database test; use test; CREATE TABLE category_ ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(30), PRIMARY KEY (id) ) DEFAULT CHARSET=UTF8;
定义增、删、改、查方法
package test; import org.springframework.stereotype.Component; @Component public interface CategoryService { void insert(Category category); void delete(int id); void update(Category category); Category get(int id); }
4、数据库设置,配置数据库连接url、用户名、密码等
package test.config; import com.mysql.cj.jdbc.Driver; import org.apache.commons.dbcp2.BasicDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; @Configuration public class DataConfig { @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean public DataSource dateSource() throws Exception { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriver(new Driver()); dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/test?userUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8"); dataSource.setUsername("root"); dataSource.setPassword("admin"); dataSource.setInitialSize(5); dataSource.setMaxTotal(10); return dataSource; } }
5、实现CaategoryService类中定义的增、删、改、查方法
package test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @Component public class CategoryServiceImpl implements CategoryService { @Override public void insert(Category category) { jdbcOperations.update("insert into category_ (name) values (?)", category.getName()); } @Override public void delete(int id) { jdbcOperations.execute(String.format("delete from category_ where id = %1$s", id)); } @Override public void update(Category category) { jdbcOperations.update("update category_ set name = ? where id = ?", category.getName(), category.getId()); } @Override public Category get(int id) { return jdbcOperations.queryForObject("select id, name from category_ where id = ?", new CategoryRowMapper(), id); } @Autowired private JdbcOperations jdbcOperations; private static final class CategoryRowMapper implements RowMapper<Category> { @Override public Category mapRow(ResultSet resultSet, int i) throws SQLException { String name = resultSet.getString("name"); int id = resultSet.getInt("id"); Category category = new Category(); category.setId(id); category.setName(name); return category; } } }
6、定义web接口并测试
package test.controller; 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.ResponseBody; import test.Category; import test.CategoryService; import static org.springframework.web.bind.annotation.RequestMethod.GET; @Controller @RequestMapping("/") public class HomeController { @Autowired private CategoryService categoryService; @RequestMapping(method = {GET}, value = "/insert") @ResponseBody public String add(String name) { if (name == null || name.length() == 0) { return "fail"; } try { Category student = new Category(); student.setName(name); categoryService.insert(student); return "success"; } catch (Exception e) { return "fail"; } } @ResponseBody @RequestMapping(method = GET, value = "/delete/{id}") public String delete(@PathVariable int id) { try { categoryService.delete(id); } catch (Exception e) { return "fail"; } return "success"; } @ResponseBody @RequestMapping(method = GET, value = "/update/{id}") public String update(@PathVariable int id, String name) { try { Category category = new Category(); category.setId(id); category.setName(name); categoryService.update(category); } catch (Exception e) { return "fail"; } return "success"; } @ResponseBody @RequestMapping(method = GET, value = "/query/{id}") public String get(@PathVariable int id) { try { return String.valueOf(categoryService.get(id)); } catch (Exception e) { return "fail"; } } }
http://localhost:8080/insert?name=A 插入数据
假设插入的数据id为10
http://localhost:8080/update/10?name=Bb 更新数据
http://localhost:8080/query/10 查询数据
http://localhost:8080/delete/10 删除数据