1、POM依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
2、测试用数据库表结构
mysql数据库为test,数据库表为teacher,创建表语句如下:
create table teacher(
tec_id varchar(16) not null primary key,
tec_name varchar(16) not null,
tec_age tinyint unsigned,
tec_desc varchar(128)
);
往数据库插入一条数据
3、springboot maven 项目目录结构
4、配置到application.properties,添加MySQL数据库连接
#数据库连接:注意要加上时区 spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver #配置mapper.xml文件存放路径 mybatis.mapper-locations=classpath:mapper/*.xml
5、在创建的mybatis目录(目录名可任意命名)下,新建MyBatis 数据库 Configuration 文件
package com.rctech.testmybatis.mybatis;
//import com.github.pagehelper.PageHelper;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jndi.JndiObjectFactoryBean;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.util.Properties;
/**
* Created by wzj on 2018/3/17.
*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class MyBatisConfiguration
{
/**
* url
*/
private String url;
/**
* 驱动名称
*/
private String driverClassName;
/**
* 数据库名
*/
private String username;
/**
* 数据库密码
*/
private String password;
public String getUrl()
{
return url;
}
public void setUrl(String url)
{
this.url = url;
}
public String getDriverClassName()
{
return driverClassName;
}
public void setDriverClassName(String driverClassName)
{
this.driverClassName = driverClassName;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
@Bean(name = "dataSource")
public DriverManagerDataSource dataSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(driverClassName);
driverManagerDataSource.setUrl(url);
driverManagerDataSource.setUsername(username);
driverManagerDataSource.setPassword(password);
return driverManagerDataSource;
}
/*
*使用JNDI方式连接数据库
@Bean
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
bean.setJndiName("java:/comp/env/jdbc/test");
bean.setProxyInterface(DataSource.class);
bean.setLookupOnStartup(false);
bean.afterPropertiesSet();
return (DataSource) bean.getObject();
}
*/
}
6、配置工程主入口类Application,添加@MapperScan注解
package com.rctech.testmybatis;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@MapperScan("com.rctech.testmybatis.mapper")
public class TestmybatisApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(TestmybatisApplication.class, args);
}
/*
* 用阿里连接池druid
@Bean(destroyMethod = "close", initMethod = "init")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
*/
/**
* Configure the application. Normally all you would need to do it add sources (e.g.
* config classes) because other settings have sensible defaults. You might choose
* (for instance) to add default command line arguments, or set an active Spring
* profile.
*
* @param builder a builder for the application context
* @return the application builder
* @see SpringApplicationBuilder
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder)
{
//return super.configure(builder); //这样也可行
return builder.sources(TestmybatisApplication.class);
}
}
7、在创建的entity目录下,新建Bean实体类(本例为TeacherBean.java),与数据库表结构形成映射关系
package com.rctech.testmybatis.entity;
public class TeacherBean {
private String tecId;
private String tecName;
private int tecAge;
private String tecDesc;
public String getTecId()
{
return tecId;
}
public void setTecId(String tecId)
{
this.tecId = tecId;
}
public String getTecName()
{
return tecName;
}
public void setTecName(String tecName)
{
this.tecName = tecName;
}
public int getTecAge()
{
return tecAge;
}
public void setTecAge(int tecAge)
{
this.tecAge = tecAge;
}
public String getTecDesc()
{
return tecDesc;
}
public void setTecDesc(String tecDesc)
{
this.tecDesc = tecDesc;
}
@Override
public String toString()
{
return "TeacherBean{" + "tecId='" + tecId + '\'' + ", tecName='" + tecName + '\'' + ", tecAge=" + tecAge + ", tecDesc='" + tecDesc + '\'' + '}';
}
}
8、在mapper目录下,新建TeacherMapper.java文件,定义数据库查询接口
package com.rctech.testmybatis.mapper;
import com.rctech.testmybatis.entity.TeacherBean;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TeacherMapper {
/**
* 通过id查询老师信息
* @param id id
* @return teacher信息
*/
TeacherBean getTeacherById(@Param("id") String id);
}
9、在/resources/mapper/目录新建TeacherMapper.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.rctech.testmybatis.mapper.TeacherMapper">
<resultMap id="BaseResultMap" type="com.rctech.testmybatis.entity.TeacherBean">
<result column="tec_id" property="tecId" jdbcType="VARCHAR"/>
<result column="tec_name" property="tecName" jdbcType="VARCHAR"/>
<result column="tec_age" property="tecAge" jdbcType="INTEGER"/>
<result column="tec_desc" property="tecDesc" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
tec_id, tec_name, tec_age,tec_desc
</sql>
<select id="getTeacherById" resultMap="BaseResultMap" parameterType="java.lang.String">
select
<include refid="Base_Column_List" />
from teacher
where tec_id = #{id}
</select>
</mapper>
10、在controller 目录下,新建控制器TeacherController.java和服务TeacherService.java
package com.rctech.testmybatis.controller;
import com.rctech.testmybatis.service.TeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TeacherController
{
/**
* 注入服务
*/
@Autowired
private TeacherService teacherService;
/**
* 查询老师信息
* @param id id
* @return 信息
*/
@RequestMapping(value = "/teacher")
public String getTeacherMessage(String id)
{
return teacherService.queryTeacher(id).toString();
}
}
11、(11)测试
启动SpringBoot,浏览器输入http://localhost:8080/teacher?id=1001
大功告成!
重要:测试过程中遇到的几个坑,总结如下
1、maven POM中,mybatis依赖必须填上相应的版本号
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
2、必须在mapper接口类中添加@Mapper注解,在主入口Application类中添加@
@Mapper
public interface TeacherMapper {
/**
* 通过id查询老师信息
* @param id id
* @return teacher信息
*/
TeacherBean getTeacherById(@Param("id") String id);
}
@SpringBootApplication @MapperScan("com.rctech.testmybatis.mapper") public class TestmybatisApplication extends SpringBootServletInitializer {
public static void main(String[] args) { SpringApplication.run(TestmybatisApplication.class, args); }
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder)
{
//return super.configure(builder); //这样也可行
return builder.sources(TestmybatisApplication.class);
}
}
3、@Mapper、@MapperScan程序老提示找不到标识符,不能自动导入依赖类,不知为啥,需要人工添加,对应的依赖类如下:
@Mapper:
import org.apache.ibatis.annotations.Mapper;
@MapperScan:
import org.mybatis.spring.annotation.MapperScan;
4、有些诸如@ConfigurationProperties注解,老出现没注册或不识别的符号等提示,只要不是ERROR级别的,能正常运行,不影响,可能过setting->editor->Inspections将提示级别降低。
5、在application属性中添加mapper.xml存放路径,以便系统到自动找到XML文件;
#配置mapper.xml文件存放路径
mybatis.mapper-locations=classpath:mapper/*.xml
6、将resource目录下的mapper文件夹映射为资源类
设置方法见下图:选中mapper文件夹,点上方的Resources按钮,右边Resource Folders下就出现选中的方件夹了。
7、关于MySQL URL,高版本的MySQL,必须在URL上包括时区,否则打开网页出错,会提示时区错误。
8、MySQL8 每次执行SQL时会提示ERR:1055错误,需在SQL mode中去掉ONLY_FULL_GROUP_BY :
select version(),@@sql_mode;
可以看到第一个便是ONLY_FULL_GROUP_BY。
#去掉ONLY_FULL_GROUP_BY
set @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'