javaweb各种框架组合案例(七):springboot+jdbcTemplete+通用dao+restful

一、介绍

1.springboot是spring项目的总结+整合

  当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之间还会出现冲突,让你的项目出现难以解决的问题。基于这种情况,springboot横空出世,在考虑到Struts控制层框架有漏洞,springboot放弃(大多数企业同样如此)了Struts,转而代之是springMVC,不过,springboot是自动集成springMVC的,不需要任何配置,不需要任何依赖,直接使用各种控制层注解。springboot是springcloud的基础,是开启微服务时代的钥匙。

二、新建springboot工程

1. 使用idea2019新建project,选择spring Initializr,next

2. 填写坐标信息,next

3. Developer Tools选择Lombok, Web选择Spring Web Starter,SQL选择JDBC API、MySQL Driver,next

lombok是为了省去实体类中getter/setter方法,使之在运行时动态添加getter/setter

4. 填写项目名已经存放位置,finish

三、项目构建

1. 数据库准备(两张表,分别是user用户表和phone手机表,且是一对多关系)

create database ssdj;

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE TABLE `phone` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brand` varchar(255) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_8t3jhwmmlxpq3qcwcy1a3alts` (`user_id`),
  CONSTRAINT `FK_8t3jhwmmlxpq3qcwcy1a3alts` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

insert into user(username,password) values(1001,123);

insert into phone(brand,user_id) values (‘华为‘,1),(‘iphone‘,1);

2. pom.xml(不用动,默认)

3. 配置文件

  application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssdj?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=root

  数据库连接要添加时区,否则可能会报错

4.项目包结构

  分成util、core、entity、dao、service、controller等结构包

5. 需要一个SqlFactory工具类来制造动态SQL语句

