Spring Boot 連接MySql資料庫

Spring Boot可以大大簡化持久化任務,幾乎不需要寫SQL語句,在之前我們新建了一個

Spring Boot應用程序,本章在原有的工程中與資料庫建立連接。

Spring Boot有兩種方法與資料庫建立連接,一種是使用JdbcTemplate,另一種集成Mybatis,下面分別為大家介紹一下如何集成和使用這兩種方式。

1. 使用JdbcTemplate

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency>

在resource文件夾下添加application.properties配置文件並輸入資料庫參數,內容如下:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testspring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.max-idle=10spring.datasource.max-wait=1000spring.datasource.min-idle=5spring.datasource.initial-size=5server.port=8012server.session.timeout=10server.tomcat.uri-encoding=UTF-8

新建Controller類測試資料庫連接,實例如下:

package com.example.demo;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/mydb")public class DBController { @Autowired private JdbcTemplate jdbcTemplate; @RequestMapping("/getUsers") public List<Map<String, Object>> getDbType(){ String sql = "select * from appuser"; List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); for (Map<String, Object> map : list) { Set<Entry<String, Object>> entries = map.entrySet( ); if(entries != null) { Iterator<Entry<String, Object>> iterator = entries.iterator( ); while(iterator.hasNext( )) { Entry<String, Object> entry =(Entry<String, Object>) iterator.next( ); Object key = entry.getKey( ); Object value = entry.getValue(); System.out.println(key+":"+value); } } } return list; } @RequestMapping("/user/{id}") public Map<String,Object> getUser(@PathVariable String id){ Map<String,Object> map = null; List<Map<String, Object>> list = getDbType(); for (Map<String, Object> dbmap : list) { Set<String> set = dbmap.keySet(); for (String key : set) { if(key.equals("id")){ if(dbmap.get(key).equals(id)){ map = dbmap; } } } } if(map==null) map = list.get(0); return map; } }

運行App輸入地址輸出資料庫數據。

2. 集成Mybatis

添加mybatis依賴,在pom.xml文件中增加如下:

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.0.0</version></dependency>

在resource文件夾下添加application.properties配置文件並輸入資料庫參數,如下:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testspring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.max-idle=10spring.datasource.max-wait=1000spring.datasource.min-idle=5spring.datasource.initial-size=5server.port=8012server.session.timeout=10server.tomcat.uri-encoding=UTF-8

依次添加mapper的介面類和xml文件,類分別如下:

AppMessageMapper.java

package com.example.demo.mapper;import java.util.List;import com.example.demo.bean.AppMessage;public interface AppMessageMapper { int deleteByPrimaryKey(String id); int insert(AppMessage record); int insertSelective(AppMessage record); AppMessage selectByPrimaryKey(String id); int updateByPrimaryKeySelective(AppMessage record); int updateByPrimaryKey(AppMessage record); List<AppMessage> selectAll(); List<AppMessage> getMessById(String id);}

AppMessageMapper.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.example.demo.mapper.AppMessageMapper" > <resultMap id="BaseResultMap" type="com.example.demo.bean.AppMessage" > <id column="id" property="id" jdbcType="VARCHAR" /> <result column="message" property="message" jdbcType="VARCHAR" /> <result column="senddate" property="senddate" jdbcType="TIMESTAMP" /> </resultMap> <sql id="Base_Column_List" > id, message, senddate </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" > select <include refid="Base_Column_List" /> from appuser_message where id = #{id,jdbcType=VARCHAR} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.String" > delete from appuser_message where id = #{id,jdbcType=VARCHAR} </delete> <insert id="insert" parameterType="com.example.demo.bean.AppMessage" > insert into appuser_message (id, message, senddate ) values (#{id,jdbcType=VARCHAR}, #{message,jdbcType=VARCHAR}, #{senddate,jdbcType=TIMESTAMP} ) </insert> <insert id="insertSelective" parameterType="com.example.demo.bean.AppMessage" > insert into appuser_message <trim prefix="(" suffix=")" suffixOverrides="," > <if test="id != null" > id, </if> <if test="message != null" > message, </if> <if test="senddate != null" > senddate, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="id != null" > #{id,jdbcType=VARCHAR}, </if> <if test="message != null" > #{message,jdbcType=VARCHAR}, </if> <if test="senddate != null" > #{senddate,jdbcType=TIMESTAMP}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.example.demo.bean.AppMessage" > update appuser_message <set > <if test="message != null" > message = #{message,jdbcType=VARCHAR}, </if> <if test="senddate != null" > senddate = #{senddate,jdbcType=TIMESTAMP}, </if> </set> where id = #{id,jdbcType=VARCHAR} </update> <update id="updateByPrimaryKey" parameterType="com.example.demo.bean.AppMessage" > update appuser_message set message = #{message,jdbcType=VARCHAR}, senddate = #{senddate,jdbcType=TIMESTAMP} where id = #{id,jdbcType=VARCHAR} </update> <select id="selectAll" resultMap="BaseResultMap"> select id, message, senddate from appuser_message order by senddate asc </select> <select id="getMessById" resultMap="BaseResultMap" parameterType="java.lang.String"> select id, message, senddate from appuser_message where id = #{id,jdbcType=VARCHAR} order by senddate asc </select> </mapper>

