springboot-集成jdbcTemplate

# 一 说明

实际工作中其实很少会用到jdbcTemplate去操作数据库,因为其使用方式不是很灵活,sql的拼接能力不强;实际上jdbcTemplate是属于spring自带的数据层模板,在spring中可以说是比较失败的一个案例,原因是当代流行mybatis当做持久层访问数据库,其优越的sql拼接能力、动态sql、半自动化映射、和易于sql优化的特性,深受广大互联网公司的喜爱,并且mybatis的市场占有率不断的上升,hibernate的市场不断缩水,可以说hibernate已经这种强映射关系的持久层模型已经走到互联网时代的尽头了。本文写jdbcTemplate只是当作大家的一个入门学习,可以说以后你很难用到这门技术,所以不会深入研究,有兴趣的朋友可以专栏我其他关于springboot的集成系列。本次演示使用jdk1.8,mysql5.6,springboot2.1。​

二数据库建表和实体

user表,里面有三个属性 用户id、 用户名和电话号码。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `name` varchar(255) DEFAULT NULL COMMENT '用户名',
  `telephone` varchar(255) DEFAULT NULL COMMENT '用户电话',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

user表对应的实体:

/**
 * @Author lsc
 * @Description <p>pojo </p>
 * @Date 2019/11/2 10:16
 */
public class User {

    // id
    private Long id;
    // 姓名
    private String name;
    // 电话
    private String telephone;
    // 省略 set get
}

三 dao层

对于使用jdbcTemplate,我们的dao层需要接口定义crud操作方法,其实现类则进行具体的sql操作,很多开发人员没有这种解耦的思想,往往就直接在servic层操作sql,可以说没有完整的一个知识体系,往往会造成后期维护困难,项目无法进行下去;

3.1 dao接口

/**
 * @Author lsc
 * @Description <p> user dao 接口 </p>
 * @Date 2019/11/2 10:19
 */
public interface UserDao {

    // 添加
    int addUser(User user);
    // 改
    int updateUser(User user);
    // 删
    int deleteUser(Long id);
    // 通过id查询
    User findUserbyId(Long id);


}

3.2 dao层实现类

dao层的实现类才是具体操作sql的地方。

/**
 * @Author lsc
 * @Description <p> user 持久层 </p>
 * @Date 2019/11/2 10:22
 */
@Repository
public class UserDaoImpl implements UserDao {

    // 注入jdbc模板
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int addUser(User user) {
        // sql
        String sql = "insert into user (name,telephone) values (?,?)";
        // jdbc insert
        return jdbcTemplate.update(sql,user.getName(),user.getTelephone());
    }

    @Override
    public int updateUser(User user) {
        // sql
        String sql = "update user set name = ?, telephone = ? where id = ?";
        // jdbc updae
        return jdbcTemplate.update(sql,user.getName(),user.getTelephone(),user.getId());
    }

    @Override
    public int deleteUser(Long id) {
        // sql
        String sql = "delete from user where id = ?";
        // delete
        return jdbcTemplate.update(sql,id);
    }

    @Override
    public User findUserbyId(Long id) {
        // sql
        String sql = "select * from user where id = ?";
        // params
        Object[] params = new Object[]{id};
        // rowMapper
        BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper(User.class);
        // jdbc query
        List<User> query = jdbcTemplate.query(sql, params, rowMapper);
        // return user
        return query.get(0);
    }
}

四 service层

4.1 service层接口

service层接口定义业务的方法,提供给控制层调用。

public interface UserService {

    // 添加
    int addUser(User user);
    // 改
    int updateUser(User user);
    // 删
    int deleteUser(Long id);
    // 通过id查询
    User findUserbyId(Long id);
}

4.2 service层实现类

service层的实现类才是具体写业务逻辑代码的地方。

/**
 * @Author lsc
 * @Description <p> user service </p>
 * @Date 2019/11/2 10:37
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;

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

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

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

    @Override
    public User findUserbyId(Long id) {
        return userDao.findUserbyId(id) ;
    }
}

五 controller

这是一个简单的restful层的api,实现crud功能。

/**
 * @Author lsc
 * @Description <p>user 控制层 </p>
 * @Date 2019/11/2 10:43
 */
@RestController
public class UserController {

    @Autowired
    UserService userService;

    // 查询user
    @GetMapping("user/{id}")
    public User getUser(@PathVariable Long id){
        return userService.findUserbyId(id);
    }
    // 添加user
    @PostMapping("user")
    public int addUser(@RequestBody User user){
        return userService.addUser(user);
    }

    //修改 user
    @PutMapping("user/{id}")
    public int updateUser(@PathVariable Long id,@RequestBody User user){
        user.setId(id);
        return userService.updateUser(user);
    }

    // 删除user
    @DeleteMapping("user/{id}")
    public int deleteUser(@PathVariable Long id){
        return userService.deleteUser(id);
    }
}

六 配置文件

配置文件不使用properties的原因是yml文件的语法格式更加简练明了,在配置文件中的注解已经很详细,所以不会赘述。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver #数据库驱动
    url: jdbc:mysql://192.168.0.105:3306/springboot?useUnicode=true&characterEncoding=utf-8 #数据库地址
    username: root #数据库账号
    password: 123456 # 数据密码
    type: com.alibaba.druid.pool.DruidDataSource # 连接池类型
    druid:
      #初始化连接池的连接数量
      initial-size: 5
      # 最小
      min-idle: 5
      # 最大
      max-active: 20
      #配置获取连接等待超时的时间
      max-wait: 6000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 6000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 3000

七 pom.xml

很抱歉我把xml放在最后面了

	 <parent>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-parent</artifactId>
	        <version>2.1.1.RELEASE</version>
	        <relativePath/>
	    </parent>
	 <dependencies>
        <!-- jdbc 启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mysql 启动器 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.15</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- -->

    </dependencies>

八 测试工具说明

大家可以通过postman等开发工具进行restful风格接口测试,作为后端开发者,就别去写页面了。

九 测试链接池说明

如果大家想知道怎么测试连接池是否连接成功可以实现ApplicationContextAware接口进行测试,具体的代码如下:

/**
 * @Author lsc
 * @Description <p> 实现spring bean 生命周期接口</p>
 * @Date 2019/11/2 10:08
 */
@Component
public class DatabaseVision implements ApplicationContextAware {

    ApplicationContext applicationContext = null;
    // spring ioc 初始化 bean 的时候调用
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 获得applicationContext
        this.applicationContext = applicationContext;
        // 获得dataSource
        DataSource dataSource = applicationContext.getBean(DataSource.class);
        // 启动 springboot application print com.alibaba.druid.pool.DruidDataSource
        System.out.println(dataSource.getClass().getName());
    }
}

十 公众号源码

公众号关注一下,博主会同时更新博客和公众号的学习内容。源码在公众号对应文章的末尾。

在这里插入图片描述

posted @ 2019-12-26 14:56  知识追寻者  阅读(659)  评论(0编辑  收藏  举报