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    删除数据

posted @ 2020-01-02 08:05  笪笠  阅读(166)  评论(0编辑  收藏  举报