Springboot集成jdbcTemplate过程解析

网友投稿 306 2022-12-08


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

pojo

* @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

user dao 接口

* @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

user 持久层

* @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 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层实现类

servichttp://e层的实现类才是具体写业务逻辑代码的地方。

/**

* @Author lsc

* @Description

user service

* @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

user 控制层

* @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放在最后面了

org.springframework.boot

spring-boot-starter-parent

2.1.1.RELEASE

org.springframework.boot

spring-boot-starter-jdbc

mysql

mysql-connector-java

com.alibaba

druid

1.1.15

org.springframework.boot

spring-boot-starter-web

八 测试工具说明

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

九 测试链接池说明

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

/**

* @Author lsc

* @Description

实现spring bean 生命周期接口

* @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());

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springboot跨域CORS处理实现原理
下一篇:Mybatis自定义typeHandle过程解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~