package club.xcreeper.springboot_jdbctemplete.util;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SqlFactory {

    private String tableName;

    public Object[] params;

    public SqlFactory(Class<?> clazz) {
        tableName = clazz.getSimpleName().toLowerCase();
    }

    private final static Logger logger = LoggerFactory.getLogger(SqlFactory.class);

    private Map<String,Object> objectToMap(Object entity) {
        Field[] fields = entity.getClass().getDeclaredFields();
        Map<String,Object> map = new HashMap<String,Object>();
        for(Field field : fields) {
            field.setAccessible(true);//允许访问属性
            Object value = null;
            try {
                value = field.get(entity);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
            if(value != null) {
                map.put(field.getName(), value);
            }
        }
        return map;
    }

    public String getDeleteSql() {
        StringBuilder sql = new StringBuilder("delete from ").append(tableName).append(" where id = ?");
        logger.info(sql.toString());
        return sql.toString();
    }

    public String getSelectOneSql() {
        StringBuilder sql = new StringBuilder("select * from ").append(tableName).append(" where id = ?");
        logger.info(sql.toString());
        return sql.toString();
    }

    public String getInsertSql(Object entity) {
        Map<String,Object> map = this.objectToMap(entity);
        map.remove("id");
        params = new Object[map.size()];
        StringBuilder stringBuiler = new StringBuilder("insert into ").append(tableName).append("(");
        for(String key : map.keySet()) {
            stringBuiler.append(key).append(",");
        }
        stringBuiler.deleteCharAt(stringBuiler.length()-1).append(") values (");
        int i = 0;
        for(String key : map.keySet()) {
            stringBuiler.append("?,");
            params[i] = map.get(key);
            i++;
        }
        stringBuiler.deleteCharAt(stringBuiler.length()-1).append(")");
        map = null;
        logger.info(stringBuiler.toString());
        return stringBuiler.toString();
    }

    public String getUpdateSql(Object entity) {
        Map<String,Object> map = this.objectToMap(entity);
        params = new Object[map.size()];
        params[params.length-1] = map.remove("id");
        StringBuilder stringBuiler = new StringBuilder("update ").append(tableName).append(" set ");
        int i = 0;
        for(String key : map.keySet()) {
            stringBuiler.append(key).append("=?,");
            params[i] = map.get(key);
            i++;
        }
        stringBuiler.deleteCharAt(stringBuiler.length()-1).append(" where id = ?");
        map = null;
        logger.info(stringBuiler.toString());
        return stringBuiler.toString();
    }

    public String getSelectList(Object entity) {
        Map<String,Object> map = this.objectToMap(entity);
        map.remove("id");
        params = new Object[map.size()];
        StringBuilder stringBuiler = new StringBuilder("select * from ").append(tableName).append(" where ");
        int i = 0;
        for(String key : map.keySet()) {
            stringBuiler.append(key).append("=? and ");
            params[i] = map.get(key);
            i++;
        }
        stringBuiler.delete(stringBuiler.length()-4, stringBuiler.length());
        map = null;
        logger.info(stringBuiler.toString());
        return stringBuiler.toString();
    }
}

SqlFactory

6.需要有一个通用的Dao接口及实现类来完成核心操作

package club.xcreeper.springboot_jdbctemplete.Core.dao;

import java.io.Serializable;
import java.util.List;

public interface CoreDao<T> {
    int insert(T t);
    int delete(Serializable id);
    int update(T t);
    T getOne(Serializable id);
    List<T> getList(T t);
}

CoreDao

package club.xcreeper.springboot_jdbctemplete.Core.dao.impl;

import club.xcreeper.springboot_jdbctemplete.Core.dao.CoreDao;
import club.xcreeper.springboot_jdbctemplete.util.SqlFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

public class CoreDaoImpl<T> implements CoreDao<T> {

    private Class<T> clazz;

    private SqlFactory sqlFactory;

    @SuppressWarnings("unchecked")
    public CoreDaoImpl() {
        this.clazz =  (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        sqlFactory = new SqlFactory(this.clazz);
    }

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int insert(T t) {
        return jdbcTemplate.update(sqlFactory.getInsertSql(t),sqlFactory.params);
    }

    @Override
    public int delete(Serializable id) {
        return jdbcTemplate.update(sqlFactory.getDeleteSql(),id);
    }

    @Override
    public int update(T t) {
        return jdbcTemplate.update(sqlFactory.getUpdateSql(t),sqlFactory.params);
    }

    @Override
    public T getOne(Serializable id) {
        return jdbcTemplate.queryForObject(sqlFactory.getSelectOneSql(),new BeanPropertyRowMapper<T>(this.clazz),id);

    }

    @Override
    public List<T> getList(T t) {
        return jdbcTemplate.query(sqlFactory.getSelectList(t),new BeanPropertyRowMapper<T>(this.clazz),sqlFactory.params);
    }
}

CoreDaoImpl

7. 实体类

package club.xcreeper.springboot_jdbctemplete.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@ToString
public class User {
    @Setter
    @Getter
    private Integer id;
    @Setter
    @Getter
    private String username;
    @Setter
    @Getter
    private String password;
}

User

package club.xcreeper.springboot_jdbctemplete.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@ToString
public class Phone {
    @[email protected]
    private Integer id;
    @[email protected]
    private String brand;
    @[email protected]
    private Integer user_id;
}

Phone

8. dao接口及其实现,只需继承核心dao即可

package club.xcreeper.springboot_jdbctemplete.dao;

import club.xcreeper.springboot_jdbctemplete.Core.dao.CoreDao;
import club.xcreeper.springboot_jdbctemplete.entity.User;

public interface UserDao extends CoreDao<User> {

}

UserDao

package club.xcreeper.springboot_jdbctemplete.dao;

import club.xcreeper.springboot_jdbctemplete.Core.dao.CoreDao;
import club.xcreeper.springboot_jdbctemplete.entity.Phone;

public interface PhoneDao extends CoreDao<Phone> {

}

PhoneDao

package club.xcreeper.springboot_jdbctemplete.dao.impl;

import club.xcreeper.springboot_jdbctemplete.Core.dao.impl.CoreDaoImpl;
import club.xcreeper.springboot_jdbctemplete.dao.UserDao;
import club.xcreeper.springboot_jdbctemplete.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl extends CoreDaoImpl<User> implements UserDao {
}

UserDaoImpl

package club.xcreeper.springboot_jdbctemplete.dao.impl;

import club.xcreeper.springboot_jdbctemplete.Core.dao.impl.CoreDaoImpl;
import club.xcreeper.springboot_jdbctemplete.dao.PhoneDao;
import club.xcreeper.springboot_jdbctemplete.entity.Phone;
import org.springframework.stereotype.Repository;

@Repository
public class PhoneDaoImpl extends CoreDaoImpl<Phone> implements PhoneDao {
}

PhoneDaoImpl

9. service接口及其实现

package club.xcreeper.springboot_jdbctemplete.service;

import club.xcreeper.springboot_jdbctemplete.entity.User;

import java.util.List;

public interface UserService {
    int insert(User user);
    int delete(int id);
    int update(User user);
    User getOne(int id);
    List<User> getList(User user);
}

UserService

package club.xcreeper.springboot_jdbctemplete.service;

import club.xcreeper.springboot_jdbctemplete.entity.Phone;

import java.util.List;

public interface PhoneService {
    int insert(Phone phone);
    int delete(int id);
    int update(Phone phone);
    Phone getOne(int id);
    List<Phone> getList(Phone phone);
}

PhoneService

package club.xcreeper.springboot_jdbctemplete.service.impl;

import club.xcreeper.springboot_jdbctemplete.dao.UserDao;
import club.xcreeper.springboot_jdbctemplete.entity.User;
import club.xcreeper.springboot_jdbctemplete.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public int insert(User user) {
        return userDao.insert(user);
    }

    @Override
    public int delete(int id) {
        return userDao.delete(id);
    }

    @Override
    public int update(User user) {
        return userDao.update(user);
    }

    @Override
    public User getOne(int id) {
        return userDao.getOne(id);
    }

    @Override
    public List<User> getList(User user) {
        return userDao.getList(user);
    }
}

UserServiceImpl

package club.xcreeper.springboot_jdbctemplete.service.impl;

import club.xcreeper.springboot_jdbctemplete.dao.PhoneDao;
import club.xcreeper.springboot_jdbctemplete.entity.Phone;
import club.xcreeper.springboot_jdbctemplete.service.PhoneService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PhoneServiceImpl implements PhoneService {

    @Autowired
    private PhoneDao phoneDao;

    @Override
    public int insert(Phone phone) {
        return phoneDao.insert(phone);
    }

    @Override
    public int delete(int id) {
        return phoneDao.delete(id);
    }

    @Override
    public int update(Phone phone) {
        return phoneDao.update(phone);
    }

    @Override
    public Phone getOne(int id) {
        return phoneDao.getOne(id);
    }

    @Override
    public List<Phone> getList(Phone phone) {
        return phoneDao.getList(phone);
    }
}

PhoneServiceImpl

10. controller

package club.xcreeper.springboot_jdbctemplete.controller;

import club.xcreeper.springboot_jdbctemplete.entity.User;
import club.xcreeper.springboot_jdbctemplete.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping(value = "/{id}")
    public User getOne(@PathVariable int id) {
        return userService.getOne(id);
    }

    @GetMapping(params = {"username","password","username!=","password!="})
    public List<User> getList(User user) {
        return userService.getList(user);
    }

}

