使用原生Mybatis连接数据库进度数据读写操作,需要在Java代码中完成获取xml配置文件、通过SqlSessionFactoryBuilder
创建SqlSessionFactory
,再由SqlSessionFactory
创建SqlSession
,最后由SqlSession
发起数据读写。
//定义读取文件名
String resources = "mybatis-config.xml";
//创建流
Reader reader=null;
try {
//读取mybatis-config.xml文件到reader对象中
reader= Resources.getResourceAsReader(resources);
} catch (IOException e) {
e.printStackTrace();
}
//初始化mybatis,创建SqlSessionFactory类的实例
SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);
//创建session实例
SqlSession session=sqlMapper.openSession();
//传入参数查询,返回结果
UserVO user=session.selectOne("findById",1000);
//输出结果
System.out.println(user.getUser_name());
//关闭session
session.close();
在SpringBoot中提供了mybatis-spring-boot-starter
简化整体操作步骤,本文记录SpringBoot整合Mybatis的步骤。
开发环境
IDEA 2019.2.4 + JDK1.8 + maven 3.3.9 + mysql
数据准备
数据库名称:springbootdb
建表和数据初始化脚本:
drop table if exists demo_city_t;
CREATE TABLE demo_city_t (
city_id INT NOT NULL primary key,
city_name VARCHAR (50),
province_name VARCHAR(50),
description VARCHAR(100),
creation_date DATE,
last_update_date DATE
);
insert INTO demo_city_t VALUES(2000, 'beijing', 'BEIJING', '中国首都', current_date, current_date);
insert INTO demo_city_t VALUES(2001, 'shenzhen', 'GUANGDONG', '改革开放城市', current_date, current_date);
commit;
项目结构
src/pom.xml
文件配置依赖项.src/java/[package]/Application.java
为应用启动入口。src/java/[package]/controller/CityRestController.java
定义对外开放的Restful API,而API的实现逻辑由service承接。src/java/[package]/service/CityService.java
定义有哪些服务可以支撑API功能。src/java/[package]/service/impl/CityServiceImpl.java
实现CityService
定义的接口,会调用Dao
的方法对数据库进行读写。src/java/[package]/dao/CityDao.java
定义了进行数据库读写操作的接口方法,支撑service
的实现。src/java/[package]/domain/City.java
定义了POJO
类,用于向SQL
传递执行参数以及接收SQL
的执行结果。src/resource/application.properties
文件配置SpringBoot应用的属性,包括数据源、mybatis的SQL映射文件。src/resource/mapper/
文件夹下文件通常和src/java/[package]/dao/
一一对应,dao
的文件定义了进行数据库读写的接口,mapper
的文件定义这些接口对应的SQL脚本。
引入依赖
主要引入mybatis和mysql驱动依赖包
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot}</version>
</dependency>
<!-- MySQL 连接驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector}</version>
</dependency>
项目属性配置
src/resource/application.properties
文件
## 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
## Mybatis 配置
mybatis.typeAliasesPackage=org.spring.springboot.domain
mybatis.mapperLocations=classpath:mapper/*.xml
POJO配置
src/java/[package]/domain/City.java
文件。变量名称采用驼峰命名法,SQL查询结果的每个字段都必须要有对应的类属性。
package org.spring.springboot.domain;
public class City {
/**
* 城市编号
*/
private Long cityId;
/**
* 省份编号
*/
private Long provinceName;
/**
* 城市名称
*/
private String cityName;
/**
* 描述
*/
private String description;
public Long getCityId() {
return cityId;
}
public void setCityId(Long id) {
this.cityId = id;
}
public Long getProvinceName() {
return provinceName;
}
public void setProvinceName(Long provinceName) {
this.provinceName = provinceName;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
DAO配置
src/java/[package]/dao/CityDao.java
package org.spring.springboot.dao;
import org.apache.ibatis.annotations.Param;
import org.spring.springboot.domain.City;
/**
* 城市 DAO 接口类
*/
public interface CityDao {
/**
* 根据城市名称,查询城市信息
*
* @param cityName 城市名
*/
City findByName(@Param("cityName") String cityName);
}
Mapper配置
src/resource/mapper/CityMapper.xml
配置DAO对应SQL脚本。
<?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="org.spring.springboot.dao.CityDao">
<!--设置SQL查询结果每个字段和domain中City属性的对应关系
如果没有该配置项,就要求City.java的属性和SQL字段名称完全相同-->
<resultMap id="BaseResultMap" type="org.spring.springboot.domain.City">
<result column="city_id" property="cityId" />
<result column="province_name" property="provinceName" />
<result column="city_name" property="cityName" />
<result column="description" property="description" />
</resultMap>
<!--id和Dao中接口方法名称一一对应-->
<select id="findByName" resultMap="BaseResultMap" parameterType="java.lang.String">
select
city_id, province_name, city_name, description
from demo_city_t
where city_name = #{cityName}
</select>
</mapper>
service接口定义及实现
src/java/[package]/service/CityService.java
定义有哪些服务可以支撑API功能。
package org.spring.springboot.service;
import org.spring.springboot.domain.City;
/**
* 城市业务逻辑接口类
*/
public interface CityService {
/**
* 根据城市名称,查询城市信息
* @param cityName
*/
City findCityByName(String cityName);
}
src/java/[package]/service/impl/CityServiceImpl.java
实现CityService
定义的接口,会调用Dao
的方法对数据库进行读写。
package org.spring.springboot.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spring.springboot.dao.CityDao;
import org.spring.springboot.domain.City;
import org.spring.springboot.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 城市业务逻辑实现类
*/
@Service
public class CityServiceImpl implements CityService {
private final Logger LOG = LoggerFactory.getLogger(CityServiceImpl.class);
@Autowired
private CityDao cityDao;
public City findCityByName(String cityName) {
LOG.info("=====>Enter Servie");
return cityDao.findByName(cityName);
}
}
Restful API定义
src/java/[package]/controller/CityRestController.java
定义对外开放的Restful API,而API的实现逻辑由service承接。
package org.spring.springboot.controller;
import org.spring.springboot.domain.City;
import org.spring.springboot.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class CityRestController {
@Autowired
private CityService cityService;
@RequestMapping(value = "/api/city", method = RequestMethod.GET)
public City findOneCity(@RequestParam(value = "cityName", required = true) String cityName) {
return cityService.findCityByName(cityName);
}
}
项目入口
package org.spring.springboot;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Spring Boot 应用启动类
*/
@SpringBootApplication
// mapper 接口类扫描包配置
@MapperScan("org.spring.springboot.dao")
public class Application {
public static void main(String[] args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class,args);
}
}
启动验证
在项目入口文件下,右键运行即可。
调用接口成功,数据和后台表数据吻合,整合成功。