Spring Boot集成MyBatis开发Web项目

1、Maven构建Spring Boot

创建Maven Web工程,引入spring-boot-starter-parent依赖

<project xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&#34;&gt;<br/>
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br/>
&lt;groupId&gt;xyz.ibenben&lt;/groupId&gt;<br/>
&lt;artifactId&gt;zhongdian&lt;/artifactId&gt;<br/>
&lt;packaging&gt;war&lt;/packaging&gt;<br/>
&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;name&gt;zhongdian Maven Webapp&lt;/name&gt;<br/>
&lt;url&gt;http://maven.apache.org&lt;/url&gt;

&lt;!– Inherit defaults from Spring Boot –&gt;

&lt;parent&gt;<br/>
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
    &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;<br/>
    &lt;version&gt;1.4.0.BUILD-SNAPSHOT&lt;/version&gt;<br/>
&lt;/parent&gt;

&lt;!– Add typical dependencies for a web application –&gt;

&lt;dependencies&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;<br/>
&lt;/dependencies&gt;

&lt;!– Package as an executable jar –&gt;

&lt;build&gt;<br/>
    &lt;plugins&gt;<br/>
        &lt;plugin&gt;<br/>
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;<br/>
        &lt;/plugin&gt;<br/>
    &lt;/plugins&gt;<br/>
&lt;/build&gt;

&lt;!– Add Spring repositories –&gt;

