Spring Boot MyBatis 连接数据库

<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">&lt;<span class="hljs-title">dependency</span>&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">groupId</span>&gt;</span>com.zaxxer<span class="hljs-tag">&lt;/<span class="hljs-title">groupId</span>&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">artifactId</span>&gt;</span>HikariCP<span class="hljs-tag">&lt;/<span class="hljs-title">artifactId</span>&gt;</span></br> <span class="hljs-comment">&lt;!-- 版本号可以不用指定,Spring Boot会选用合适的版本 --&gt;</span></br> <span class="hljs-tag">&lt;/<span class="hljs-title">dependency</span>&gt;</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">&lt;<span class="hljs-title">dependency</span>&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">groupId</span>&gt;</span>org.mybatis.spring.boot<span class="hljs-tag">&lt;/<span class="hljs-title">groupId</span>&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">artifactId</span>&gt;</span>mybatis-spring-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-title">artifactId</span>&gt;</span></br> <span class="hljs-comment">&lt;!-- 请不要使用1.0.0版本,因为还不支持拦截器插件,1.0.1-SNAPSHOT 是博主写帖子时候的版本,大家使用最新版本即可 --&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">version</span>&gt;</span>1.0.1-SNAPSHOT<span class="hljs-tag">&lt;/<span class="hljs-title">version</span>&gt;</span></br> <span class="hljs-tag">&lt;/<span class="hljs-title">dependency</span>&gt;</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>&lt;<span class="hljs-title">Student</span>&gt; {</span></br> <span class="hljs-keyword">List</span>&lt;Student&gt; 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>&lt;<span class="hljs-title">T</span>&gt; <span class="hljs-inheritance"><span class="hljs-keyword">extends</span></span> <span class="hljs-title">Mapper</span>&lt;<span class="hljs-title">T</span>&gt;, <span class="hljs-title">MySqlMapper</span>&lt;<span class="hljs-title">T</span>&gt; {</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">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></br> <span class="hljs-doctype">&lt;!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </br> "http://mybatis.org/dtd/mybatis-3-mapper.dtd"&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">mapper</span> <span class="hljs-attribute">namespace</span>=<span class="hljs-value">"org.springboot.sample.mapper.StudentMapper"</span>&gt;</span></br> <span class="hljs-comment">&lt;!-- type为实体类Student,包名已经配置,可以直接写类名 --&gt;</span></br> <span class="hljs-tag">&lt;<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>&gt;</span></br> <span class="hljs-tag">&lt;<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> /&gt;</span></br> <span class="hljs-tag">&lt;<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> /&gt;</span></br> <span class="hljs-tag">&lt;<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> /&gt;</span></br> <span class="hljs-tag">&lt;<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> /&gt;</span></br> <span class="hljs-tag">&lt;<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> /&gt;</span></br> <span class="hljs-tag">&lt;/<span class="hljs-title">resultMap</span>&gt;</span></br> <span class="hljs-tag">&lt;<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>&gt;</span></br> SELECT \*</br> FROM STUDENT</br> WHERE ID = #{id}</br> <span class="hljs-tag">&lt;/<span class="hljs-title">select</span>&gt;</span></br> <span class="hljs-tag">&lt;<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>&gt;</span></br> SELECT \*</br> FROM STUDENT</br> WHERE NAME LIKE CONCAT('%',#{name},'%')</br> <span class="hljs-tag">&lt;/<span class="hljs-title">select</span>&gt;</span></br> <span class="hljs-tag">&lt;<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>&gt;</span></br> SELECT NAME</br> FROM STUDENT</br> WHERE ID = #{id}</br> <span class="hljs-tag">&lt;/<span class="hljs-title">select</span>&gt;</span></br> <span class="hljs-tag">&lt;/<span class="hljs-title">mapper</span>&gt;</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&lt;Student&gt; <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">&lt;<span class="hljs-title">dependency</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-title">groupId</span>&gt;</span>com.github.pagehelper<span class="hljs-tag">&lt;/<span class="hljs-title">groupId</span>&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">artifactId</span>&gt;</span>pagehelper<span class="hljs-tag">&lt;/<span class="hljs-title">artifactId</span>&gt;</span></br> <span class="hljs-tag">&lt;<span class="hljs-title">version</span>&gt;</span>4.1.0<span class="hljs-tag">&lt;/<span class="hljs-title">version</span>&gt;</span></br> <span class="hljs-tag">&lt;/<span class="hljs-title">dependency</span>&gt;</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&lt;Student&gt; <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>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )