第6讲 Spring Boot访问SQL数据库_第1页
第6讲 Spring Boot访问SQL数据库_第2页
第6讲 Spring Boot访问SQL数据库_第3页
第6讲 Spring Boot访问SQL数据库_第4页
第6讲 Spring Boot访问SQL数据库_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5讲SpringBoot访问

SQL数据库fdteachers@163.com2JDBCTemplate就是Spring对JDBC的封装,目的是使JDBC更加易于使用。JDBCTemplate是Spring的一部分。JDBCTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。使用JdbcTemplate编程我们只需要做以下步骤:1)提供SQL语句和占位符的值2)得到封装好的查询结果集3JPA简介JavaPersistenceAPI(JPA)是一种基于ORM(Object-RelationalMapping)技术的JavaEE规范。它主要用于将Java对象映射到关系型数据库中,以便于对数据进行持久化操作。JPA主要由三个部分组成,分别是Entity、EntityManager和Query。其中Entity用于描述Java对象和数据库表之间的映射关系;EntityManager用于管理实体对象的生命周期和完成实体对象与数据库之间的操作;Query用于查询数据。JPA支持多种底层实现,如Hibernate、EclipseLink等。在使用时,只需要引入相应的实现框架即可。总结如下:JPA(JavaPersistenceAPI)是为JavaEE平台设计的一种ORM解决方案。JPA提供了一些标准的API以及关系映射的元数据,使得Java开发人员可以在没有具体SQL编程经验的情况下,通过简单的注解配置实现对数据的访问和操作。JPA提供了对事务的支持,允许Java开发人员进行基于POJO的开发,在运行时将这些POJO映射成关系数据库表和列,最大限度地减少了Java开发者与数据库的交互。4Jpa(JavaPersistenceAPI)是sun官方提出的java持久化规范它为java开发人员提供了一种对象/关联映射工具,来管理java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在hibernate、toplink、jdo等ORM框架各自为营的局面Jpa是一套规范,不是一套产品JPA并不是一种框架而是一种ORM规范567SpringDataJPA是SpringData项目家族中的一员它为基于Spring框架应用程序提供了更加便捷和强大的数据操作方式。89SpringDataJPA简介SpringDataJPA

isnotaJPAproviderbutisaspecificationSpringDataJPA提供了一些常用的接口SpringDataJPA是Spring基于ORM框架SpringDataJPA不是一个完整JPA规范的实现,它只是一个代码抽象层,主要用于减少为各种持久层存储实现数据访问层所需的代码量。其底层依旧是Hibernate可以把SpringDataJPA理解为JPA规范的再次封装抽象,对JPA规范的二次封装10111213JavaApplicationSpringDataJdbcTemplateSpringDataJPAMyBatisPlus数据层:OracleMySQLRedisSQLServerPostgreSQLJdbcTemplate适用于小型项目,开发速度快、代码简单,但不支持复杂的SQL语句,不支持面向对象的操作;JPA的设计理念是以对象为中心,提供更好的面向对象操作支持,但对开发人员的开发能力要求较高;MyBatis的设计理念是以SQL为中心,提供更高的灵活性和优异的性能,但需要开发人员熟悉SQL语言。第5章SpringBoot访问SQL数据库5.1

配置数据源5.2

使用JdbcTemplate5.3

使用SpringDataJPA5.4

整合MyBatis145.1配置数据源数据库分为两种,即关系型数据库和非关系型数据库。关系型数据库是指通过关系模型组织数据的数据库,并且可以利用外键等保持一致性,如MySQL、Oracle、SQLServer等;而非关系型数据库其实不像是数据库,更像是一种以key-value模式存储对象的结构,如Redis、MangoDB等。

SpringFramework为访问SQL数据库提供了广泛的支持。从直接使用JdbcTemplate进行JDBC访问到完全的对象关系映射(objectrelationalmapping)技术,比如Hibernate、Mybatis。SpringData提供了更多级别的功能,直接从接口创建的Repository实现,并使用了约定从方法名生成查询。本节讲解SpringBoot如何使用MySQL、SQLServer、Oracle等不同的关系型数据库。