UserController

11. 启动项目,并用postman测试接口

原文地址:https://www.cnblogs.com/xiaogblog/p/11134938.html

时间: 2024-10-09 22:07:40

javaweb各种框架组合案例(七):springboot+jdbcTemplete+通用dao+restful的相关文章

个人对JAVA的SSH三大框架组合的偏见

多数人JavaWeb的入门是学习SSH:struts+spring+hibernate:我在十年前(2006年)学习的,那时火的是struts1.x ,struts2还没诞生. 这三个框架组合,我用了大概有5年时间.现在回想起来,用这三大框架做项目真是痛苦不堪:但那时也没别的选择,一律的MVC框架:相比纯Servlet与JSP已经是有很大的进步 所谓的痛苦主要来源于控制层,视图,及数据查询.在3年前我就不再采用struts与hibernate框架,有很多功能用不上,因为都只是做小项目,数据表基本

微信营销案例七 基于LBS营销

案例七:凯迪拉克 基于Lbs营销 播报路况已经不新鲜,交通广播已经霸占这个领域许多年,凯迪拉克在其微信中推出“66号公路”的活动,对路况信息实时播报,更新及时为当地出行的人提供服务,尽管是在交通广播的眼皮下抢生意,但好在凯迪拉克的路况播报仅限66号公路,这也是其优点,只针对一条路况信息的播报,避免范围大而出现信息不及时的情况. 微信营销案例七 基于LBS营销,布布扣,bubuko.com

