一,准备工作
1,下载Eclipse开发IDE开发环境;
2,下载maven并搭建maven服务,建立本地maven仓库,同时在eclipse配置maven;
Eclipse --》Window --》preferences,弹出的窗口在点击 User setting 选择本地maven的setting.xml,注意在xml中settings标签之后加入<localRepository>F:\maven_local_repository01</localRepository>,自己本地仓库相应修改;如下图,
3,保证能连接网络上网,以便后续能下载所需的JAR包;
二,工程样本建立
浏览器登录 https://start.spring.io/ 构建一个简单的MVC功能工程,增加的Dependencies依赖:web, Rest Repositories, Thymeleaf,jdbc,sql server,mybatis 然后点击Generate Project 产生并下载项目工程样例的打包文件,如下图,
三,工程导入Eclipse开发环境,下载相关依赖JAR包,
1,项目下载后解压到本地某个地方,文件夹可以按自己要求重命名,也可保留原样,然后:
Eclipse --》Import --》弹出窗口Maven --》Existing Maven Projects --》Next --》弹出窗口Browse... 选择工程所在文件夹 --》Finish确认,完成项目导入Eclipse;
2,导入工程后,可根据需要修改工程名称,例如我这里直接右键单击工程名称,Refactor --》Rename,工程名改为springBoot01Database;然后下载相关jar包,Eclipse --》Project --》clean... 清空缓存目的是触发下载pom.xml文件中的指定依赖的JAR包文件,这个确保能连接上网,快慢取决于网速,一般几分钟到半小时左右可完成;
结果整个工程图如下,
四,工程 pom.xml 修改,内容如下,
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qyh</groupId>
<artifactId>springBoot01Database</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springBoot01Database</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- ms sql server JDBC 依赖jar包 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mysql db 依赖jar包 -->
<!--
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
-->
<!-- oracle db 依赖jar包,好像难从maven仓库下载,需手动下载放到本地仓库 -->
<!--
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.2.0</version>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 支持热部署依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<defaultGoal>compile</defaultGoal>
<finalName>springBoot01Database</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 没有该配置,devtools 不生效 -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
对应库表结构
create table member (
recID bigint identify(1,1) primiry key,
memberId varchar(10) null,
memberName varchar(50) ,
sex varchar(1)
)
五,配置文件 application.properties 文件修改,
为方便在开发,测试,生成三种环境之间切换,配置文件分为三个,即: application-dev.properties,application-test.properties,application-prod.properties,然后 application.properties 仅仅配置一行使用其中一种环境即可, springboot启动读取的是 application.properties 配置文件, 需要注意的是, mybatis 对应的实体包和对应数据库表映射XML文件需要在配置文件中指定,如下为各个配置文件,
#===================================================
#application-dev.properties
#===================================================
# server evn setting
#===================================================
server.address=127.0.0.1
server.port=8080
server.servlet.contextPath=/
server.session-timeout=30
#=====For MVC setting=====
spring.thymeleaf.prefix=classpath:/templates/
#spring.thymeleaf.suffix=.html
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
#===================================================
# database setting
#===================================================
#=====For connect ms sql server use jdbc pool=====
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=myDBName
spring.datasource.username=DBUserName
spring.datasource.password=DBPassword
#=====For connect mysql use jdbc pool=====
#spring.datasource.driverClassName=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myDBName?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
#spring.datasource.username=DBUserName
#spring.datasource.password=DBPassword
#=====For connect oracle db use jdbc pool=====
#spring.datasource.driverClassName=oracle.jdbc.OracleDriver
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521:oracleSID
#spring.datasource.username=DBUserName
#spring.datasource.password=DBPassword
#=====For common X DB connect setting=====
spring.datasource.initialSize=10
spring.datasource.minIdle=10
spring.datasource.maxActive=50
spring.datasource.maxWait=60000
# more setting add here...
#=====For mybatis setting======
mybatis.typeAliasesPackage=com.qyh.pro01.model,com.qyh.pro01.param
#mybatis.configLocations=classpath:mybatis/mybatis-config.xml #no active now
mybatis.mapperLocations=classpath:mapper/*.xml
#===================================================
# other setting
#===================================================
#===================================================
#application.properties
#===================================================
spring.profiles.active=dev
#active dev evn
六,启动类中相关功能注解使用
因为要使用默认的JDBC和mybatis对数据库进行操作, 所以必须在启动类中使用相应的注解并扫描各个相应的包,然后目标包中的各个含有各种注解的类对应的实例才能加载进spring容器中,才能使用,比如使用 @EntityScan扫描实体对应所在的包, @MapperScan扫描DAO层定义的接口所在的包, @ComponentScan扫描controller,service等所在的包,如下为启动类代码,
package com.qyh.springBootApp;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
/**
* springboot+mybatis+jdbc+mssql实例
* @author shenzhenNBA
* @since 2018.06.09
*/
@SpringBootApplication
@EntityScan("com.qyh.pro01.model,com.qyh.pro01.param")
@MapperScan("com.qyh.pro01.dao")
@ComponentScan("com.qyh.pro01.common"
+ ",com.qyh.pro01.controller"
+ ",com.qyh.pro01.service.impl")
public class SpringBoot01DBApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot01DBApplication.class, args);
}
}
七,工程相关的DAO接口,对应库表mapper映射的XML文件,实体model和查询参数param,业务接口,业务接口实现等等编写各个相应类或XML代码如下,
1,DAO接口类,
package com.qyh.pro01.dao;
/**
* @author shenzhenNBA
* @since 2018.06.09
*/
public abstract interface BaseDaoService<T,ID> {
public T getByRecId(ID recId);
public int insert(T t) throws Exception;
public int save(T t) throws Exception;
public int update(T t) throws Exception;
public int delete(T t) throws Exception;
public int deleteByRecId(ID recId) throws Exception;
}
package com.qyh.pro01.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
/**
* @author shenzhenNBA
* @since 2018.06.09
*/
@Repository
public interface MemberService<T, ID> extends BaseDaoService<T, ID> {
public T getMemberByMemberId(String memberId);
public List<T> queryAllMember();
}
2,实体类代码
package com.qyh.pro01.model;
/**
* @author shenzhenNBA
* @since 2018.06.09
*/
public class Member implements java.io.Serializable {
private static final long serialVersionUID=1000000000010L;
private Long recId;
private String memberId;
private String memberName;
private String sex;
public Member() {}
public Member(String memberId, String memberName) {
this.memberId = memberId;
this.memberName = memberName;
}
public Long getRecId() {
return this.recId;
}
public void setRecId(Long recId) {
this.recId = recId;
}
public String getMemberId() {
return this.memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return this.memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
package com.qyh.pro01.param;
/**
* @author shenzhenNBA
* @since 2018.06.09
*/
public class BaseParam implements java.io.Serializable {
private static final long serialVersionUID = 201608245000L;
private Long previousPage;
private Long nextPage;
private Long totalRecord;
private Long totalPage;
private Long offsetRecord;
private Long rows;
private Long page;
private String sort;
private String order;
public BaseParam() {
this.previousPage = 1L;
this.nextPage = 1L;
this.totalRecord = 1L;
this.totalPage = 1L;
this.rows = 10L;
this.page = 1L;
this.sort = "";
this.order = "";
}
public Long getPreviousPage() {
previousPage = page - 1;
if(previousPage < 1){
previousPage = 1L;
}
return previousPage;
}
public void setPreviousPage(Long previousPage) {
this.previousPage = previousPage;
}
public Long getNextPage() {
if(nextPage > totalPage){
nextPage = totalPage;
}
return nextPage;
}
public void setNextPage(Long nextPage) {
this.nextPage = nextPage;
}
public Long getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(Long totalRecord) {
if(totalRecord < 0){
totalRecord = 0L;
}
this.totalRecord = totalRecord;
}
public Long getTotalPage() {
if(totalRecord != null && rows != null){
totalPage = (totalRecord % rows == 0) ? (totalRecord / rows) : (totalRecord / rows + 1);
}else{
totalPage = 1L;
}
return totalPage;
}
public void setTotalPage(Long totalPage) {
this.totalPage = totalPage;
}
public Long getRows() {
if(rows < 1){
rows = 1L;
}
return rows;
}
public void setRows(Long rows) {
this.rows = rows;
}
public Long getPage() {
if(page < 1){
page = 1L;
}
return page;
}
public void setPage(Long page) {
this.page = page;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public Long getOffsetRecord() {
if(page != null && rows != null){
if(page < 1){
page = 1L;
}
if(page > getTotalPage()){
page = getTotalPage();
}
offsetRecord = (page - 1) * rows ;
}else{
offsetRecord = 0L;
}
return offsetRecord;
}
public void setOffsetRecord(Long offsetRecord) {
this.offsetRecord = offsetRecord;
}
}
package com.qyh.pro01.param;
/**
* @author shenzhenNBA
* @since 2018.06.09
*/
public class MemberParam extends BaseParam {
private static final long serialVersionUID = 3748682284490848846L;
private String memberId;
private String memberName;
private String sex;
public MemberParam() {}
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
3,业务类接口代码
package com.qyh.pro01.service;
/**
* @author shenzhenNBA
* @since 2018.06.09
* 业务类基本接口类
*/
public interface BaseBizService<T,ID> extends java.io.Serializable {
public T getByRecId(ID recId);
public int insert(T t) throws Exception;
public int save(T t) throws Exception;
public int update(T t) throws Exception;
public int delete(T t) throws Exception;
public int deleteByRecId(ID recId) throws Exception;
}
package com.qyh.pro01.service;
import java.util.List;
/**
* @author shenzhenNBA
* @since 2018.06.09
* 业务接口类
*/
public interface BizMemberService<T, ID> extends BaseBizService<T, ID> {
public T getMemberByMemberId(String memberId);
public List<T> queryAllMember();
}
4,业务接口实现类代码,
package com.qyh.pro01.service.impl;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.qyh.pro01.dao.MemberService;
import com.qyh.pro01.model.Member;
import com.qyh.pro01.param.MemberParam;
import com.qyh.pro01.service.BizMemberService;
/**
* @author shenzhenNBA
* @since 2018.06.09
* 业务接口实现类
*/
@Service("bizMemberService")
public class BizMemberServiceImpl implements BizMemberService<Member, Long> {
private static Log LOG = LogFactory.getLog(BizMemberServiceImpl.class);
private static final long serialVersionUID = 20170826010130L;
@Autowired
private MemberService<Member, Long> memberDaoService;
@Override
public Member getByRecId(Long recId) {
return memberDaoService.getMemberByRecId(recId);
}
@Override
public int insert(Member t) throws Exception {
return memberDaoService.insert(t);
}
@Override
public int update(Member t) throws Exception {
return memberDaoService.update(t);
}
@Override
public int delete(Member t) throws Exception {
return memberDaoService.delete(t);
}
@Override
public int deleteByRecId(Long recId) throws Exception {
return memberDaoService.deleteByRecId(recId);
}
@Override
public Member getMemberByMemberId(String memberId) {
return memberDaoService.getMemberByMemberId(memberId);
}
@Override
public List<Member> queryAllMember() {
return memberDaoService.queryAllMember();
}
}
5,库表映射mapper的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">
<!-- 注意namespace的值要跟接口所在的包路径一致 -->
<mapper namespace="com.qyh.pro01.dao.MemberService">
<resultMap id="memberList" type="com.qyh.pro01.model.Member">
<id column="recID" property="recId" />
<result column="memberID" property="memberId" />
<result column="memberName" property="memberName" />
<result column="sex" property="sex" />
</resultMap>
<select id="getMemberByRecId" parameterType="Long" resultType="Member">
select * from [member] where recID = #{recId}
</select>
<select id="getMemberByMemberId" parameterType="String" resultType="Member">
select * from [member] where memberID = #{memberId}
</select>
<select id="queryAllMember" resultMap="memberList">
<![CDATA[
select * from [member] order by recID desc
]]>
</select>
<insert id="insert" useGeneratedKeys="true" keyProperty="recId" parameterType="Member">
<![CDATA[
insert into [member] (
memberId, memberName, sex
) values (
#{memberId}, #{memberName}, #{sex}
)
]]>
<selectKey resultType="java.lang.Long" keyProperty="recId" order="AFTER">
SELECT top 1 recID from [member]
where memberName = #{memberName}
order by recID desc
</selectKey>
</insert>
<update id="update" parameterType="Member">
update [member] set
memberId = #{memberId},
memberName = #{memberName},
sex = #{sex}
where recID = #{recId}
</update>
<delete id="delete" parameterType="Member">
delete from [member] where recID = #{recId}
</delete>
<delete id="deleteByRecId" parameterType="Long">
delete from [member] where recID = #{recId}
</delete>
<delete id="deleteByMemberId" parameterType="String">
delete from [member] where memberID = #{memberId}
</delete>
</mapper>
八,controller中使用业务service,1,编写一个类,类前加注解@Controller,@RequestMapping("/member") ,同时在启动类中要扫描到本类所在的包即可,controller代码如下,
package com.qyh.pro01.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.qyh.pro01.model.Member;
import com.qyh.pro01.service.BizMemberService;
/**
* @author shenzhenNBA
* @since 2018.06.09
*/
@Controller
@RequestMapping("/member")
public class MemberController {
@Autowired
BizMemberService<Member,Long> memberService;
@RequestMapping("")
public String memberIndex (
HttpServletRequest request
,HttpServletResponse response
,HttpSession session
,Model model) {
model.addAttribute("userName", "zhangsan");
Member member = memberService.getMemberByMemberId("1000");
model.addAttribute("member", member);
return "/view/member.html";
}
@RequestMapping("/list")
public String memberList (
HttpServletRequest request
,HttpServletResponse response
,HttpSession session
,Model model) {
Member member = memberService.getMemberByMemberId("1000");
model.addAttribute("member", member);
List<Member> memberList = memberService.queryAllMember();
model.addAttribute("memberList", memberList);
return "/view/memberList.html";
}
@RequestMapping("/listjson")
@ResponseBody
public List<Member> memberListJson (
HttpServletRequest request
,HttpServletResponse response
,HttpSession session
,Model model) {
model.addAttribute("userName", "zhangsan");
List<Member> memberList = memberService.queryAllMember();
return memberList;
}
}
2,相关试图 index.html 代码,
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Home index page</h2>
<p>spring boot database project</p>
<hr size="1">
thymeleaf相关语法:
<a target="_blank" href="https://blog.csdn.net/zrk1000/article/details/72667478">
https://blog.csdn.net/zrk1000/article/details/72667478
</a>
<p>springboot通过myBatis使用默认的JDBC链接MS SQL Server查询数据
【springboot+mybatis+jdbc+ms sql server】</p>
<a href="/member">查询会员ID为1000的用户</a>
<br>
<a href="/member/list">查询会员列表 [页面]</a>
<br>
<a href="/member/listjson">查询会员列表 [JSON]</a>
</body>
</html>
试图 memberList.html 代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Member list page </h2>
<div>
<b>member ID:1000</b>
<p th:text="'recId:' + ${member.recId}"/>
<p th:text="'memberId:' + ${member.memberId}"/>
<p th:text="'memberName:' + ${member.memberName}"/>
<p th:text="'memberSex:' + ${member.sex}"/>
</div>
<br>
<b>循环列出用户列表member list:</b>
<div th:each="user : ${memberList}">
<p th:text="'recId:' + ${user.recId}"/>
<p th:text="'memberId:' + ${user.memberId}"/>
<p th:text="'memberName:' + ${user.memberName}"/>
<p th:text="'memberSex:' + ${user.sex}"/>
<hr size="1">
</div>
</body>
</html>
九,访问,
浏览器 http://localhost:8080/ 直接访问,如下图所示,
会员列表链接页面如下图,
如上所示,基本实现了在springboot中使用mybatis和默认的JDBC对数据库进行操作,欢迎拍砖...