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)
);

往数据库插入一条数据

SpringBoot+Mybatis连接MySQL数据库方法及注意事项

 

3、springboot maven 项目目录结构

SpringBoot+Mybatis连接MySQL数据库方法及注意事项

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

SpringBoot+Mybatis连接MySQL数据库方法及注意事项

大功告成!

 

重要:测试过程中遇到的几个坑,总结如下

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下就出现选中的方件夹了。

SpringBoot+Mybatis连接MySQL数据库方法及注意事项

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'

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 

 

 
 

 

 

 

 

 

 

 

 

 

 

相关文章: