目录
springboot整合数据层
我们介绍springboot整合JdbcTemplate,mybatis,springjpa三种方式。
演示springboot项目:
在本地mysql数据库test库下,创建 t_user表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
在application.yml文件中配置数据源
spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: admin driver-class-name: com.mysql.jdbc.Driver
注意:springboot2.0以上版本,可能会出现jdbc驱动引发的问题。访问时报错:
Caused by: java.sql.SQLException: The server time zone value 'DST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
解决办法:
在
spring.datasource.url=jdbc:mysql://localhost:3306/test
加上
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
如果spring.datasource.ur如下:
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8
就是有多个参数需要以&分开时,需要将&要改为&
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8
所以,修改我们的application.yml文件
spring: datasource: url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC username: root password: admin driver-class-name: com.mysql.jdbc.Driver
1.springboot整合JdbcTemplate
1.引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.itmayiedu</groupId> <artifactId>springboot-helloworld</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-helloworld</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- jdbcTemplate 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.在services包下的UserService类
package com.itmayiedu.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private JdbcTemplate jdbcTemplate; public void insertUser(String name, Integer age) { jdbcTemplate.update("insert into t_user values(null,?,?);", name, age); } }
引入了JdbcTemplate依赖后,可以直接使用JdbcTemplate类操作数据库
3.在controller包下的UserController类
package com.itmayiedu.controller; import com.itmayiedu.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/insertUser") public String insertUser(String name,Integer age){ userService.insertUser(name,age); return "SUCCESS"; } }
4.浏览器访问
5.数据库成功插入数据
2.springboot整合Mybatis
1.引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.itmayiedu</groupId> <artifactId>springboot-helloworld</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-helloworld</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- lombok依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- mybatis依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.在entity包下的UserEntity类
package com.itmayiedu.entity; import lombok.Data; import javax.persistence.*; @Data public class UserEntity { private Integer id; private String name; private Integer age; }
3.在mapper包下的UserMapper接口
package com.itmayiedu.mapper; import com.itmayiedu.entity.UserEntity; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; public interface UserMapper { @Select("SELECT * FROM t_user WHERE NAME = #{name}") UserEntity findByName(@Param("name") String name); @Insert("INSERT INTO t_user(NAME, AGE) VALUES(#{name}, #{age})") int insert(@Param("name") String name, @Param("age") Integer age); }
mapper接口上,可以添加@Mapper注解,那么启动类上就不需要单独添加注解,就可以扫描到。但这种情况,每个mapper都需要添加@Mapper注解,比较麻烦,所以我们一般不在mapper接口上添加@Mapper注解,而是在启动类上添加@MapperScan,定义扫描mapper包即可,即@MapperScan("com.itmayiedu.mapper")
4.service包下的UserService类
package com.itmayiedu.service; import com.itmayiedu.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public void insertUser(String name, Integer age) { userMapper.insert(name,age); } }
5.controller包下的UserController类
package com.itmayiedu.controller; import com.itmayiedu.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/insertUser") public String insertUser(String name,Integer age){ userService.insertUser(name,age); return "SUCCESS"; } }
6.在启动类上添加@MapperScan注解,扫描mapper包下的接口
package com.itmayiedu; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.itmayiedu.mapper") public class SpringbootHelloworldApplication { public static void main(String[] args) { SpringApplication.run(SpringbootHelloworldApplication.class, args); } }
7.访问浏览器
8.数据库插入成功
3.springboot整合Springjpa
springjap 是对 hibernate 的封装
1.引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.itmayiedu</groupId> <artifactId>springboot-helloworld</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-helloworld</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- lombok依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- springjap依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.entity包下的UserEntity类
package com.itmayiedu.entity; import lombok.Data; import javax.persistence.*; @Data @Entity(name = "t_user") public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; }
注意:springboot开发时,一定要注意注解不能缺少
3.dao包下的UserDao接口
package com.itmayiedu.dao; import com.itmayiedu.entity.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; public interface UserDao extends JpaRepository<UserEntity, Integer> { }
dao接口需要继承springjpa的JpaRespository类,里面提供了增删改查功能。
4.service包的UserService类
package com.itmayiedu.service; import com.itmayiedu.dao.UserDao; import com.itmayiedu.entity.UserEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserDao userDao; public void insertUser(String name, Integer age) { UserEntity userEntity = new UserEntity(); userEntity.setName(name); userEntity.setAge(age); userDao.save(userEntity); } }
5.controller包下的UserController类
package com.itmayiedu.controller; import com.itmayiedu.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/insertUser") public String insertUser(String name,Integer age){ userService.insertUser(name,age); return "SUCCESS"; } }
6.启动类上添加注解:
@EnableJpaRepositories("com.itmayiedu.dao") 扫dao包
@EntityScan("com.itmayiedu.entity") 扫entity包
package com.itmayiedu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication @EnableJpaRepositories("com.itmayiedu.dao") @EntityScan("com.itmayiedu.entity") public class SpringbootHelloworldApplication { public static void main(String[] args) { SpringApplication.run(SpringbootHelloworldApplication.class, args); } }
7.浏览器访问
8.数据库添加成功
4.事物管理
Springboot默认集成事物,主要在方法上加上@Transactional即可使用事物
我们以整合mybatis的代码为案例
1.UserService类:
package com.itmayiedu.service; import com.itmayiedu.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public void insertUser(String name, Integer age) { userMapper.insert(name,age); int i = 1/0; userMapper.insert(name,age); } }
2.浏览器访问后,查看数据库
结果:没有事物情况下,插入完第一条之后,出现错误,没有回滚,数据库就有了一条数据
3.添加事物@Transactional
package com.itmayiedu.service; import com.itmayiedu.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @Autowired private UserMapper userMapper; @Transactional public void insertUser(String name, Integer age) { userMapper.insert(name,age); int i = 1/0; userMapper.insert(name,age); } }
4.浏览器访问后,再次查看数据库
结果:有事物情况下,插入完第一条之后,出现错误,回滚,数据库就一条数据都没有,添加事物成功。