Springboot集成jdbcTemplate过程解析
一说明
实际工作中其实很少会用到jdbcTemplate去操作数据库,因为其使用方式不是很灵活,sql的拼接能力不强;实际上jdbcTemplate是属于spring自带的数据层模板,在spring中可以说是比较失败的一个案例,原因是当代流行mybatis当做持久层访问数据库,其优越的sql拼接能力、动态sql、半自动化映射、和易于sql优化的特性,深受广大互联网公司的喜爱,并且mybatis的市场占有率不断的上升,hibernate的市场不断缩水,可以说hibernate已经这种强映射关系的持久层模型已经走到互联网时代的尽头了。
本文写jdbcTemplate只是当作大家的一个入门学习,可以说以后你很难用到这门技术,所以不会深入研究,有兴趣的朋友可以专栏我其他关于springboot的集成系列。本次演示使用jdk1.8,mysql5.6,springboot2.1。
二数据库建表和实体
user表,里面有三个属性用户id、用户名和电话号码。
CREATETABLE`user`( `id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'用户id', `name`varchar(255)DEFAULTNULLCOMMENT'用户名', `telephone`varchar(255)DEFAULTNULLCOMMENT'用户电话', PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;
user表对应的实体:
/** *@Authorlsc *@Descriptionpojo
*@Date2019/11/210:16 */ publicclassUser{ //id privateLongid; //姓名 privateStringname; //电话 privateStringtelephone; //省略setget }
三dao层
对于使用jdbcTemplate,我们的dao层需要接口定义crud操作方法,其实现类则进行具体的sql操作,很多开发人员没有这种解耦的思想,往往就直接在servic层操作sql,可以说没有完整的一个知识体系,往往会造成后期维护困难,项目无法进行下去;
3.1dao接口
/** *@Authorlsc *@Descriptionuserdao接口
*@Date2019/11/210:19 */ publicinterfaceUserDao{ //添加 intaddUser(Useruser); //改 intupdateUser(Useruser); //删 intdeleteUser(Longid); //通过id查询 UserfindUserbyId(Longid); }
3.2dao层实现类
dao层的实现类才是具体操作sql的地方。
/** *@Authorlsc *@Descriptionuser持久层
*@Date2019/11/210:22 */ @Repository publicclassUserDaoImplimplementsUserDao{ //注入jdbc模板 @Autowired privateJdbcTemplatejdbcTemplate; @Override publicintaddUser(Useruser){ //sql Stringsql="insertintouser(name,telephone)values(?,?)"; //jdbcinsert returnjdbcTemplate.update(sql,user.getName(),user.getTelephone()); } @Override publicintupdateUser(Useruser){ //sql Stringsql="updateusersetname=?,telephone=?whereid=?"; //jdbcupdae returnjdbcTemplate.update(sql,user.getName(),user.getTelephone(),user.getId()); } @Override publicintdeleteUser(Longid){ //sql Stringsql="deletefromuserwhereid=?"; //delete returnjdbcTemplate.update(sql,id); } @Override publicUserfindUserbyId(Longid){ //sql Stringsql="select*fromuserwhereid=?"; //params Object[]params=newObject[]{id}; //rowMapper BeanPropertyRowMapperrowMapper=newBeanPropertyRowMapper(User.class); //jdbcquery Listquery=jdbcTemplate.query(sql,params,rowMapper); //returnuser returnquery.get(0); } }
四service层
4.1service层接口
service层接口定义业务的方法,提供给控制层调用。
publicinterfaceUserService{ //添加 intaddUser(Useruser); //改 intupdateUser(Useruser); //删 intdeleteUser(Longid); //通过id查询 UserfindUserbyId(Longid); }
4.2service层实现类
service层的实现类才是具体写业务逻辑代码的地方。
/** *@Authorlsc *@Descriptionuserservice
*@Date2019/11/210:37 */ @Service publicclassUserServiceImplimplementsUserService{ @Autowired UserDaouserDao; @Override publicintaddUser(Useruser){ returnuserDao.addUser(user); } @Override publicintupdateUser(Useruser){ returnuserDao.updateUser(user); } @Override publicintdeleteUser(Longid){ returnuserDao.deleteUser(id); } @Override publicUserfindUserbyId(Longid){ returnuserDao.findUserbyId(id); } }
五controller
这是一个简单的restful层的api,实现crud功能。
/** *@Authorlsc *@Descriptionuser控制层
*@Date2019/11/210:43 */ @RestController publicclassUserController{ @Autowired UserServiceuserService; //查询user @GetMapping("user/{id}") publicUsergetUser(@PathVariableLongid){ returnuserService.findUserbyId(id); } //添加user @PostMapping("user") publicintaddUser(@RequestBodyUseruser){ returnuserService.addUser(user); } //修改user @PutMapping("user/{id}") publicintupdateUser(@PathVariableLongid,@RequestBodyUseruser){ user.setId(id); returnuserService.updateUser(user); } //删除user @DeleteMapping("user/{id}") publicintdeleteUser(@PathVariableLongid){ returnuserService.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接口进行测试,具体的代码如下:
/** *@Authorlsc *@Description实现springbean生命周期接口
*@Date2019/11/210:08 */ @Component publicclassDatabaseVisionimplementsApplicationContextAware{ ApplicationContextapplicationContext=null; //springioc初始化bean的时候调用 @Override publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{ //获得applicationContext this.applicationContext=applicationContext; //获得dataSource DataSourcedataSource=applicationContext.getBean(DataSource.class); //启动springbootapplicationprintcom.alibaba.druid.pool.DruidDataSource System.out.println(dataSource.getClass().getName()); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。