155.1配置数据源1.使用MySQL数据库在SpringBoot中使用MySQL数据库,以MySQL8.0为例,在pom.xml文件中添加依赖,并在perties文件中配置数据源信息。(1)在pom.xml文件中添加MySQL依赖,代码如下所示。

(2)在perties配置文件中配置数据源信息,代码如下所示。16<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope></dependency>

#数据库驱动spring.datasource.driver-class-name=

com.mysql.cj.jdbc.Driver#数据库地址spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC#数据库用户名spring.datasource.username=root#数据库密码spring.datasource.password=1234565.1配置数据源2.使用SQLServer数据库

在SpringBoot中使用SQLServer数据库。(1)在pom.xml文件中添加SQLServer依赖,代码如下所示。

(2)在perties配置文件中配置数据源信息,代码如下所示。17<dependency>

<groupId>com.microsoft.sqlserver</groupId>

<artifactId>mssql-jdbc</artifactId>

<scope>runtime</scope></dependency>

spring.datasource.driver-class-name=

com.microsoft.sqlserver.jdbc.SQLServerDriverspring.datasource.url=jdbc:sqlserver://localhost:1433;DatabaseName=testspring.datasource.username=saspring.datasource.password=1234565.1配置数据源3.使用Oracle数据库在SpringBoot中使用Oracle数据库。(1)在pom.xml文件中添加Oracle依赖,代码如下所示。

(2)在perties配置文件中配置数据源信息,代码如下所示。18<dependency>

<groupId>com.oracle.database.jdbc</groupId>

<artifactId>ojdbc8</artifactId>

<scope>runtime</scope></dependency>

spring.datasource.driver-class-name=

oracle.jdbc.driver.OracleDriverspring.datasource.url=jdbc:oracle:thin:@localhost:1521:testspring.datasource.username=adminspring.datasource.password=1234565.2使用JdbcTemplate

JDBC(JavaDataBaseConnectivity)是用于连接数据库的规范,也就是用于执行数据库SQL语句的JavaAPI。JdbcTemplate是Spring对JDBC的封装,目的是让JDBC更加易于使用,替我们完成所有的JDBC底层工作。因此,对于数据库的操作,不再需要每次都进行连接、打开、关闭了。通过JdbcTemplate不需要进行全局修改,就可以轻松地应对开发人员常常要面对的增删改查的操作。更为关键的是,JdbcTemplate对象也是通过自动配置机制注册到Ioc容器中,自动化配置类是JdbcTemplateAutoConfiguration。在JdbcTemplate中,提供了大量的查询和更新数据库的方法,SpringJDBC就是使用这些方法来操作数据库的,使用JdbcTemplate类可实现对数据表的数据进行增删改查操作。195.2.1JdbcTemplate增删改的操作

update()方法可以完成增加、修改和删除操作,其常用方法具体介绍如下。intupdate(Stringsql):该方法是最简单的update方法重载形式,可以直接传入SQL语句并返回受影响的行数。intupdate(PreparedStatementCreatorpsc):该方法执行从PreparedStatementCreator返回的语句,然后返回受影响的行数。intupdate(Stringsql,PreparedStatementSetterpss):该方法通过PreparedStatementSetter设置SQL语句中的参数,并返回受影响的行数。intupdate(Stringsql,Object...args):该方法使用Object...args设置SQL语句中的参数,要求参数不能为空,并返回受影响的行数。205.2.1JdbcTemplate增删改的操作下面通过示例讲解使用JdbcTemplate的update()方法实现对MySQL数据库中的数据表进行增删改的操作,步骤如下。

(1)在MySQL数据库中,新建一个chapter05的数据库,并在新建user数据表,输入几条记录,其表结构如图5-1所示。(2)新建一个SpringBoot工程chapter05jdbctemplate,Group和Packagename为com.yzpc,在Dependencies依赖中选择Web节点下的SpringWeb依赖和SQL节点下的JDBCAPI、MySQLDriver依赖,单击Finish按钮,如图5-2所示。pom.xml文件中添加的依赖代码,代码如下所示。21<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>5.2.1JdbcTemplate增删改的操作