&lt;!-- (you don&#39;t need this if you are using a .RELEASE version) --&gt;<br/>
&lt;repositories&gt;<br/>
    &lt;repository&gt;<br/>
        &lt;id&gt;spring-snapshots&lt;/id&gt;<br/>
        &lt;url&gt;http://repo.spring.io/snapshot&lt;/url&gt;<br/>
        &lt;snapshots&gt;<br/>
            &lt;enabled&gt;true&lt;/enabled&gt;<br/>
        &lt;/snapshots&gt;<br/>
    &lt;/repository&gt;<br/>
    &lt;repository&gt;<br/>
        &lt;id&gt;spring-milestones&lt;/id&gt;<br/>
        &lt;url&gt;http://repo.spring.io/milestone&lt;/url&gt;<br/>
    &lt;/repository&gt;<br/>
&lt;/repositories&gt;<br/>
&lt;pluginRepositories&gt;<br/>
    &lt;pluginRepository&gt;<br/>
        &lt;id&gt;spring-snapshots&lt;/id&gt;<br/>
        &lt;url&gt;http://repo.spring.io/snapshot&lt;/url&gt;<br/>
    &lt;/pluginRepository&gt;<br/>
    &lt;pluginRepository&gt;<br/>
        &lt;id&gt;spring-milestones&lt;/id&gt;<br/>
        &lt;url&gt;http://repo.spring.io/milestone&lt;/url&gt;<br/>
    &lt;/pluginRepository&gt;<br/>
&lt;/pluginRepositories&gt;<br/>

&lt;/project&gt;

使用spring-boot-starter-parent来构建Spring Boot项目是一个非常好的方法,但非常多项目本身就是依赖其他的父模块的,再或者spring-boot-starter-parent默认提供的那么多配置和功能我们用不到。

我们也能够使用其他的依赖方式来引入Spring Boot。

&lt;dependencyManagement&gt;

 &lt;dependencies&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;!-- Import dependency management from Spring Boot --&gt;<br/>
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-dependencies&lt;/artifactId&gt;<br/>
        &lt;version&gt;1.4.0.BUILD-SNAPSHOT&lt;/version&gt;<br/>
        &lt;type&gt;pom&lt;/type&gt;<br/>
        &lt;scope&gt;import&lt;/scope&gt;<br/>
    &lt;/dependency&gt;<br/>
&lt;/dependencies&gt;<br/>

&lt;/dependencyManagement&gt;

2、Spring Boot项目的代码结构

Spring Boot项目与一般的Java Web项目的代码结构没有太大的差别或要求,但为了降低配置的数量(无配置),Spring Boot也有一些比較好的建议。

com
+- example

 +- myproject<br/>
     +- Application.java<br/>
     |<br/>
     +- domain<br/>
     |   +- Customer.java<br/>
     |   +- CustomerRepository.java<br/>
     |<br/>
     +- service<br/>
     |   +- CustomerService.java<br/>
     |<br/>
     +- web<br/>
         +- CustomerController.java</code></pre>

2.1 不要使用默认的包路径

我们交由Spring管理的类,须要放入一个包下。例如以下图中的DefaultClass.java是不行的。由于Spring Boot对带注解的类进行扫描的时候,这些默认包路径下的类会出问题。

当然。基于代码规范的要求。一般的程序猿都不会这样子构建自己的代码。这里说明是为了真的遇到这样的情况出问题时。能够高速地解决这个问题。

2.2 Spring Boot应用入口

package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; @Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application { public static void main(String[] args) {

    SpringApplication.run(Application.class, args);<br/>
}

}

入口类Application带main方法,我们直接执行main方法就能启动Spring Boot项目了,这样极大程序地方便了我们调试程序和项目。

Application类说明自己是Spring Boot的入口类,那么须要增加@Configuration注解。

@EnableAutoConfiguration习惯放在主方法类Application上。当项目执行时,Spring容器去自己主动查找带特定注解的类,如:带@Entity、@Service等类。

@ComponentScan假设不带basePackage 属性的话。它会自己主动扫描以入口类所在的包为父节点下全部子包下的类。这也是Spring Boot会提议我们把Application类放于根包路径下。

假设我们的项目和Spring Boot建议的代码结构一样。Application类放在根包路径下。

那么我们能够使用@SpringBootApplication来取代上面三个注解。

package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Application { public static void main(String[] args) {

    SpringApplication.run(Application.class, args);<br/>
}

}

3、Spring Boot的Web项目实现

3.1 Application类支持Web应用

@SpringBootApplication
public class Application extends SpringBootServletInitializer { @Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {<br/>
    return application.sources(Application.class);<br/>
}

public static void main(String[] args) throws Exception {

    SpringApplication.run(Application.class, args);<br/>
}

}

入口类Application继承SpringBootServletInitializer并重写configure方法。执行主方法后,会将我们的web项目打包成war,并默认启动一个端口为8080的tomcat容器来执行我们的Web项目。

3.2 其他server软件支持

假设我们不想使用tomcat,而是其他的server软件。如Jetty。

你须要移除tomcat的依赖,并增加Jetty的依赖。

&lt;dependency&gt;

&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
&lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;<br/>
&lt;exclusions&gt;<br/>
    &lt;exclusion&gt;<br/>
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt;<br/>
    &lt;/exclusion&gt;<br/>
&lt;/exclusions&gt;<br/>

&lt;/dependency&gt;
&lt;dependency&gt;

&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
&lt;artifactId&gt;spring-boot-starter-jetty&lt;/artifactId&gt;<br/>

&lt;/dependency&gt;

3.3 server端口更改

增加application.yml配置文件。

# Server settings
server:

port: 80<br/>
address: 127.0.0.1</code></pre>

这里须要注意。yml配置文件是的值属性前面必须有一个空格。假设没有空格,Spring的解析器会忽略此配置项。

3.4 Controller

Spring支持Spring MVC的Controler的使用方式。

请參考:http://blog.csdn.net/p_3er/article/category/2868979

Spring Boot应用中@RestController的Controller带有默认基于Jackson2的对象转JSON功能。如:

@RestController
public class MyController { @RequestMapping(“/thing”)

public MyThing thing() {<br/>
        return new MyThing();<br/>
}

}

3.5 配置编码及JSP支持

# SPRING PROFILES
spring:

# HTTP ENCODING<br/>
http:<br/>
    encoding.charset: UTF-8<br/>
    encoding.enable: true<br/>
    encoding.force: true<br/>
mvc:<br/>
    view.prefix: /WEB-INF/jsp/<br/>
    view.suffix: .jsp</code></pre>

增加以上配置后,还须要引入用于编译jsp的jasper包依赖。

        &lt;dependency&gt;

        &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;<br/>
        &lt;scope&gt;provided&lt;/scope&gt;<br/>
    &lt;/dependency&gt;</code></pre>

增加JSP支持配置后,以下a方法和b方法者是跳转到/WEB-INF/jsp/regiester.jsp页面。

package xyz.letus.boot.controller;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
@RequestMapping(“/page”)
public class PageController { @RequestMapping(“/a”)

public String b(Map&lt;String, Object&gt; model){<br/>
    model.put(&#34;msg&#34;, &#34;张三&#34;);<br/>
    return &#34;regiester&#34;;<br/>
}

@RequestMapping(“/b”)

public ModelAndView b(HttpServletRequest request){<br/>
    ModelAndView view = new ModelAndView();<br/>
    view.setViewName(&#34;regiester&#34;);

request.setAttribute(“msg”, “Davie”);

    return view;<br/>
}<br/>

}

3.6 Spring Boot应用实现热部署

在插件管理中增加springloaded依赖就能够。

 &lt;!– Package as an executable jar –&gt;

&lt;build&gt;<br/>
    &lt;plugins&gt;<br/>
        &lt;plugin&gt;<br/>
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;<br/>
            &lt;dependencies&gt;<br/>
            &lt;!-- spring热部署--&gt;<br/>
            &lt;dependency&gt;<br/>
                &lt;groupId&gt;org.springframework&lt;/groupId&gt;<br/>
                &lt;artifactId&gt;springloaded&lt;/artifactId&gt;<br/>
            &lt;/dependency&gt;<br/>
        &lt;/dependencies&gt;<br/>
        &lt;/plugin&gt;<br/>
    &lt;/plugins&gt;<br/>
&lt;/build&gt;</code></pre>

当系统通过 mvn spring-boot:run启动或者 右键application debug 启动java文件时,系统会监视classes文件,当有classes文件被修改时,系统会又一次载入类文件,不用重新启动启动服务。

注:使用application run(非debug模式下),热部署功能会失效。

4、Spring Boot集成MyBatis

4.1 增加基础依赖

MyBatis:

&lt;!– https://mvnrepository.com/artifact/org.mybatis/mybatis –&gt;

    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.mybatis&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;mybatis&lt;/artifactId&gt;<br/>
        &lt;version&gt;3.4.0&lt;/version&gt;<br/>
    &lt;/dependency&gt;

mybatis-spring-boot-starter:

&lt;!– https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter –&gt;

    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt;<br/>
        &lt;version&gt;1.1.1&lt;/version&gt;<br/>
    &lt;/dependency&gt;</code></pre>

MySQL:

&lt;!– https://mvnrepository.com/artifact/mysql/mysql-connector-java –&gt;

    &lt;dependency&gt;<br/>
        &lt;groupId&gt;mysql&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;</code></pre>

4.2 数据库配置

# SPRING PROFILES
spring:

# DATASOURCE<br/>
datasource:<br/>
    driverClass: com.mysql.jdbc.Driver<br/>
    url: jdbc:mysql://127.0.0.1:3306/hire?useUnicode=true&amp;characterEncoding=utf-8<br/>
    username: root<br/>
    password: test  </code></pre>

4.3 引入通用Mapper

  • 引入依赖
        &lt;dependency&gt;

        &lt;groupId&gt;tk.mybatis&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;mapper&lt;/artifactId&gt;<br/>
        &lt;version&gt;3.3.7&lt;/version&gt;<br/>
    &lt;/dependency&gt;</code></pre>

  • 配置通用Mapper
package xyz.ibenben.zhongdian.common.configure;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import tk.mybatis.spring.mapper.MapperScannerConfigurer; import java.util.Properties; @Configuration
public class MyBatisMapperScannerConfig { @Bean

public MapperScannerConfigurer mapperScannerConfigurer() {<br/>
    MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();<br/>
    mapperScannerConfigurer.setSqlSessionFactoryBeanName(&#34;sqlSessionFactory&#34;);<br/>
    mapperScannerConfigurer.setBasePackage(&#34;xyz.ibenben.zhongdian.*.dao&#34;);<br/>
    Properties properties = new Properties();<br/>
    properties.setProperty(&#34;mappers&#34;, &#34;xyz.ibenben.zhongdian.common.BaseDao&#34;);<br/>
    properties.setProperty(&#34;notEmpty&#34;, &#34;false&#34;);<br/>
    properties.setProperty(&#34;IDENTITY&#34;, &#34;MYSQL&#34;);<br/>
    mapperScannerConfigurer.setProperties(properties);<br/>
    return mapperScannerConfigurer;<br/>
}

}

事实上MyBatisMapperScannerConfig 是一个MyBatis扫描Mapper接口扫描。

MapperScannerConfigurer依据指定的创建接口或注解创建映射器。我们这里映射了xyz.ibenben.zhongdian.*.dao包下的接口。

使用MapperScannerConfigurer。没有必要去指定SqlSessionFactory或SqlSessionTemplate,由于MapperScannerConfigurer将会创建MapperFactoryBean,之后自己主动装配。可是,假设你使用了一个以上的DataSource(因此,也是多个的SqlSessionFactory),那么自己主动装配可能会失效。这样的情况下,你能够使用sqlSessionFactory或sqlSessionTemplate属性来设置正确的工厂/模板。

注意的是网络上有些文章中在MapperScannerConfigurer之前还配置了 MyBatisConfig。由于MapperScannerConfigurer会创建MapperFactoryBean,所以我的项目中没有再配置MyBatisConfig。经使用没有出现不论什么问题。

4.4 通用Mapper的使用(Dao层)

BaseDao:

package xyz.ibenben.zhongdian.common;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper; public interface BaseDao&lt;T&gt; extends Mapper&lt;T&gt;,MySqlMapper&lt;T&gt;{ }

*Dao:

package xyz.ibenben.zhongdian.system.dao;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import xyz.ibenben.zhongdian.common.BaseDao;
import xyz.ibenben.zhongdian.system.entity.User; public interface UserDao extends BaseDao&lt;User&gt;{ @Select(“select * from user where state = #{state}”)

public List&lt;User&gt; selectByState(Integer state);<br/>

}

MyBatis的Dao与其他的ORM框架不一样的是,MyBatis的Dao事实上就是Mapper,是一个接口。是通过MapperScannerConfigurer扫描后生成实现的,我们不须要再写Dao接口的实现。

4.5 业务处理及事务(Service层)

package xyz.ibenben.zhongdian.system.service;
import xyz.ibenben.zhongdian.system.entity.User;
public interface UserService {

public void saveUser(User user);<br/>

}

package xyz.ibenben.zhongdian.system.service.impl;
import java.util.List;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import xyz.ibenben.zhongdian.system.dao.TaskDao;
import xyz.ibenben.zhongdian.system.dao.UserDao;
import xyz.ibenben.zhongdian.system.entity.Task;
import xyz.ibenben.zhongdian.system.entity.User;
import xyz.ibenben.zhongdian.system.service.UserService; @Service
public class UserServiceImpl implements UserService{

@Autowired<br/>
private UserDao userDao;<br/>
@Autowired<br/>
private TaskDao taskDao;

@Transactional

public void saveUser(User user){<br/>
    user = userDao.selectByPrimaryKey(1);<br/>
    user.setUsername(&#34;5566&#34;);<br/>
    userDao.updateByPrimaryKey(user);<br/>

// int i = 100;

    Task task = new Task();<br/>
    task.setName(&#34;task 100&#34;);<br/>
    task.setDescript(&#34;task100 descriot&#34;);<br/>
    task.setState(1);<br/>
    taskDao.insert(task);

Task temp = new Task();

    task.setState(1);<br/>
    List&lt;Task&gt; list = taskDao.selectByRowBounds(temp, new RowBounds(2, 12));<br/>
    System.out.println(list.size());<br/>
    for(Task t : list){<br/>
        System.out.println(t.getName());<br/>
    }

List&lt;User&gt; users = userDao.selectByState(1);

    for(User u : users){<br/>
        System.out.println(u.getUsername());<br/>
    }<br/>
}<br/>

}

Spring Boot集成MyBatis后,实现事物管理的方法非常easy,仅仅须要在业务方法前面加上@Transactional注解就能够了。

上面方法中用了一个被除数为0的表达式来进行測试事务。

5、完整源代码下载