SpringBoot 數(shù)據(jù)庫(kù)操作(集成MyBatis)
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
Spring對(duì)持久化的支持,不單只支持JDBC,為各種支持的持久化技術(shù)都提供了簡(jiǎn)單的模板和回調(diào):
本章節(jié)主要講解通過SpringBoot如何訪問操作數(shù)據(jù)庫(kù),以下述三種方式來操作數(shù)據(jù)庫(kù):
JdbcTemplate
JPA
MyBatis
本文以簡(jiǎn)單的對(duì)數(shù)據(jù)庫(kù)表的基本操作為例進(jìn)行說明。
數(shù)據(jù)庫(kù)使用MySQL數(shù)據(jù)庫(kù),新建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對(duì)JDBC的模板封裝,提供了一套JDBC模板,能夠讓我們寫持久層代碼時(shí)減少冗余代碼,簡(jiǎn)化JDBC代碼,使代碼更加簡(jiǎn)潔,有點(diǎn)像DBUtils。JdbcTemplate在實(shí)際開發(fā)中一般不會(huì)使用,通常都是使用MyBatis、Hibernate等更加成熟、優(yōu)秀的數(shù)據(jù)持久層框架,這里只是對(duì)它的使用做一說明,知道如何用它就可以啦。
1.1 引入JdbcTemplate依賴包
在工程的pom.xml中,添加如下依賴包信息。
<!-- JdbcTemplate依賴包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
如果沒有導(dǎo)入mysql依賴包,則需要添加mysql-connector-java。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
1.2 持久層(dao層)
實(shí)現(xiàn)持久層dao完成數(shù)據(jù)的插入。
com.xcbeyond.springboot.dao.UserDao.java
package com.xcbeyond.springboot.dao;
import com.xcbeyond.springboot.model.User;
public interface UserDao {
/**
* 插入U(xiǎn)ser
* @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方式完成對(duì)t_user表的操作
* @author xcbeyond
* 2018年7月12日上午11:53:44
*/
//作用于持久層.用來表明該類是用來執(zhí)行與數(shù)據(jù)庫(kù)相關(guān)的操作(即dao對(duì)象),并支持自動(dòng)處理數(shù)據(jù)庫(kù)操作產(chǎn)生的異常
@Repository
public class UserDaoJdbcTemplateImpl implements UserDao {
//自動(dòng)導(dǎo)入依賴的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
(完整代碼請(qǐng)從文末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,完成數(shù)據(jù)的插入。
2、JPA
JPA(Java Persistence API)是java持久層API,一個(gè)簡(jiǎn)化對(duì)象關(guān)系映射來管理Java應(yīng)用程序中關(guān)系數(shù)據(jù)庫(kù)的規(guī)范,可以直接使用對(duì)象而不是使用SQL語句。在JPA中,我們可以通過實(shí)體類輕松地操作數(shù)據(jù)庫(kù)中的表。
2.1、引入依賴包
通過JPA的方式來實(shí)現(xiàn)數(shù)據(jù)庫(kù)的操作,首先需要引入如下的依賴包。
<!-- JPA依賴包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.2、ORM
在model中User類中增加Entiy的注解,并指定表名(如果不指定,則默認(rèn)表名為類名user),然后需要指定ID及生成策略。
(這些都是JPA相關(guān)的知識(shí),不清楚的可以詳細(xì)查看JPA)
3、MyBatis
MyBatis方式是極力推薦的方式,操作簡(jiǎn)單,代碼量少。
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接口中,定義對(duì)數(shù)據(jù)庫(kù)的增、刪、改、查具體操作,不用實(shí)現(xiàn)類。
/springboot/src/main/java/com/xcbeyond/springboot/mapper/UserMapper.java
package com.xcbeyond.springboot.mapper;
import com.xcbeyond.springboot.model.User;
/**
* User數(shù)據(jù)訪問層接口
* @author xcbeyond
* 2018年7月16日下午5:01:17
*/
public interface UserMapper {
/**
* 通過userid查詢
* @param userid
* @return
*/
public User queryUserByUserid(String userid);
}
3.3 配置mapper
MyBatis一般可以通過XML或者注解的方式來指定操作數(shù)據(jù)庫(kù)的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
創(chuàng)建要操作表的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 配置,詳細(xì)配置可查詢ByBatis相關(guān)知識(shí)。
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 測(cè)試
啟動(dòng)SpringBoot項(xiàng)目后,在瀏覽器中輸入http://localhost:8888/demo/queryUserByUserid?userid=xcbeyond,進(jìn)行查詢顯示查詢結(jié)果。
啟動(dòng)時(shí),報(bào)如下錯(cuò)誤:
***************************
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.
這是因?yàn)樵赟pringBoot啟動(dòng)時(shí),無法找到Mapper,導(dǎo)致無法被SpringBoot管理。可以采取如下幾種方式來管理UserMapper接口。
方式一:使用@Mapper注解
為了讓UserMapper能夠讓別的類進(jìn)行引用,我們可以在UserMapper類上添加@Mapper注解:
package com.xcbeyond.springboot.mapper;
import com.xcbeyond.springboot.model.User;
/**
* User數(shù)據(jù)訪問層接口
* @author xcbeyond
* 2018年7月16日下午5:01:17
*/
@Mapper
public interface UserMapper {
/**
* 通過userid查詢
* @param userid
* @return
*/
public User queryUserByUserid(String userid);
}
直接在Mapper類上面添加注解@Mapper,這種方式要求每一個(gè)mapper類都需要添加此注解,比較麻煩。
方式二:使用@MapperScan注解
需在啟動(dòng)類中添加@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啟動(dòng)類
* @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);
}
}
總結(jié):
本章節(jié)主要講述了在SpringBoot中如何操作數(shù)據(jù)庫(kù),其中JdbcTemplate和JPA只是說明在SpringBoot中可以這樣操作數(shù)據(jù)庫(kù),但在實(shí)際項(xiàng)目中推薦使用MyBaits方式,這樣會(huì)非常方便的。
項(xiàng)目源碼:https://github.com/xcbeyond/micro-service/tree/master/springboot