在项目的perties配置文件中配置数据库基本连接信息,这样JdbcTemplate才能正常连接到数据库,如下所示。(3)在项目src/main/java/路径下的com.yzpc包中,新建一个pojo包,并在该包中新建User实体类,代码如下所示。(4)在项目src/main/java/路径下的com.yzpc包中,新建一个dao包,并在该包中新建UserDao接口,并在接口中定义添加、修改、删除用户的方法,代码如下所示。在com.yzpc.dao包中,新建一个impl包,在该包中创建UserDao接口的实现类UserDaoImpl,并在类中实现添加、修改和删除的方法,这里已添加为例,代码如下所示。22spring.datasource.driver-class-name=

com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/chapter05?&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=123456packagecom.yzpc.pojo;publicclassUser{

privateintid;

privateStringusername;

privateStringpassword;

//此处省略构造方法

//此处省略相应属性的setter/getter方法

//重写toString方法

@Override

publicStringtoString(){

return"User{"+"id="+id+",username='"+username+'\''+",password='"+password+'\''+'}';}}packagecom.yzpc.dao;importcom.yzpc.pojo.User;publicinterfaceUserDao{

publicintaddUser(Useruser);

publicintupdateUser(Useruser);

publicintdeleteUser(intid);}@RepositorypublicclassUserDaoImplimplementsUserDao{

@Autowired

privateJdbcTemplatejdbcTemplate;

@Override

publicintaddUser(Useruser){

returnjdbcTemplate.update("insertintouser(username,password)values(?,?)",user.getUsername(),user.getPassword());}

//省略updateUser()、deleteUser()方法}5.2.1JdbcTemplate增删改的操作(5)在src/main/java/路径下的com.yzpc包中,新建一个controller包,在该包中新建UserController类,并在该类中添加增加、删除、修改的方法,这里以添加用户功能为例,代码如下所示。

(6)启动项目,在浏览器中访问http://localhost:8080/addUser,插入数据成功的话,可以看到控制台输出了相应的提示信息,如图5-3所示。在浏览器的页面上也输出了同样的提示信息,如图5-4所示。23@RestControllerpublicclassUserController{//使用@Autowired注解实现UserController对UserDao的依赖注入

@Autowired

privateUserDaouserDao;

@GetMapping("/addUser")

publicStringaddUser(){

intresult=userDao.addUser(newUser("yzpc1","yzpc1"));

Stringmessage;

if(result>0){

message=“成功往数据表中插入了

"+result+"条数据!";}else{

message="插入数据失败!";}

System.out.println(message);

returnmessage;}

//省略updateUser()、deleteUser()方法}5.2.2JdbcTemplate查询的操作JdbcTemplate对JDBC的流程做了封装,提供了大量的query()方法来处理各种对数据库表的查询操作,常用的query()方法如下:Listquery(Stringsql,PreparedStatementSetterpss,RowMapperrowMapper)

Listquery(Stringsql,Object[]args,RowMapperrowMapper)

queryForObject(Stringsql,Object[]args,RowMapperrowMapper)

queryForList(Stringsql,Object[]args,class<T>elementType)245.2.2JdbcTemplate查询的操作下面我们尝试一下从user表中查询数据,在UserDao接口中增加按照id查询用户的方法和查询所有用户的方法,在UserDaoImpl中具体实现两个方法,其实现步骤如下:(1)在UserDao接口中,分别创建一个通过id查询单个用户信息和查询所有用户信息的方法,代码如下所示。(2)在UserDao接口实现类UserDaoImpl中,实现接口中的方法,并使用query()方法分别进行查询,代码如下所示。(3)在UserController类中,添加查询方法getUserById()、getAllUser()来进行查询,代码如下所示。25publicUsergetUserById(intid);publicList<User>getAllUser();//实例化BeanPropertyRowMapper对象,将结果集通过Java的反射机制映射到Java对象中RowMapper<User>rowMapper=newBeanPropertyRowMapper<User>(User.class);@OverridepublicUsergetUserById(intid){

Stringsql="select*fromuserwhereid=?";

returnjdbcTemplate.queryForObject(sql,rowMapper,id);}@OverridepublicList<User>getAllUser(){

Stringsql="select*fromUser";

returnjdbcTemplate.query(sql,rowMapper);}@GetMapping("/getUserById")publicUsergetUserById(intid){

Useruser;

user=userDao.getUserById(id);

if(user!=null){

System.out.println("查询id为"+id+"的User对象为:"

+user);}

returnuser;}@GetMapping("/getAllUser")publicList<User>getAllUser(){

List<User>users=userDao.getAllUser();

if(users!=null){

System.out.println("所有User对象列表为:");

for(Useruser:users){//循环输出结集合中对象

System.out.println(user);}}

returnusers;}5.2.2JdbcTemplate查询的操作

