写点什么

SpringBoot 数据库操作 (集成 MyBatis)

用户头像
xcbeyond
关注
发布于: 1 小时前

​Spring 对持久化的支持,不单只支持 JDBC,为各种支持的持久化技术都提供了简单的模板和回调:


ORM 持久化技术 模板类

JDBC(JdbcTemplate) org.springframework.jdbc.core.JdbcTemplate

Hibernate5.0 org.springframework.orm.hibernate5.Hibernate

TemplateJPA org.springfrmaework.orm.jpa.JpaTemplate

IBatis(MyBatis) org.springframework.orm.ibatis.SqlMapClientTemplate


本章节主要讲解通过 SpringBoot 如何访问操作数据库,以下述三种方式来操作数据库:


JdbcTemplateJPAMyBatis 本文以简单的对数据库表的基本操作为例进行说明。


数据库使用 MySQL 数据库,新建 t_user 表。


CREATE TABLE `t_user` (  `userid` varchar(10) NOT NULL,  `username` varchar(255) DEFAULT NULL,  `sex` varchar(2) DEFAULT NULL,  `age` int(3) DEFAULT NULL,  PRIMARY KEY (`userid`));
复制代码


1、JdbcTemplate   

  JdbcTemplate 是 Spring 对 JDBC 的模板封装,提供了一套 JDBC 模板,能够让我们写持久层代码时减少冗余代码,简化 JDBC 代码,使代码更加简洁,有点像 DBUtils。JdbcTemplate 在实际开发中一般不会使用,通常都是使用 MyBatis、Hibernate 等更加成熟、优秀的数据持久层框架,这里只是对它的使用做一说明,知道如何用它就可以啦。

1.1 引入 JdbcTemplate 依赖包


在工程的 pom.xml 中,添加如下依赖包信息。

<!-- JdbcTemplate依赖包 --><dependency>      	<groupId>org.springframework.boot</groupId>       	<artifactId>spring-boot-starter-jdbc</artifactId></dependency>
复制代码

如果没有导入 mysql 依赖包,则需要添加 mysql-connector-java。

<dependency>	<groupId>mysql</groupId>	<artifactId>mysql-connector-java</artifactId>	<scope>runtime</scope></dependency>
复制代码

1.2 持久层(dao 层)   

实现持久层 dao 完成数据的插入。

package com.xcbeyond.springboot.dao; import com.xcbeyond.springboot.model.User; public interface UserDao {	/**	 * 插入User	 * @param user	 * @return	 */	public int insertUser(User user);}
复制代码


com.xcbeyond.springboot.dao.impl.UserDaoJdbcTemplateImpl.java

package com.xcbeyond.springboot.dao.impl; import java.util.HashMap;import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;import org.springframework.stereotype.Repository; import com.xcbeyond.springboot.dao.UserDao;import com.xcbeyond.springboot.model.User;/** * JdbcTemplate方式完成对t_user表的操作 * @author xcbeyond * 2018年7月12日上午11:53:44 *///作用于持久层.用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常@Repositorypublic class UserDaoJdbcTemplateImpl implements UserDao {		//自动导入依赖的bean	@Autowired	private NamedParameterJdbcTemplate jdbcTemplate;		@Override	public int insertUser(User user) {		String sql = "INSERT INTO t_user (userid, username, sex, age) VALUES (:userid, :username, :sex, :age)";		Map<String,Object> param = new HashMap<String,Object>();		param.put("userid", user.getUserId());		param.put("username", user.getUserName());		param.put("sex", user.getSex());		param.put("age", user.getAge());				return jdbcTemplate.update(sql, param);	} }
复制代码

1.3、控制层(Controller)

com.xcbeyond.springboot.controller.ControllerDemo.java

(完整代码请从文末 github 地址获取)

/** * 通过JdbcTemplate方式插入用户信息* @return*/@RequestMapping("/insertUserByJdbcTemplate")public String insertUserByJdbcTemplate() {	User user = new User();	user.setUserId("xcbeyond");	user.setUserName("xcbeyond");	user.setSex("F");	user.setAge(18);			int ret = userDao.insertUser(user);	return String.valueOf(ret);		}
复制代码


在浏览器中输入 http://localhost:8888/demo/insertUserByJdbcTemplate,完成数据的插入。


2、JPA

    JPA(Java Persistence API)是 java 持久层 API,一个简化对象关系映射来管理 Java 应用程序中关系数据库的规范,可以直接使用对象而不是使用SQL语句。在 JPA 中,我们可以通过实体类轻松地操作数据库中的表。

2.1、引入依赖包

    通过 JPA 的方式来实现数据库的操作,首先需要引入如下的依赖包。


<!-- JPA依赖包 --><dependency>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-data-jpa</artifactId></dependency> 
复制代码


2.2、ORM

在 model 中 User 类中增加 Entiy 的注解,并指定表名(如果不指定,则默认表名为类名 user),然后需要指定 ID 及生成策略。

(这些都是 JPA 相关的知识,不清楚的可以详细查看 JPA)


3、MyBatis


MyBatis 方式是极力推荐的方式,操作简单,代码量少。


