SpringBoot之旅第五篇-数据访问
一、引言
用spring开发时我们常用的orm框架有jdbc、mybatis,hibernate,现在最常用的应该是mybatis。
在springboot中对于数据访问层,无论是sql还是nosql,都默认采用整合spring data的方式进行统一处理,springboot会帮我们添加大量自动配置,屏蔽了很多设置。并引入各种xxxtemplate,xxxrepository来简化我们对数据访问层的操作。对我们来说只需要进行简单的设置即可。这篇就来学习springboot整合jdbc,mybatis、jpa。
我们需要用什么数据访问,就引入相关的start进行开发。
二、
jdbc是我们最先学习的一个数据库框架,springboot也进行了相应整合.
<!--jdbc --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-jdbc</artifactid> </dependency> <!--mysql 驱动--> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <scope>runtime</scope> </dependency>
2.2、
@autowired private datasource datasource; @test public void test() throws sqlexception { system.out.println(datasource.getclass()); connection connection = datasource.getconnection(); system.out.println(connection); connection.close(); }
输出为:com.zaxxer.hikari.hikaridatasource
说明默认数据源是com.zaxxer.hikari.hikaridatasource,而在springboot 2.0之前为org.apache.tomcat.jdbc.pool.datasource。我们也可以通过改变spring.datasource.type 属性来更改我们想自定义的数据源。数据源的相关配置都在datasourceproperties,我们可以参考这个类进行配置。
2.3、
datasourceinitializer这里面有两个方法runschemascripts()可以运行建表语句,rundatascripts()可以运行插入数据的sql语句。
默认使用schema-.sql创建建表语句,用data-
spring: datasource: schema: - classpath:department.sql
2.4、
@autowired jdbctemplate jdbctemplate; @test public void jdbctest(){ list<map<string, object>> maplist = jdbctemplate.queryforlist("select * from user "); system.out.println(maplist.get(0)); }
结果:{id=1, username=王五, birthday=null, sex=2, address=null}
三、
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupid>com.alibaba</groupid> <artifactid>druid</artifactid> <version>1.1.16</version> </dependency>
druid的常用配置如下:
type: com.alibaba.druid.pool.druiddatasource # 数据源其他配置 initialsize: 5 minidle: 5 maxactive: 20 maxwait: 60000 timebetweenevictionrunsmillis: 60000 minevictableidletimemillis: 300000 validationquery: select 1 from dual testwhileidle: true testonborrow: false testonreturn: false poolpreparedstatements: true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,log4j maxpoolpreparedstatementperconnectionsize: 20 useglobaldatasourcestat: true connectionproperties: druid.stat.mergesql=true;druid.stat.slowsqlmillis=500
配置之后不会立刻生效,我们还需要编写配置类:
@configuration public class druidconfig { @configurationproperties(prefix = "spring.datasource") @bean public datasource druid(){ return new druiddatasource(); } }
再次运行上面查询数据源的方法,可以得到如下结果:
注:必须引入日志依赖,否则会报错
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version>1.2.17</version> </dependency>
我们在加上druid的监控配置:
//配置druid的监控 //1、配置一个管理后台的servlet @bean public servletregistrationbean statviewservlet(){ servletregistrationbean bean = new servletregistrationbean(new statviewservlet(), "/druid/*"); map<string,string> initparams = new hashmap<>(); initparams.put("loginusername","admin"); initparams.put("loginpassword","123456"); initparams.put("allow","");//默认就是允许所有访问 initparams.put("deny","192.168.15.21"); bean.setinitparameters(initparams); return bean; } //2、配置一个web监控的filter @bean public filterregistrationbean webstatfilter(){ filterregistrationbean bean = new filterregistrationbean(); bean.setfilter(new webstatfilter()); map<string,string> initparams = new hashmap<>(); initparams.put("exclusions","*.js,*.css,/druid/*"); bean.setinitparameters(initparams); bean.seturlpatterns(arrays.aslist("/*")); return bean; }
这样我们可以直接通过后台监控数据源访问情况。
四、
<dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <version>1.3.1</version> </dependency>
也导入druid数据源,并加入之前学习mybatis时用到的实体,而后就可以进行测试,mybatis的使用也有两种方法,注解版和配置文件版,注解版用的很少,一般都是配置文件。
4.1、
@mapper public interface departmentmapper { @select("select * from department where id=#{id}") department getdeptbyid(integer id); @delete("delete from department where id=#{id}") int deletedeptbyid(integer id); @options(usegeneratedkeys = true,keyproperty = "id") @insert("insert into department(departmentname) values(#{departmentname})") int insertdept(department department); @update("update department set departmentname=#{departmentname} where id=#{id}") int updatedept(department department); }
测试:
@autowired usermapper usermapper; @autowired departmentmapper departmentmapper; @test public void mybatistest(){ department deptbyid = departmentmapper.getdeptbyid(1); system.out.println(deptbyid); }
结果:department(id=1, departmentname=aa)
4.2、
@mapper public interface usermapper { user queryuserbyid(integer id); }
然后新增一个全局配置文件:sqlmapconfig.xml
<?xml version="1.0" encoding="utf-8" ?> <!doctype configuration public "-//mybatis.org//dtd config 3.0//en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
里面暂时什么配置都不需要,然后再引入相应的xxxmapper.xml文件,最后在配置文件中加上扫描文件配置即可
mybatis: config-location: classpath:mybatis/sqlmapconfig.xml mapper-locations: classpath:mybatis/mapper/*.xml
usermapper.xml内容:
<?xml version="1.0" encoding="utf-8" ?> <!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.yuanqinnan.mapper.usermapper"> <select id="queryuserbyid" parametertype="int" resulttype="com.yuanqinnan.model.user"> select * from `user`where id=#{id} </select> </mapper>
测试:
@test public void mybatistest(){ department deptbyid = departmentmapper.getdeptbyid(1); system.out.println(deptbyid); user userbyid = usermapper.queryuserbyid(1); system.out.println(userbyid); }
mybatis的配置就是这么简单,基本不需要额外配置。
五、
jdbc和mybatis我们之前都学习过,springboot只不过是帮我们整合配置,而jpa我们之前没有接触过,所以还是要先解释下,了解jpa之前我们先了解spring data:
spring data 项目的目的是为了简化构建基于spring 框架应用的数据访问技术,包括非关系数据库、map-reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。
spring data 主要特点是:
springdata为我们提供使用统一的api来对数据访问层进行操作;这主要是spring data commons项目来实现的。spring data commons让我们在使用关系型或者非关系型数据访问技术时都基于spring提供的统一标准,标准包含了crud(创建、获取、更新、删除)、查询、排序和分页的相关操作。
springdata帮我们封装了数据库操作,我们只需要进程接口,就可以进行操作,springdata有如下统一的接口
repository<t, id extends serializable>:统一接口 revisionrepository<t, id extends serializable, n extends number & comparable<n>>:基于乐观锁机制 crudrepository<t, id extends serializable>:基本crud操作 pagingandsortingrepository<t, id extends serializable>:基本crud及分页
我们要使用jpa,就是继承jparepository,我们只要按照它的命名规范去对命名接口,便可以实现数据库操作功能,这样说有些抽象,还是用一个例子来说明:
第一步:引入依赖
<!-- springdata jpa依赖 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-jpa</artifactid> </dependency>
第二步:编写表对应实体:
//使用jpa注解配置映射关系 @entity //告诉jpa这是一个实体类(和数据表映射的类) @table(name = "order") //@table来指定和哪个数据表对应;order; @data public class order { @id //这是一个主键 @generatedvalue(strategy = generationtype.identity)//自增主键 private integer id; @column(name = "user_id") private integer userid; //这是和数据表对应的一个列 @column(name="number",length = 32) private string number; // 订单创建时间,省略默认列名就是属性名 private date createtime; // 备注 private string note; }
第三步:编写仓库接口:
@repository public interface orderrepository extends jparepository<order, integer> { }
这个时候orderrepository 已经有了很多实现好的方法,我们只要跟着调用即可
测试:
@autowired orderrepository orderrepository; @test public void jpatest(){ list<order> all = orderrepository.findall(); system.out.println(all); }
一个简单的jpa实现完成,当然jpa的内容很多,这里只是一个非常简单的例子,要进一步的学习的话还是要去看官方文档。