<div id="article\_content" class="article\_content tracking-ad" data-mod="popu\_307" data-dsm="post" style="overflow: hidden;"> <div class="markdown\_views"><p>最近比较忙,没来得及抽时间把MyBatis的集成发出来,其实mybatis官网在2015年11月底就已经发布了对SpringBoot集成的Release版本,Github上有代码:<a href="https://github.com/mybatis/mybatis-spring-boot" target="\_blank">https://github.com/mybatis/mybatis-spring-boot</a> <br> 前面对JPA和JDBC连接数据库做了说明,本文也是参考官方的代码做个总结。</p> <p>先说个题外话,SpringBoot默认使用 org.apache.tomcat.jdbc.pool.DataSource <br> 现在有个叫 HikariCP 的JDBC连接池组件,据说其性能比常用的 c3p0、tomcat、bone、vibur 这些要高很多。 <br> 我打算把工程中的DataSource变更为HirakiDataSource,做法很简单: <br> 首先在application.properties配置文件中指定dataSourceType</p></br> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">spring<span class="hljs-preprocessor">.datasource</span></br><span class="hljs-preprocessor">.type</span>=<span class="hljs-keyword">com</span></br><span class="hljs-preprocessor">.zaxxer</span></br><span class="hljs-preprocessor">.hikari</span></br><span class="hljs-preprocessor">.HikariDataSource</span></br></code></pre> <p>然后在pom中添加Hikari的依赖</p> <pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">dependency</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>com.zaxxer<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>HikariCP<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span></br> <span class="hljs-comment"><!-- 版本号可以不用指定,Spring Boot会选用合适的版本 --></span></br> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span></code></pre> <p>言归正传,下面说在Spring Boot中配置MyBatis。 <br> 关于在Spring Boot中集成MyBatis,可以选用基于注解的方式,也可以选择xml文件配置的方式。通过对两者进行实际的使用,还是建议使用XML的方式(官方也建议使用XML)。</p> <p>下面将介绍通过xml的方式来实现查询,其次会简单说一下注解方式,最后会附上分页插件(PageHelper)的集成。</p> <h3 id="一通过xml配置文件方式"><a name="t0"></a>一、通过xml配置文件方式</h3> <h4 id="1添加pom依赖"><a name="t1"></a>1、添加pom依赖</h4> <pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">dependency</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.mybatis.spring.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>mybatis-spring-boot-starter<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span></br> <span class="hljs-comment"><!-- 请不要使用1.0.0版本,因为还不支持拦截器插件,1.0.1-SNAPSHOT 是博主写帖子时候的版本,大家使用最新版本即可 --></span></br> <span class="hljs-tag"><<span class="hljs-title">version</span>></span>1.0.1-SNAPSHOT<span class="hljs-tag"></<span class="hljs-title">version</span>></span></br> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span></code></pre> <h4 id="2创建接口mapper不是类和对应的mapperxml文件"><a name="t2"></a>2、创建接口Mapper(不是类)和对应的Mapper.xml文件</h4> <p>定义相关方法,注意方法名称要和Mapper.xml文件中的id一致,这样会自动对应上 <br> StudentMapper.java</p> <pre class="prettyprint" name="code"><code class="hljs php has-numbering">package org.springboot.sample.mapper;</br> import java.util.<span class="hljs-keyword">List</span>;</br> import org.springboot.sample.entity.Student;</br> <span class="hljs-comment"></br>/\*\* \* StudentMapper,映射SQL语句的接口,无逻辑实现</br> \*</br> \*<span class="hljs-phpdoc"> @author</span> 单红宇(365384722)</br> \*<span class="hljs-phpdoc"> @myblog</span> http://blog.csdn.net/catoop/</br> \*<span class="hljs-phpdoc"> @create</span> 2016年1月20日</br> \*/</span></br> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">StudentMapper</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">MyMapper</span><<span class="hljs-title">Student</span>> {</span></br> <span class="hljs-keyword">List</span><Student> likeName(String name);</br> Student getById(int id);</br> String getNameById(int id);</br> }</code></pre> <p>MyMapper.java</p></br> <pre class="prettyprint" name="code"><code class="hljs axapta has-numbering">package org.springboot.sample.config.mybatis;</br> import tk.mybatis.mapper.<span class="hljs-keyword">common</span>.Mapper;</br> import tk.mybatis.mapper.<span class="hljs-keyword">common</span>.MySqlMapper;</br> <span class="hljs-comment"></br>/\*\* \* 被继承的Mapper,一般业务Mapper继承它</br> \*</br> \*/</span></br> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">MyMapper</span><<span class="hljs-title">T</span>> <span class="hljs-inheritance"><span class="hljs-keyword">extends</span></span> <span class="hljs-title">Mapper</span><<span class="hljs-title">T</span>>, <span class="hljs-title">MySqlMapper</span><<span class="hljs-title">T</span>> {</span></br> <span class="hljs-comment">//TODO</span></br> <span class="hljs-comment">//FIXME 特别注意,该接口不能被扫描到,否则会出错</span></br> }</code></pre> <p>StudentMapper.xml</p></br> <pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="UTF-8"?></span></br> <span class="hljs-doctype"><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </br> "http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span></br> <span class="hljs-tag"><<span class="hljs-title">mapper</span> <span class="hljs-attribute">namespace</span>=<span class="hljs-value">"org.springboot.sample.mapper.StudentMapper"</span>></span></br> <span class="hljs-comment"><!-- type为实体类Student,包名已经配置,可以直接写类名 --></span></br> <span class="hljs-tag"><<span class="hljs-title">resultMap</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"stuMap"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"Student"</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">id</span> <span class="hljs-attribute">property</span>=<span class="hljs-value">"id"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"id"</span> /></span></br> <span class="hljs-tag"><<span class="hljs-title">result</span> <span class="hljs-attribute">property</span>=<span class="hljs-value">"name"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"name"</span> /></span></br> <span class="hljs-tag"><<span class="hljs-title">result</span> <span class="hljs-attribute">property</span>=<span class="hljs-value">"sumScore"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"score\_sum"</span> /></span></br> <span class="hljs-tag"><<span class="hljs-title">result</span> <span class="hljs-attribute">property</span>=<span class="hljs-value">"avgScore"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"score\_avg"</span> /></span></br> <span class="hljs-tag"><<span class="hljs-title">result</span> <span class="hljs-attribute">property</span>=<span class="hljs-value">"age"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"age"</span> /></span></br> <span class="hljs-tag"></<span class="hljs-title">resultMap</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">select</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"getById"</span> <span class="hljs-attribute">resultMap</span>=<span class="hljs-value">"stuMap"</span> <span class="hljs-attribute">resultType</span>=<span class="hljs-value">"Student"</span>></span></br> SELECT \*</br> FROM STUDENT</br> WHERE ID = #{id}</br> <span class="hljs-tag"></<span class="hljs-title">select</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">select</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"likeName"</span> <span class="hljs-attribute">resultMap</span>=<span class="hljs-value">"stuMap"</span> <span class="hljs-attribute">parameterType</span>=<span class="hljs-value">"string"</span> <span class="hljs-attribute">resultType</span>=<span class="hljs-value">"list"</span>></span></br> SELECT \*</br> FROM STUDENT</br> WHERE NAME LIKE CONCAT('%',#{name},'%')</br> <span class="hljs-tag"></<span class="hljs-title">select</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">select</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"getNameById"</span> <span class="hljs-attribute">resultType</span>=<span class="hljs-value">"string"</span>></span></br> SELECT NAME</br> FROM STUDENT</br> WHERE ID = #{id}</br> <span class="hljs-tag"></<span class="hljs-title">select</span>></span></br> <span class="hljs-tag"></<span class="hljs-title">mapper</span>></span> </code></pre> <h4 id="3实体类"><a name="t3"></a>3、实体类</h4> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">package</span> org.springboot.sample.entity;</br> <span class="hljs-keyword">import</span> java.io.Serializable;</br> <span class="hljs-javadoc"></br>/\*\* \* 学生实体</br> \*</br> \*<span class="hljs-javadoctag"> @author</span> 单红宇(365384722)</br> \*<span class="hljs-javadoctag"> @myblog</span> http://blog.csdn.net/catoop/</br> \*<span class="hljs-javadoctag"> @create</span> 2016年1月12日</br> \*/</span></br> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Student</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Serializable</span>{</span></br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> serialVersionUID = <span class="hljs-number">2120869894112984147</span>L;</br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id;</br> <span class="hljs-keyword">private</span> String name;</br> <span class="hljs-keyword">private</span> String sumScore;</br> <span class="hljs-keyword">private</span> String avgScore;</br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;</br> <span class="hljs-comment">// get set 方法省略</span></br> }</code></pre> <h4 id="4修改applicationproperties-配置文件"><a name="t4"></a>4、修改application.properties 配置文件</h4></br> <pre class="prettyprint" name="code"><code class="hljs ruby has-numbering">mybatis.mapper-locations=classpath\*<span class="hljs-symbol">:org/springboot/sample/mapper/sql/mysql/\*Mapper</span>.xml</br> mybatis.type-aliases-package=org.springboot.sample.entity</code></pre> <h4 id="5在controller或service调用方法测试"><a name="t5"></a>5、在Controller或Service调用方法测试</h4> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"></br> <span class="hljs-annotation">@Autowired</span></br> <span class="hljs-keyword">private</span> StudentMapper stuMapper;</br> <span class="hljs-annotation">@RequestMapping</span>(<span class="hljs-string">"/likeName"</span>)</br> <span class="hljs-keyword">public</span> List<Student> <span class="hljs-title">likeName</span>(@RequestParam String name){</br> <span class="hljs-keyword">return</span> stuMapper.likeName(name); } </code></pre> <h3 id="二使用注解方式"><a name="t6"></a>二、使用注解方式</h3> <p>查看官方git上的代码使用注解方式,配置上很简单,使用上要对注解多做了解。至于xml和注解这两种哪种方法好,众口难调还是要看每个人吧。</p> <h4 id="1启动类我的中添加mapperscan注解"><a name="t7"></a>1、启动类(我的)中添加@MapperScan注解</h4></br> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-annotation">@SpringBootApplication</span></br> <span class="hljs-annotation">@MapperScan</span>(<span class="hljs-string">"sample.mybatis.mapper"</span>)</br> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SampleMybatisApplication</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">CommandLineRunner</span> {</span></br> <span class="hljs-annotation">@Autowired</span></br> <span class="hljs-keyword">private</span> CityMapper cityMapper;</br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String\[\] args) {</br> SpringApplication.run(SampleMybatisApplication.class, args);</br> } <span class="hljs-annotation">@Override</span></br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>(String... args) <span class="hljs-keyword">throws</span> Exception {</br> System.out.println(<span class="hljs-keyword">this</span>.cityMapper.findByState(<span class="hljs-string">"CA"</span>));</br> } }</code></pre> <h4 id="2在接口上使用注解定义crud语句"><a name="t8"></a>2、在接口上使用注解定义CRUD语句</h4> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">package</span> sample.mybatis.mapper;</br> <span class="hljs-keyword">import</span> org.apache.ibatis.annotations.Param;</br> <span class="hljs-keyword">import</span> org.apache.ibatis.annotations.Select;</br> <span class="hljs-keyword">import</span> sample.mybatis.domain.City;</br> <span class="hljs-javadoc"></br>/\*\* \*<span class="hljs-javadoctag"> @author</span> Eddú Meléndez</br> \*/</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">CityMapper</span> {</span></br> <span class="hljs-annotation">@Select</span>(<span class="hljs-string">"SELECT \* FROM CITY WHERE state = #{state}"</span>)</br> City findByState(<span class="hljs-annotation">@Param</span>(<span class="hljs-string">"state"</span>) String state);</br> } </code></pre> <p>其中City就是一个普通Java类。 <br> 关于MyBatis的注解,有篇文章讲的很清楚,可以参考: <a href="http://blog.csdn.net/luanlouis/article/details/35780175" target="\_blank">http://blog.csdn.net/luanlouis/article/details/35780175</a></p> <h3 id="三集成分页插件"><a name="t9"></a>三、集成分页插件</h3> <p>这里与其说集成分页插件,不如说是介绍如何集成一个plugin。MyBatis提供了拦截器接口,我们可以实现自己的拦截器,将其作为一个plugin装入到SqlSessionFactory中。 <br> Github上有位开发者写了一个分页插件,我觉得使用起来还可以,挺方便的。 <br> Github项目地址: <a href="https://github.com/pagehelper/Mybatis-PageHelper" target="\_blank">https://github.com/pagehelper/Mybatis-PageHelper</a></p> <p>下面简单介绍下: <br> 首先要说的是,Spring在依赖注入bean的时候,会把所有实现MyBatis中Interceptor接口的所有类都注入到SqlSessionFactory中,作为plugin存在。既然如此,我们集成一个plugin便很简单了,只需要使用@Bean创建PageHelper对象即可。</p> <h4 id="1添加pom依赖-1"><a name="t10"></a>1、添加pom依赖</h4> <pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>com.github.pagehelper<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>pagehelper<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">version</span>></span>4.1.0<span class="hljs-tag"></<span class="hljs-title">version</span>></span></br> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span></code></pre> <h4 id="2新增mybatisconfigurationjava"><a name="t11"></a>2、新增MyBatisConfiguration.java</h4> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">package</span> org.springboot.sample.config;</br> <span class="hljs-keyword">import</span> java.util.Properties;</br> <span class="hljs-keyword">import</span> org.slf4j.Logger;</br> <span class="hljs-keyword">import</span> org.slf4j.LoggerFactory;</br> <span class="hljs-keyword">import</span> org.springframework.context.annotation.Bean;</br> <span class="hljs-keyword">import</span> org.springframework.context.annotation.Configuration;</br> <span class="hljs-keyword">import</span> com.github.pagehelper.PageHelper;</br> <span class="hljs-javadoc"></br>/\*\* \* MyBatis 配置</br> \*</br> \*<span class="hljs-javadoctag"> @author</span> 单红宇(365384722)</br> \*<span class="hljs-javadoctag"> @myblog</span> http://blog.csdn.net/catoop/</br> \*<span class="hljs-javadoctag"> @create</span> 2016年1月21日</br> \*/</span> <span class="hljs-annotation">@Configuration</span></br> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyBatisConfiguration</span> {</span></br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger logger = LoggerFactory.getLogger(MyBatisConfiguration.class);</br> <span class="hljs-annotation">@Bean</span></br> <span class="hljs-keyword">public</span> PageHelper <span class="hljs-title">pageHelper</span>() {</br> logger.info(<span class="hljs-string">"注册MyBatis分页插件PageHelper"</span>);</br> PageHelper pageHelper = <span class="hljs-keyword">new</span> PageHelper();</br> Properties p = <span class="hljs-keyword">new</span> Properties();</br> p.setProperty(<span class="hljs-string">"offsetAsPageNum"</span>, <span class="hljs-string">"true"</span>);</br> p.setProperty(<span class="hljs-string">"rowBoundsWithCount"</span>, <span class="hljs-string">"true"</span>);</br> p.setProperty(<span class="hljs-string">"reasonable"</span>, <span class="hljs-string">"true"</span>);</br> pageHelper.setProperties(p);</br> <span class="hljs-keyword">return</span> pageHelper;</br> } }</code></pre> <h4 id="3分页查询测试"><a name="t12"></a>3、分页查询测试</h4></br> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"> <span class="hljs-annotation">@RequestMapping</span>(<span class="hljs-string">"/likeName"</span>)</br> <span class="hljs-keyword">public</span> List<Student> <span class="hljs-title">likeName</span>(@RequestParam String name){</br> PageHelper.startPage(<span class="hljs-number">1</span>, <span class="hljs-number">1</span>);</br> <span class="hljs-keyword">return</span> stuMapper.likeName(name);</br> }</code></pre></br> <p>更多参数使用方法,详见PageHelper说明文档(上面的Github地址)。</p></div></br> <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script> </div>