3.1 引入依赖包

引入 mybatis-spring-boot-starter 依赖包。

 <!-- MyBatis依赖包 --><dependency>	<groupId>org.mybatis.spring.boot</groupId>	<artifactId>mybatis-spring-boot-starter</artifactId>	<version>1.1.1</version></dependency>
复制代码


3.2 mapper 接口

mapper 接口中,定义对数据库的增、删、改、查具体操作,不用实现类。


/springboot/src/main/java/com/xcbeyond/springboot/mapper/UserMapper.java

package com.xcbeyond.springboot.mapper; import com.xcbeyond.springboot.model.User; /** * User数据访问层接口 * @author xcbeyond * 2018年7月16日下午5:01:17 */public interface UserMapper {	/**	 * 通过userid查询	 * @param userid	 * @return	 */	public User queryUserByUserid(String userid);}
复制代码


<select id="queryUserByUserid" parameterType="string"  resultType="com.xcbeyond.springboot.model.User">  select  <include refid="column"></include>  from t_user  where userid = #{userid}</select>
复制代码


3.3 配置 mapper

MyBatis 一般可以通过 XML 或者注解的方式来指定操作数据库的 SQL,建议使用 XML 方式。首先,我们需要配置 mapper 文件夹,即:/springboot/src/main/resources/mybatis/mapper/,并在 application.properties 中配置 mapper 路径。

#mybatis#mybatis自身的一些配置,例如基本类型的别名mybatis.config-location=classpath:mybatis/mybatis-config.xml#指定mapper文件夹的位置mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
复制代码

创建要操作表的 mapper.xml SQL 文件,即:/springboot/src/main/resources/mybatis/mapper/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.xcbeyond.springboot.mapper.UserMapper">	<sql id="column">		userid,username,sex,age	</sql> 	<select id="queryUserByUserid" parameterType="string"		resultType="com.xcbeyond.springboot.model.User">		select		<include refid="column"></include>		from t_user		where userid = #{userid}	</select></mapper>
复制代码

注:符合 ByBatis 的 sql 配置,详细配置可查询 ByBatis 相关知识。

3.4 controller

com.xcbeyond.springboot.controller.ControllerDemo.java,追加 queryUserByUserid 方法,如下:

/*** 通过userid查询* @param userid* @return*/@RequestMapping(value="/queryUserByUserid", method=RequestMethod.GET)public String queryUserByUserid(@RequestParam("userid") String userid) {	User user = userMapper.queryUserByUserid(userid);	return user.toString();	}
复制代码


3.5 测试

    启动 SpringBoot 项目后,在浏览器中输入 http://localhost:8888/demo/queryUserByUserid?userid=xcbeyond,进行查询显示查询结果。


启动时,报如下错误:

***************************APPLICATION FAILED TO START*************************** Description: A component required a bean of type 'com.xcbeyond.springboot.mapper.UserMapper' that could not be found.  Action: Consider defining a bean of type 'com.xcbeyond.springboot.mapper.UserMapper' in your configuration.
复制代码


这是因为在 SpringBoot 启动时,无法找到 Mapper,导致无法被 SpringBoot 管理。可以采取如下几种方式来管理 UserMapper 接口。


方式一:使用 @Mapper 注解


为了让 UserMapper 能够让别的类进行引用,我们可以在 UserMapper 类上添加 @Mapper 注解:

package com.xcbeyond.springboot.mapper; import com.xcbeyond.springboot.model.User; /** * User数据访问层接口 * @author xcbeyond * 2018年7月16日下午5:01:17 */@Mapperpublic interface UserMapper {	/**	 * 通过userid查询	 * @param userid	 * @return	 */	public User queryUserByUserid(String userid);}
复制代码


方式二:使用 @MapperScan 注解


需在启动类中添加 @MapperScan 注解,指定要扫描的 Mapper 类的包的路径即可。

package com.xcbeyond.springboot; import org.mybatis.spring.annotation.MapperScan;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * SpringBoot启动类 * @author xcbeyond * 2018年7月2日下午5:41:45 */@SpringBootApplication//指定要扫描的Mapper类的包的路径@MapperScan("com.xcbeyond.springboot.mapper")public class SpringbootApplication {	private static Logger logger = LoggerFactory.getLogger(SpringbootApplication.class);		public static void main(String[] args) {		if(logger.isDebugEnabled()) {			logger.debug("SpringBoot starting...");		}		SpringApplication.run(SpringbootApplication.class, args);	}}
复制代码

4、总结


本章节主要讲述了在 SpringBoot 中如何操作数据库,其中 JdbcTemplate 和 JPA 只是说明在 SpringBoot 中可以这样操作数据库,但在实际项目中推荐使用 MyBaits 方式,这样会非常方便的。


项目源码:https://github.com/xcbeyond/micro-service/tree/master/springboot


发布于: 1 小时前阅读数: 3
用户头像

xcbeyond

关注

🚩InfoQ写作平台签约作者 2019.06.20 加入

公众号:程序猿技术大咖,专注于技术输出、分享。

评论

发布
暂无评论
SpringBoot 数据库操作(集成MyBatis)