ENode框架Conference案例转载

ENode框架Conference案例分析系列之 - Quick Start 前言 前一篇文章介绍了Conference案例的架构设计,本篇文章开始介绍Conference案例的代码实现.由于代码比较多,一开始就全部介绍所有细节,估计很多人接受不了,也理解不了.所以,我先进行一次QuickStart的介绍,即选取某个简单典型的场景从前到后过一下每个环节.这样大家就能够快速对代码的重要关键环节有大概的理解.另外,我现在正在做ENode的官网,到时会像axon framework一样,介绍ENode

ENode框架Conference案例分析系列之 - 文章索引

ENode框架Conference案例分析系列之 - 业务简介 ENode框架Conference案例分析系列之 - 上下文划分和领域建模 ENode框架Conference案例分析系列之 - 架构设计 ENode框架Conference案例分析系列之 - Quick Start ENode框架Conference案例分析系列之 - 复杂情况的读库更新设计

javaweb三大框架和MVC设计模式

javaweb三大框架和MVC设计模式 转载,原文请见https://blog.csdn.net/sunpeng19960715/article/details/50890705 一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller),即为MVC.它是一种软件设计的典范,最早为Trygve Reenskaug提出,为

springMVC设计模式和javaWeb三层框架

一.springMVC  设计模式 MVC模式是软件工程中的一种能够软件架构模式,把软件分为三个基本部分,模型(model).视图(view)和控制器(controller).使程序简化,更加直观. 控制器(controller):对请求进行处理,负责请求转发 视图(view):界面设计人员进行图形界面设计 模型(model):程序编写程序应用的功能.数据库管理 二.javaWeb三层框架 表述层:(WEB层).业务逻辑层(Business Logic),数据访问层(Data  Access)

七、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法

@NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口 1.通用接口: import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.N

SpringBoot使用Swagger2实现Restful API

很多时候,我们需要创建一个接口项目用来数据调转,其中不包含任何业务逻辑,比如我们公司.这时我们就需要实现一个具有Restful API的接口项目. 本文介绍springboot使用swagger2实现Restful API. 本项目使用mysql+jpa+swagger2. 首先pom中加入swagger2,代码如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:

基于SpringBoot的通用化的第三方登陆实现

基于SpringBoot的通用化的第三方登陆实现 标签(空格分隔): 未分类 通俗的例子解释OAuth和OpenID的区别 现在很多网站都可以用第三方的账号登陆,比如,现在我要登录淘宝买东西,而如果我没有淘宝的账号,我也可以用微博的账号登录,这个微博账号就是第三方账号了. OpenID强调 验证 authentication,而OAuth强调 授权 authorization. 验证就是说"我"是不是(微博用户),而授权是说"淘宝"可不可以,而可不可以的前提则是&q