版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
开发环境
- IDE: intellJ idea 2019.1
- Tomcat: tomcat 8
- JDK:Java 1.8
- gradle: 2.14.1
步骤
-
创建项目
在指定gradle的时候,可以指定本地的gradle路径,或者使用 recommanded 的gradle(创建时会自动下载)
-
编辑
build.gradle
文件build.gradle
是gradle默认执行的文件主要代码是:
//build.gradle //这是不指定本地gradle的做法,如果指定本地gradle,可以将 buildscript 这段删掉 buildscript { ext { springBootVersion = '1.5.4.RELEASE' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } //使用 阿里云的库 } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: "application" version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } } configurations { providedRuntime } // 这段待会再解释,主要因为 idea IDE 编译时不会主动处理 xml 文件 task copyMapping(type: Copy) { copy { from("src/main/java") { include("com/test/demo/mapper/*.xml") } into("${projectDir}/build/resources/main") //请确认你的编译输出路径是这样的 } } //引入相关依赖 dependencies { compile('org.springframework.boot:spring-boot-starter-web') //必备 compile('org.springframework.boot:spring-boot-starter-thymeleaf') //必备 providedRuntime('org.springframework.boot:spring-boot-starter-tomcat') compile("org.springframework.boot:spring-boot-starter-jdbc:${springBootVersion}") compile('org.springframework.boot:spring-boot-starter-test') compile('org.springframework.boot:spring-boot-starter') compile('mysql:mysql-connector-java:5.1.38') compile group: 'org.mybatis', name: 'mybatis', version: '3.4.1' compile group: 'org.mybatis', name: 'mybatis-spring', version: '1.3.0' }
-
编辑代码
创建完后的项目结构如下图3.1
User.java
//实体类,方法为getter/setter方法,没啥好说的 package com.test.demo.entities; public class User { private Integer userid; private String name; private Integer age; private String address; private String password; public String getPassword() { return password; } public String getName() { return name; } public String getAddress() { return address; } public Integer getUserid() { return userid; } public Integer getAge() { return age; } public void setPassword(String password) { this.password = password; } public void setUserid(Integer userid) { this.userid = userid; } public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void setAddress(String address) { this.address = address; } //这个是类强制转为String时调用的函数 @Override public String toString() { return "name:"+this.name+"\npassword:"+this.password; } }
3.2
UserMapper.java
// Mapper类,用以作为与 持久层(数据库)打交道的类 package com.test.demo.mapper; import com.test.demo.entities.User; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { List<User> getAllUsers(); }
3.3
UserMapper.xml
<!--本文件涉及到 Mybatis 的语法,请先行学习 --> <!--本配置文件用以将 UserMapper进行配置,至于为什么使用配置文件,是为了解耦,方便修改 --> <?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.test.demo.mapper.UserMapper"> <resultMap id="map" type="com.test.demo.entities.User"> <result column="userid" property="userid" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="INTEGER"/> <result column="address" property="address" jdbcType="VARCHAR"/> <result column="password" property="password" jdbcType="VARCHAR"/> </resultMap> <!-- id 的值必须要与 Mapper.java 中的某一方法的方法名相同,resultType 代表返回的类型是啥,Mybatis可以帮你自动装配--> <select id="getAllUsers" resultType="com.test.demo.entities.User" resultMap="map"> select * from user ; </select> </mapper>
3.4 TestService.java
// 定义服务的接口,面向接口编程
package com.test.demo.service;
import com.test.demo.entities.User;
import java.util.List;
public interface TestService {
// public Boolean validateUser(String username, String password);
public List<User> getAllUsers();
public User aUser();
}
3.5 TestSeviceImpl.java
//TestService 的实现类
package com.test.demo.service.impl;
import com.test.demo.entities.User;
import com.test.demo.mapper.UserMapper;
import com.test.demo.service.TestService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class TestServiceImpl implements TestService {
//自动装配,注入(实际就是Spring框架将userMapper类实例化并赋值给 userMapper变量)
@Resource
private UserMapper userMapper;
@Override
public List<User> getAllUsers() {
return userMapper.getAllUsers();
}
3.5 TestController.java
package com.test.demo.controller;
import com.test.demo.service.TestService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Controller
public class TestController {
@Resource
private TestService testService;
//这个方法处理的请求url
@RequestMapping("/")
// 说明这个方法返回的String是作为响应的内容返回,而不是返回给spring 进行字符串拼接以便返回 jsp/html 页面等
@ResponseBody
public String index(){
//看这里,只需要直接调用testService 即可获取数据,无需了解具体的实现细节,体现封装性、解耦以及方便拓展
return testService.getAllUsers().toString();
}
@RequestMapping("/say")
@ResponseBody
public String say(){
return "helloWorld";
}
}
3.6 Main.java
package com.test.demo;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.DependsOn;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import java.sql.SQLException;
// 这个注解说明这个是 SpringBoot 启动项目的入口
@SpringBootApplication
@ComponentScan(basePackages = "com.test.demo")
@MapperScan(basePackages = "com.test.demo.mapper",sqlSessionFactoryRef = "sqlSessionFactory")
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
}
// 初始化数据源
@Bean("masterDatasource")
// 说明配置文件前缀
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDatasource(){
return new DataSource();
}
//初始化 sql会话工厂
@Bean(name = "sqlSessionFactory")
@DependsOn("masterDatasource")
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Throwable {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 下面注释掉的语句用以显式注明 Mybatis 去哪找 返回的实体类以及去哪找 Mapper.xml 文件
// bean.setTypeAliasesPackage("com.test.demo.entites");
// Resource[] resources = new PathMatchingResourcePatternResolver()
// .getResources("classpath:mapper/*.xml");
// bean.setMapperLocations(resources);
return bean.getObject();
}
}
如果不显式说明mapper.xml 的地址,则Mybatis默认(隐式)会在两个地方寻找 xml文件 (以下所说的路径 都是指编译输出路径,而不是源代码路径)
- 在
Mapper.class
所在的目录下- 在 resources 目录下的、与
Mapper.class
相同路径名的目录下寻找。举个例子, 本文UserMapper.java
编译输出后的路径是build/classes/main/com/test/demo/mapper/UserMapper.class
,那么Mybatis 就会去 寻找build/resources/main/com/test/demo/mapper/UserMapper.xml
是否存在,如果不存在,则会报
因此,由于 idea IDE 在编译时会自动忽略 *.xml 文件,所以我们就得使用copyMapping
(见第2点)来将所有的xml文件移动到resources
下的相应路径。
3.5 application.properties
# 在 resources 下创建这个文件,文件名必须为 application.properties 或 application.yml ,否则 springboot 无法识别
spring.datasource.master.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true
spring.datasource.master.username=USERNAME
spring.datasource.master.password=PASSWORD
spring.datasource.master.driverClassName=com.mysql.jdbc.Driver
- 创建数据库
注意事项:
1. 数据库名为:ssm
——与application.properties
中 url 指明访问的数据库名一致
2. 表名为user
—— 与 3.3节UserMapper.xml
中select * from user;
中指明数据表名一致
3. 数据类型要一致——留意看User.java
中各个成员变量的类型 与UserMapper.xml
中的resultMap
中的相应类型,你会有所发现,如果不一致,Mybatis 无法帮你匹配好。
4. 最后记得插进几条数据,不然就算系统运行起来了,也找不到任何数据
- 运行配置
要在build之后,将 xml 文件copy到相应路径,所以需要指定
copyMapping
任务。
- 最终项目结构
├─.gradle
│ └─2.14.1
│ └─taskArtifacts
├─.idea
│ └─modules
├─out //输出文件
│ └─production
│ ├─classes
│ │ └─com
│ │ └─test
│ │ └─demo
│ │ ├─controller
│ │ ├─entities
│ │ ├─mapper
│ │ └─service
│ │ └─impl
│ └─resources
│ └─com
│ └─test
│ └─demo
│ └─mapper
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─test
│ │ └─demo
│ │ ├─controller
│ │ ├─entities
│ │ ├─mapper
│ │ └─service
│ │ └─impl
│ └─resources
└─test
├─java
└─resources
- 相关链接:
6.1 源代码: https://gitee.com/klli852/springBoot