AppMessage.java

package com.example.demo.bean;import java.util.Date;public class AppMessage { private String id; private String message; private Date senddate; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message == null ? null : message.trim(); } public Date getSenddate() { return senddate; } public void setSenddate(Date senddate) { this.senddate = senddate; }}

AppMessageService.java

package com.example.demo.service;import java.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.example.demo.bean.AppMessage;import com.example.demo.mapper.AppMessageMapper;@Servicepublic class AppMessageService { @Autowired private AppMessageMapper mapper; public List<AppMessage> getMessage(){ List<AppMessage> list = new ArrayList<AppMessage>(); list.add(mapper.selectByPrimaryKey("xtt")); //list = mapper.selectAll(); return list; } public List<AppMessage> getAllMessage(){ List<AppMessage> list = new ArrayList<AppMessage>(); list = mapper.selectAll(); return list; } public int addMessage(AppMessage appMessage) { return mapper.insert(appMessage); } public List<AppMessage> getMessageById(String id) { return mapper.getMessById(id); } public int delMessage(String id) { return mapper.deleteByPrimaryKey(id); }}

APPMessageController.java

package com.example.demo.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import com.example.demo.bean.AppMessage;import com.example.demo.service.AppMessageService;@RestController@RequestMapping("/appmessage")public class APPMessageController { @Autowired private AppMessageService service; @RequestMapping("/getThree") public List<AppMessage> getThreeForMessage(){ List<AppMessage> list = service.getMessage(); return list; } @RequestMapping("/getAll") public List<AppMessage> getAllMessage(){ List<AppMessage> list = service.getAllMessage(); int num = list.size(); if(null!=list && num>3){ for (int i = 0; i < num-3; i++) { list.remove(0); } } return list; } @RequestMapping("/getByID") public List<AppMessage> getMessageById(@RequestParam("id") String id){ List<AppMessage> list = service.getMessageById(id); int num = list.size(); if(null!=list && num>5){ for (int i = 0; i < num-5; i++) { list.remove(0); } } return list; } @RequestMapping(value = "/add",method = RequestMethod.POST) // 或者採用@PostMapping("/add")方法,更加節省代碼的編寫量 public int addMessage(@RequestBody AppMessage appMessage){ return service.addMessage(appMessage); } @RequestMapping(value="/delMessageById",method=RequestMethod.POST) // 或者採用@PostMapping("/delMessageById")方法,更加節省代碼的編寫量 public int delMessageById(@RequestParam("id") String id){ return service.delMessage(id); }}

問題描述?

SpringBoot掃描包提示找不到mapper的問題,異常信息:

Consider defining a bean of type in your configuration

分析原因

Spring Boot項目的Bean裝配默認規則是根據Application類所在的包位置從上往下掃描,「Application類」是指Spring Boot項目入口類。如果Application類所在的包為:com.yoodb.blog,則只會掃描com.yoodb.blog包及其所有子包,如果service或dao所在包不在com.yoodb.blog及其子包下,則不會被掃描。

解決方法

方式一:使用註解@ComponentScan(value=」com.yoodb.blog」),其中,com.yoodb.blog為包路徑。

方式二:將啟動類Application放在上一級包中,注意的是Application啟動類必須要保證在包的根目錄下。

本文地址:blog.yoodb.com/yoodb/ar


推薦閱讀:

R markdown 連接mysql數據
Mysql高可用之Keepalived+mysql雙主
說說 MySQL JSON 數據類型
(1 條消息)MySQL分表 不合併表查詢 要如何操作?
關於MySQL集群的一些看法

TAG:Spring | SpringBoot | MySQL |