BBS500

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
BBS500 首页 学习笔记 java相关 查看内容

sprint boot+mybatis+sqlserver整合教程

2018-6-12 14:17| 发布者: firstadmin| 查看: 171| 评论: 0

摘要: 近来手上有项目需要用到mybatis+sqlserver,研究了许多的文章,都没有发现适合自己的文章,为了尽快上手项目就花了些时间做了一篇教程,当然sqlserver的安装或者使用请参照其他文章,这里不多说。总的来说,spring b ...

近来手上有项目需要用到mybatis+sqlserver,研究了许多的文章,都没有发现适合自己的文章,为了尽快上手项目就花了些时间做了一篇教程,当然sqlserver的安装或者使用请参照其他文章,这里不多说。总的来说,spring boot+mybatis+sqlserver,只需要注意三个方面,分别是pom.xml的配置、application.properties的sqlserver的配置、代码目录的分层(entity、dao、controller、service、utils,它们分别对应的数据库中的表、数据库访问层、控制器、服务层、工具层,service和dao采用interface和implements的方式否建目录,即一个接口文件就对应一个实现文件,当然这个两个目录的实现文件中需要使用注解以便自动装配如service和@Repository)。另外,根据个人不同的习惯,可以从controller层开始,使用resource调用service层,在service层中使用resource调用dao层,dao层的实现文件中调用utils层(如数据库持久层或者其他功能性函数)和entity。所以只要按照正常程序新建一个web应用,其他的就按照上面描述的进行开发,这样一来就不会错。下面是具体文件的实现:

1、sqlservice上创建数据库并插入数据,最终效果

2、ide上新建maven项目,pom.xml代码如下,主要是引入了spring boot和mybatis、sqlserver的驱动

<?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.example</groupId>
	<artifactId>mybatis</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>demo</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-jdbc</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>

		<dependency>
			<groupId>com.microsoft.sqlserver</groupId>
			<artifactId>mssql-jdbc</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.1.0</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			
			<plugin> 
		       <groupId>org.mybatis.generator</groupId> 
		       <artifactId>mybatis-generator-maven-plugin</artifactId> 
		       <version>1.3.2</version> 
		          <configuration>  
		            <verbose>true</verbose>  
		            <overwrite>true</overwrite>  
		          </configuration>  
		       </plugin> 
		</plugins>
	</build>


</project>

3、配置项目下面的application.properties,主要设置数据库以及端口等信息

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=student
spring.datasource.username=sa
spring.datasource.password=123456
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

server.port=8989