(4)重新运行项目,在浏览器中访问http://localhost:8080/getUserById?id=10001,根据id查询用户控制台输出结果,如图5-9所示。

访问http://localhost:8080/getAllUser,查询所有用户控制台输出结果,如图5-10所示。

如果查询一个不存在的数据,例如http://localhost:8080/getUserById?id=10006,控制台抛出了错误异常,如图5-11所示。265.2.2JdbcTemplate查询的操作

查看DataAccessUtils源代码,看到nullableSingleResult在查到空集合的时候,默认抛出了EmptyResultDataAccessException异常,代码如下所示。修改getUserById()方法代码,在方法体内捕获EmptyResultDataAccessException异常,代码修改如下所示。重新启动项目,测试方法和前面一致。同样,对于getAllUser()方法,去执行查询查询操作时,假设数据表中没有数据,也会抛出EmptyResultDataAccessException,在getAllUser()方法体内补获异常的方法和在getUserById()方法体中基本一致。27@Nullablepublicstatic<T>TnullableSingleResult(@NullableCollection<T>results)throwsIncorrectResultSizeDataAccessException

{

if(CollectionUtils.isEmpty(results)){

thrownewEmptyResultDataAccessException(1);}elseif(results.size()>1){

thrownewIncorrectResultSizeDataAccessException(1,results.size());}else{

returnresults.iterator().next();}}@GetMapping("/getUserById")publicUsergetUserById(intid){

Useruser=null;

try{user=userDao.getUserById(id);

if(user!=null){

System.out.println("查询id为"+id+"的User对象为:"+user);}}catch(EmptyResultDataAccessExceptione){

System.err.println("未查询到id为

"+id+"的记录!");

returnnull;}

returnuser;}5.3使用SpringDataJPA

5.3.1SpringDataJPA介绍

SpringData是Spring的一个子项目,旨在统一和简化各类型数据的持久化存储方式,而不局限于是关系型数据还是非关系型数据库。JPA(JavaPersistenceAPI)即Java的持久层的API,用于对象的持久化,它是一个非常强大的ORM持久化的解决方案。JPA是一个规范化接口,封装了Hibernate的操作作为默认实现,让用户不通过任何配置即可完成数据库的操作。SpringData在JPA规范的基础上,充分利用其优点,提出了SpringDataJPA模块对具有ORM关系数据进行持久化操作。JPA、SpringData和Hibernate关系,如图5-12所示。285.3.1SpringDataJPA介绍

SpringDataJPA是Spring在ORM框架、JPA规范的基础上封装的一套新的JPA应用规范,也是靠Hibernate等ORM框架实现的一种解决方案。它提供了增删改查等功能,可以使用较少的代码实现数据操作,同时还易于扩展。SpringDataJPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。SpringDataJPA通过基于JPA的Repository极大地简化了JPA的写法,在几乎不写实现的情况下,实现数据库的访问和操作。使用SpringDataJPA建立数据访问层十分方便,只需要定义一个继承JpaRepository接口的接口即可。继承了JpaRepository接口的自定义访问接口,具有JpaRepository接口的所有数据访问操作方法,JpaRepository接口的源代码如下所示。29@NoRepositoryBeanpublicinterfaceJpaRepository<T,ID>extendsPagingAndSortingRepository<T,ID>,QueryByExampleExecutor<T>{List<T>findAll(); //查找所有实体List<T>findAll(Sortvar1); //排序、查找所有实体List<T>findAllById(Iterable<ID>var1);//返回指定一组ID实体<SextendsT>List<S>saveAll(Iterable<S>var1);//保存集合

voidflush(); //执行缓存与数据库同步<SextendsT>SsaveAndFlush(Svar1);//强制执行持久化

voiddeleteInBatch(Iterable<T>var1);

//删除一个实体集合

voiddeleteAllInBatch(); //删除所有实体TgetOne(IDvar1);//返回ID对应的实体。若不存在,则返回空值

//查询满足Example的所有对象<SextendsT>List<S>findAll(Example<S>var1);

//查询满足Example的所有对象,并且进行排序返回<SextendsT>List<S>findAll(Example<S>var1,Sortvar2);}5.3.1SpringDataJPA介绍

JpaRepository接口继承了PagingAndSortingRepository接口、QueryByExampleExecutor接口,JpaRepository接口的继承关系,如图5-13所示。JpaRepository接口继承关系中涉及的接口进行说明:Repository接口是SpringDataJPA提供的用于自定义Repository接口的顶级父接口,该接口中没有声明任何方法。CrudRepository接口是Repository的继承接口之一,包含了一些基本的CRUD方法。PagingAndSortingRepository接口继承CrudRepository接口的同时,提供了分页和排序两个方法。QueryByExampleExecutor接口是进行条件封装查询的顶级父接口,允许通过Example实例执行复杂条件查询。305.3.2整合SpringDataJPA下面通过示例来讲解SpringBoot整合SpringDataJPA,步骤如下:(1)新建一个SpringBoot工程chapter05jpa,Group和Packagename为com.yzpc,在Dependencies依赖中选择Web节点下的SpringWeb依赖和SQL节点下的SpringDataJPA、MySQLDriver依赖,单击Finish按钮,如图5-14所示。pom.xml中自动添加的依赖代码,如下所示。

(2)在perties配置文件中加入数据库配置,与5.2.1小节第(2)步中介绍的一致。新建一个chapter05jpa的数据库,接下来设置JPA的基本配置,如下所示。31<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!--省略Web中SpringWeb依赖和SQL中的MySQlDriver依赖代码-->#省略数据库配置的设置,参看5.2.1小节第(2)步,数据库使用chapter05jpa#JPA对应的数据库类型spring.jpa.database=mysql#在控制台打印SQLspring.jpa.show-sql=true#update:项目启动,加载Hibernate时,根据实体类类更新数据库中的表#validate:在加载Hibernate时,验证创建数据表的结构#create:每次加载Hibernate时,重新创建数据表结构,造成数据丢失#create-drop:加载Hibernate时创建,退出时删除表结构#none:启动时不做任何操作spring.jpa.hibernate.ddl-auto=create5.3.2整合SpringDataJPA

(3)在项目的src/mian/java/路径下的com.yzpc包中,新建一个pojo包,并在该包中新建一个User实体类,添加JPA对应的注解进行映射配置,代码如下所示。(4)在项目的src/mian/java/路径下的com.yzpc包中,新建一个repository包,并在该包中新建一个用于对数据库表user进行操作的接口UserRepository,代码如下所示。(5)在项目的src/mian/java/路径下的com.yzpc包中,新建一个controller包,并在该包中新建一个用于测试的类UserController,这里以存储用户和添加用户为例,代码如下所示。325.3.2整合SpringDataJPA(6)启动项目,在控制台输出Hibernate的相关语句,如图5-15所示。这是因为,在perties配置文件中spring.jpa.hibernate.ddl-auto的值设置为create,即通过Hibernate实现数据表单的创建。通过SQLyog工具,查看数据库,发现user数据表已经创建,但并没有记录,下面分别来测试相应的方法实现。访问http://localhost:8080/saveUser,查看控制台,如图5-16所示;查看数据表,如图5-17所示。

访问http://localhost:8080/addUser?username=sj&password=sj,查看控制台输出。就可以看到一条insert的插入语句,查看数据表,发现增加了一条记录,查看数据表,如图所示。335.3.2整合SpringDataJPA

访问http://localhost:8080/updateUser?id=4&username=sss&password=sss,查看数据表发现id为4的记录的username和password字段都已经修改为sss,如图所示。

访问http://localhost:8080/deleteUser?id=4,查看数据表,id为4记录已经被删除,如图所示。

访问http://localhost:8080/getUserById?id=3,网页页面输出id为3的记录,如图所示;查看控制台,输出相关信息,如图所示。

访问http://localhost:8080/getAllUser,查询所有用户信息,网页页面显示查询的所有用户,如图所示;控制台输出查询的所有用户,如图所示。345.3.2整合SpringDataJPA

访问http://localhost:8080/findUserById?id=2,这里调用的是UserRepository接口中的自定义的方法,查询id为2的用户信息,控制台输出该用户,如图所示。

访问http://localhost:8080/findUserByName?username=admin,查询username为admin的用户信息,控制台输出,如图所示。

访问http://localhost:8080/findMaxIdUser,查询最大id号的用户信息,控制台输出,如图所示。

如果数据表中没有记录,或者要操作的条件不存在,可能会出现异常,大家可以参考5.2小节中对于相关异常的处理。355.4整合MyBatisMyBatis和JPA一样,也是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。5.4.1基于XML配置的方式整合MyBatis下面通过具体的示例来讲解SpringBoot整合MyBatis,具体步骤如下。(1)新建一个SpringBoot工程chapter05mybatis,Group和Packagename为com.yzpc,在Dependencies依赖中选择Web节点下的SpringWeb依赖和SQL节点下的MyBatisFramework、MySQLDriver依赖。pom.xml中自动添加的依赖代码,如下所示。

在perties配置文件中加入数据库连接配置,与5.2.1小节第(2)步中介绍的一致。36<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!--省略Web中SpringWeb依赖和SQL中的MySQlDriver依赖代码-->5.4.1基于XML配置的方式整合MyBatis(2)在MySQL中,创建一个名为chapter05mybatis的数据库,在该数据库中创建user数据表,并预先插入几条测试数据,相应的SQL语句如下所示。(3)在项目的src/mian/java/路径下的com.yzpc包中,新建一个pojo的包,并在该包中新建与数据表user对应的实体类User,代码如下所示。(4)在项目的src/mian/java/路径下的com.yzpc包中,新建一个mapper的包,在并在该包中新建UserMapper的接口,代码如下所示。37#创建数据库CREATEDATABASEchapter05mybatis;#选择使用数据库USEchapter05mybatis;#创建user数据表并插入相关数据DROPTABLEIFEXISTSUSER;CREATETABLEUSER(idINT(10)NOTNULLAUTO_INCREMENT,usernameVARCHAR(20)DEFAULTNULL,passwordVARCHAR(20)DEFAULTNULL,PRIMARYKEY(id))ENGINE=INNODBDEFAULTCHARSET=utf8;INSERTINTOUSERVALUES(1,'admin','admin');INSERTINTOUSERVALUES(2,'yzpc','yzpc');INSERTINTOUSERVALUES(3,'my','my');packagecom.yzpc.pojo;publicclassUser{

privateintid;

privateStringusername;

privateStringpassword;

//此处省略相应属性的setter/getter方法

//此处省略构造方法

//重写toString方法}packagecom.yzpc.mapper;importcom.yzpc.pojo.User;importorg.apache.ibatis.annotations.Mapper;importjava.util.List;@Mapper //表明该接口是一个MyBatis中的MapperpublicinterfaceUserMapper{

publicintaddUser(Useruser);

publicintupdateUser(Useruser);

publicintdeleteUser(intid);

publicUsergetUserById(intid);

publicList<User>getAllUser();}5.4.1基于XML配置的方式整合MyBatis(5)在src/main/resources/路径下新建mapper目录,并在该目录下,新建UserMapper.xml文件,对应前面UserMapper接口的方法,#{}用来代替接口中的参数,实体类中的属性可以直接通过#{实体类属性名}获取,内容如下所示。UserMapper.xml放在resources目录下,这样就不用担心打包时被忽略了,但是放在resources目录下,又不能自动被扫描到,此时在perties中添加mybatis扫描mapper的路径,需要在perties配置文件中指定位置,代码如下所示。UserMapper.xml除了放在resources目录下,还可以是直接放在UserMapper所在的com.yzpc.mapper包下,该包下的UserMapper.xml会被自动扫描到,需要在pom.xml文件中再添加如下配置。38<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC“-////DTDMapper3.0//EN”

“/dtd/mybatis-3-mapper.dtd”>

<!--此处与接口类地址对应-->

<mappernamespace=“com.yzpc.mapper.UserMapper”>

<!--此处与接口方法名对应,指定参数类型与返回结果类型-->

<insertid=“addUser”parameterType=“com.yzpc.pojo.User”>

insertintouser(username,password)values(#{username},#{password})

</insert>

<!--省略updateUser、deleteUser、getUserById--

>

<selectid="getAllUser"resultType="com.yzpc.pojo.User">

select*fromuser

</select>

</mapper>#指定映射xml文件位置#classpath对应resources,*.xml表示配置mapper下所有xml文件mybatis.mapper-locations=classpath:mapper/*.xml<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory></resource></resources></build>5.4.1基于XML配置的方式整合MyBatis(6)在项目的src/mian/java/路径下的com.yzpc包中,新建controller包,在该包中新建UserController类,并在该类中添加增删改查的方法,这里增加用户为例,代码如下所示。(7)启动项目,在浏览器地址栏中,依次访问增删改查的请求,相应请求如下。增加用户:http://localhost:8080/addUser修改用户:http://localhost:8080/updateUser删除用户:http://localhost:8080/deleteUser/4查询用户:http://localhost:8080/getUserById?id=3查询所有用户:http://localhost:8080/getAllUser

浏览器和控制台上输出了相应信息,控制台的运行结果,如图所示。39@RestControllerpublicclassUserController{

@Autowired

UserMapperuserMapper;

@GetMapping("/addUser")

publicStringaddUser(){

intresult=userMapper.addUser(newUser("yzpc1","yzpc1"));

Stringmessage;

if(result>0){

message="成功往数据表中插入了"+result+"条数据!";

}else{

message="插入数据失败!";

}

System.out.println(message);

returnmessage;

}

<!--省略updateUser、deleteUser、getUserById--

>

@GetMapping("/getAllUser")

publicList<User>getAllUser(){

List<User>users=null;

try{

users=userMapper.getAllUser();

if(users!=null){

System.out.println("所有User对象列表为:");

for(Useruser:users){//循环输出结集合对象

System.out.println(user);

}

}

}catch(EmptyResultDataAccessExceptione){

System.err.println("数据表没有记录!");

returnnull;

}

returnusers;

}

}5.4.2基于注解的方式整合MyBatisMyBatis不仅可以使用基于XML的映射文件来操作数据库,还可以使用注解的方式来操作数据库。只需要在前面的示例上做一些修改,具体修改如下:(1)修改perties,注释或删除如下配置:#mybatis.mapper-locations=classpath:mapper/*.xml(2)删除Mapper映射文件,在src/main/resources目录下,删除mapper目录。(3)修改UserMapper接口,将com.yzpc.mapper包中的UserMapper接口,添加相应的SQL注解,代码如下所示。重新启动项目,分别访问增删改查的请求,访问地址与5.4.1节第(7)点中的地址一致,运行结果与使用基于XML的映射文件的方式是一致的。40packagecom.yzpc.mapper;importcom.yzpc.pojo.User;importorg.apache.ibatis.annotations.*;importjava.util.List;@MapperpublicinterfaceUserMapper{

@Insert("insertintouser(username,password)values(#{username},#{password})")

publicintaddUser(Useruser);//省略updateUser()、deleteUser()、getUserById()方法 @Select("select*fromuser")

publicList<User>getAllUser();}SpringDataJPA还是MyBatis?如何抉择SpringDataJpa是对基于JPA的数据访问层的增强支持,底层使用Hibernate框架,支持使用原生SQL或JPQL查询语言MyBatis是一款优秀的持久层框架,它支持定制化

SQL、存储过程以及高级映射JPA默认使用hibernate作为ORM实现,hibernate是面向对象的,而MyBatis是面向关系的MyBatis在Sql语句编写方面则更灵活自由。mybatis并没有jpa功能,建表语句还是要自己写的41Hibernate的开发难度要大于Mybatis。主要是由于Hibernate封装了完整的对象关系映射机制,以至于内部的实现比较复杂、庞大,学习周期较长。Mybatis主要依赖于SQL的编写与ResultMap的映射,学习成本较低,市场占有率大,也就是,Java程序员都会,标配Mybatis面向DB基于SQL的模式相对来说就显得特别直观友好而JPA是基于ORM的,把代码和DB分离,相当于在代码和DB之间增加了一个新的层面,一套新的标准,去间接操作DB,相对SQL的模式来说就显得不够直接和易于控制,增加了学习成本(Mybatis也有一部分ORM特性)424344Mybatis-plus是Mybatis的增强工具包,其官网的介绍如下:润物细无声:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。效率至上:只需简单配置,即可快速进行单表CRUD操作,从而节省大量时间。丰富功能:代码生成、自动分页、逻辑删除、自动填充等功能一应俱全。45其优点如下:无侵入:Mybatis-Plus在Mybatis的基础上进行扩展,只做增强不做改变,引入Mybatis-Plus不会对您现有的Mybatis构架产生任何影响,而且MP支持所有Mybatis原生的特性依赖少:仅仅依赖Mybatis以及Mybatis-Spring损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作通用CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题支持ActiveRecord:支持ActiveRecord形式调用,实体类只需继承Model类即可实现基本CRUD操作支持代码生成:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S.比Mybatis官方的Generator更加强大!)支持自定义全局通用操作:支持全局通用方法注入(Writeonce,useanywhere)内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询内置全局拦截插件:提供全表delete、update操作智能分析阻断,预防误操作4647484950application.yml配置文件中配置数据库和Mybatis-plus5152#设置数据源spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/spring6password:rootusername:roothikari:#设置事务自动提交

auto-commit:true#设置最大连接数

maximum-pool-size:10minimum-idle:10#获取连接是,检测语句

connection-test-query:select1#连接超时设置

connection-timeout:20000#其它属性mybatis-plus:configuration:#开启驼峰命名自动映射

map-underscore-to-camel-case:true#开启日志打印

log-impl:org.apache.ibatis.logging.stdout.StdOutImpltype-aliases-package:com.mybatisplus.pojo#扫描mapper文件

mapper-locations:classpath:mapper/*.xmlpom.xml文件中添加Mybatisplus依赖531.在pom文件中引入依赖的代码:<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version></version></dependency>注:如果是gradle,引入的方式如下:implementationgroup:'com.baomidou',name:'mybatis-plus-boot-starter',version:''542创建一张User表,表中插入数据3创建与数据库表相对应的实体类4.创建Mapper接口的子接口5.创建IService接口的子接口6.Service包下面创建一个impl包7.创建一个类去继承ServiceImpl类8.给主类添加@MapperScan9.创建Controller类10.添加@RestController注解55@Data:注在类上,提供类的get、set、equals、has

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论