springboot中使用mybatis和默认的JDBC对数据库进行操作

在springboot中使用mybatis和默认的JDBC对数据库进行操作,本例是使用MS SQL Server 2008数据库,建立一个例子如下,
一,准备工作
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对数据库进行操作,欢迎拍砖...

猜你喜欢

转载自blog.csdn.net/shenzhenNBA/article/details/80637972
今日推荐