mybatis.mapper-locations=classpath:/com/example/demo/mapper/*.xml

4、由于main方法已经自动生成,且有spring boot的注解,所以暂不用理会,最多增加一个注解用户扫描mybatis的mapper的xml文件,如@MapperScan(“com.example.demo.mapper”)

5、先写controller,用于http的请求,路径为com.example.demo.controller包的TestBootController.java

package com.example.demo.controller;

import com.example.demo.entity.Result;
import com.example.demo.entity.Student;
import com.example.demo.service.BaseService;

import javax.annotation.Resource;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableAutoConfiguration
@RequestMapping("/testboot")

public class TestBootController {
    @Resource
	 private BaseService service;
	
    @RequestMapping("/getStudent")
    public Result getStudent() {
    	return service.getStudent();
    	
       
    }
    
    
}

在本文件中注意使用resource注解调用service层,因此接下的一步是在com.example.demo.service包中创建service接口以及实现层,如下:

6、创建service接口和serviceimpl实现

BaseService.java

package com.example.demo.service;

import com.example.demo.entity.Result;
import com.example.demo.entity.Student;

public interface BaseService {
	
	public Result getStudent();

}
ServiceImpl.java

package com.example.demo.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.example.demo.entity.Result;
import com.example.demo.dao.dao;;
@Service
public class ServiceImpl implements BaseService {
	  @Resource(name = "JdbcDao")
	    private dao dao;
	  
	@Override
	public Result getStudent() {
		 Result result = new Result();
	        try {
	            List<?> students = dao.getStudent();
	            result.setStatus(1);
	            result.setData(students);
	        } catch (Exception e) {
	        }
	        return result;
	}

}

在service接口实现文件中,使用了service注解,同时使用resource注解调用dao层,同时调用了entity的两个实例student和result,result用户最终向用户输出数据

7、创建dao和JDBCDao文件,创建entity实体

com.example.demo.entity包下两个java文件

Result.java

package com.example.demo.entity;

import java.io.Serializable;

public class Result implements Serializable {

    private static final long serialVersionUID = 7086445730263059369L;
    
    private int status;
    private Object data;

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}
com.example.demo.entity包下两个java文件

Student.java

package com.example.demo.entity;

import java.sql.Timestamp;

public class Student {
	
    private long id;
    private String name;
    private String course;
    private Timestamp addtime;
	
    public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getCourse() {
		return course;
	}
	public void setCourse(String course) {
		this.course = course;
	}
	public Timestamp getAddtime() {
		return addtime;
	}
	public void setAddtime(Timestamp addtime) {
		this.addtime = addtime;
	}
	
com.example.demo.dao包中两个java文件

dao.java

package com.example.demo.dao;

import java.util.List;

import com.example.demo.entity.Result;
import com.example.demo.entity.Student;

public interface dao {
	public List<?> getStudent();
}
com.example.demo.dao包中

JDBCDao.java

package com.example.demo.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.entity.Student;
import com.example.demo.utils.JDBCUtils;

@Repository("JdbcDao")

public class JDBCDao implements dao{

    private static final Connection conn = JDBCUtils.getConnection();

	
	@Override
	public List<?> getStudent() {
		   List<?> students = null;
	        String sql = "SELECT * FROM student";
	        try {
	            PreparedStatement pre = conn.prepareStatement(sql);
	            ResultSet rs = pre.executeQuery();
	            
	            students = JDBCUtils.TranverseToList(rs, Student.class);
	            
	            
	        } catch (Exception ex) {
	        }
	        return  students;
	}

}

在dao层接口实现文件中,注释使用了注解repository,同时初始化数据库的连接,同时调用了工具包中的数据转为集合的方法,因此创建工具类,功能为初始化数据库和数据转换函数

8、创建工具类,功能为初始化数据库和数据转换函数

com.example.demo.utils包中文件

JDBCUtils.java

package com.example.demo.utils;

import java.sql.*;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JDBCUtils {
    
    private static final Logger logger = Logger.getLogger(JDBCUtils.class.getName());
    public static Connection connection = null;
    public static PreparedStatement preparedStatement = null;
    public static ResultSet resultSet = null;

    private JDBCUtils() {
    }

    /**
     * 获取JDBC连接
     *
     * @return
     */
    public static Connection getConnection() {
    	
        System.out.println("数据库连接...");

    	
        String url = "jdbc:sqlserver://localhost:1433;databaseName=student";
        String username = "sa";
        String password = "123456";
        if (connection != null) {
            return connection;
        }
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
            connection = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        return connection;
    }

    /**
     * 关闭资源
     */
    public static void close() {
        try {
            if (connection != null) {
                connection.close();
                connection = null;
            }
            if (preparedStatement != null) {
                preparedStatement.close();
                preparedStatement = null;
            }
            if (resultSet != null) {
                resultSet.close();
                resultSet = null;
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, null, e);
        }
    }
    
    /**
     * 将结果集转换成实体对象集合
     *
     * @param rs
     * @param clazz
     * @throws SQLException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @return
     */
    public static List<?> TranverseToList(ResultSet rs, Class<?> clazz) throws SQLException, InstantiationException, IllegalAccessException {
      

    	//结果集中列的名称和类型的信息
        ResultSetMetaData rsm = rs.getMetaData();
        int colNumber = rsm.getColumnCount();
        System.out.println("开始处理结果11..."+colNumber);

        
        List<Object> list = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        
        System.out.println("开始处理结果22..."+fields[0].getName());
       
        //遍历每条记录
        while (rs.next()) {
        	
            System.out.println("开始处理结果进入while...");

        	
            //实例化对象
            Object obj = clazz.newInstance();
            
            //取出每一个字段进行赋值
            for (int i = 1; i <= colNumber; i++) {
                Object value = rs.getObject(i);
                //匹配实体类中对应的属性
                for (Field f : fields) {
                	
                	 System.out.println("开始处理结果33..."+"---"+colNumber+"---"+f.getName()+"---"+rsm.getColumnName(i));
                	 
                	
                    if (f.getName().equals(rsm.getColumnName(i))) {
                        boolean flag = f.isAccessible();
                        f.setAccessible(true);
                        f.set(obj, value);
                        f.setAccessible(flag);
                   	 System.out.println("sdfsdfsd");

                        break;
                    }
                }
            }
       	
            list.add(obj);

        }
        return list;
    }
}

备注:在创建转换数据函数TranverseToList时需要将entity中实体student属性顺序要按数据库中表的顺序进行排列,且数据类型必须要和数据库类型一直(文章后会附对应关系),否则有可能会获取不到数据,重要!!!。

9、最终的结构目录图

10、运行效果图




附sql和java默认映射关系表

SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型

bigint

BIGINT

long

timestamp

binary

BINARY

byte[]

bit

BIT

boolean

char

CHAR

String

decimal

money

smallmoney

DECIMAL

java.math.BigDecimal

float

DOUBLE

double

int

INTEGER

int

image

varbinary(max)

LONGVARBINARY

byte[]

varchar(max)

text

LONGVARCHAR

String

nchar

CHAR

NCHAR (Java SE 6.0)

String

nvarchar

VARCHAR

NVARCHAR (Java SE 6.0)

String

nvarchar(max)

ntext

LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)

String

numeric

NUMERIC

java.math.BigDecimal

real

REAL

float

smallint

SMALLINT

short

datetime

smalldatetime

TIMESTAMP

java.sql.Timestamp

varbinary

udt

VARBINARY

byte[]

varchar

VARCHAR

String

tinyint

TINYINT

short

uniqueidentifier

CHAR

String

xml

LONGVARCHAR

SQLXML (Java SE 6.0)

String

SQLXML

time

TIME (1)

java.sql.Time (1)

date

DATE

java.sql.Date

datetime2

TIMESTAMP

java.sql.Timestamp

datetimeoffset (2)

microsoft.sql.Types.DATETIMEOFFSET

microsoft.sql.DateTimeOffset


鲜花

握手

雷人

路过

鸡蛋

最新评论

QQ|Archiver|手机版|小黑屋|BBS500 ( 蜀ICP备16012380号-1 )

GMT+8, 2019-10-19 14:38 , Processed in 0.018716 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部