欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

图文详解mybatis+postgresql平台搭建步骤

程序员文章站 2024-03-13 12:18:15
从头开始搭建一个mybatis+postgresql平台 最近有个项目的数据库使用postgresql,使用原生态的mybatis操作数据,原生态的没什么不好,只不...

从头开始搭建一个mybatis+postgresql平台

图文详解mybatis+postgresql平台搭建步骤图文详解mybatis+postgresql平台搭建步骤

最近有个项目的数据库使用postgresql,使用原生态的mybatis操作数据,原生态的没什么不好,只不过国内有个tk.mybatis的工具帮助我们做了很多实用的事情,大多数情况下我们需要在原生态mybatis上加工的想法它基本上都已经有很好的实现,这篇将分享安装postgresql,配置tk.mybatis的详细步骤以及在这过程中可能遇到的一些小问题。

安装postgresql,执行下面的命令就可以安装了:

复制代码 代码如下:
apt-get update && apt-get install postgresql

服务端安装好之后我们还需要一个图形界面的客户端pdadmin,我安装的是windows版本的postgresql自带的,可以到找对应的版本。安装成功后默认会创建一个系统用户,一个数据库用户,名称以及密码都是postgres,我们可以新创建用户也可以直接使用这个帐号,反正我这只是测试。安装完成之后,可能会遇到远程访问问题:

图文详解mybatis+postgresql平台搭建步骤

远程连接问题,默认情况下只允许本地连接,要想允许其它客户端连接,我们可以修改它的配置文件,这个文件的目录位于/etc/postgresql/9.5/main,这个目录下有两个文件:
1:postgresql.conf,这个是服务器相关,里面有一个listen_address的地址,默认只监听本地,我们可以修改它。

图文详解mybatis+postgresql平台搭建步骤

2:pg_hba.cof,这个是用户权限相关,里面有一个与连接相关的配置,可以配置成网关模式

图文详解mybatis+postgresql平台搭建步骤

成功连接之后,大概是这个样子,我们可以创建数据库,表等对象。

图文详解mybatis+postgresql平台搭建步骤

mybatis代码生成器,数据库与model的映射,这类机械的工作应该交给机器来完成,详细使用参考这里

通用mapper,单表的crud操作可以抽像出一个公共接口,tk.mybatis提供的通用mapper可以帮助我们解决这类问题。

----mapper.xml,足够小(只包含字段映射)

<mapper namespace="com.jim.logstashmvc.dao.generated.mapper.productmapper">
 <resultmap id="baseresultmap" type="com.jim.logstashmvc.dao.generated.entity.product">
 <!--
  warning - @mbggenerated
 -->
 <id column="id" jdbctype="bigint" property="id" />
 <result column="name" jdbctype="varchar" property="name" />
 </resultmap>
</mapper>

----mapper,足够简单(只需要继承通过mapper接口)

复制代码 代码如下:
public interface productmapper extends mapper<product> {}

插件,这里有分页插件,sql性能分析插件等,与mybatis集成非常容易。

图文详解mybatis+postgresql平台搭建步骤

如何与spring集成?

生成器的集成,可以采用maven方式来运行代码生成器

依赖的包

<!-- mybatis -->
  <dependency>
   <groupid>org.mybatis</groupid>
   <artifactid>mybatis</artifactid>
   <version>${mybatis.version}</version>
  </dependency>

  <!-- spring集成 -->
  <dependency>
   <groupid>org.mybatis</groupid>
   <artifactid>mybatis-spring</artifactid>
   <version>${mybatis.spring.version}</version>
  </dependency>

  <!-- mbg -->
  <dependency>
   <groupid>org.mybatis.generator</groupid>
   <artifactid>mybatis-generator-core</artifactid>
   <version>${mbg.version}</version>
   <scope>compile</scope>
   <optional>true</optional>
  </dependency>

  <!-- 分页 -->
  <dependency>
   <groupid>com.github.pagehelper</groupid>
   <artifactid>pagehelper</artifactid>
   <version>${pagehelper.version}</version>
  </dependency>

  <!-- 通用mapper -->
  <dependency>
   <groupid>tk.mybatis</groupid>
   <artifactid>mapper</artifactid>
   <version>${mapper.version}</version>
  </dependency>

  <!-- tkmybatis 会使用到jpa的注解 -->
  <dependency>
   <groupid>javax.persistence</groupid>
   <artifactid>persistence-api</artifactid>
   <version>1.0</version>
  </dependency>

  <dependency>
   <groupid>org.postgresql</groupid>
   <artifactid>postgresql</artifactid>
   <version>9.3-1102-jdbc41</version>
  </dependency>

配置生成器插件,指定配置文件路径,配置依赖:一个是数据库驱动,一个是通用mapper

<!--mbg-->
   <plugin>
    <groupid>org.mybatis.generator</groupid>
    <artifactid>mybatis-generator-maven-plugin</artifactid>
    <version>${mbg.version}</version>
    <configuration>
     <configurationfile>${basedir}/src/main/resources/generator/generatorconfig.xml</configurationfile>
     <overwrite>true</overwrite>
     <verbose>true</verbose>
    </configuration>
    <dependencies>
     <dependency>
      <groupid>org.postgresql</groupid>
      <artifactid>postgresql</artifactid>
      <version>9.3-1102-jdbc41</version>
     </dependency>

     <dependency>
      <groupid>tk.mybatis</groupid>
      <artifactid>mapper</artifactid>
      <version>${mapper.version}</version>
     </dependency>

    </dependencies>
   </plugin>

生成器配置文件

**配置数据库连接

**配置生成的model,mapper以及mapper.xml的存放路径

**配置需要生成的表信息

注意下targetruntime,这里采用的是mybatis3simple,它的默认选项是mybatis3。如果采用通用mapper,我们在spring扫描接口时可以这样写。

复制代码 代码如下:
<bean> <property name="sqlsessionfactorybeanname" value="jimsqlsessionfactory"/> <property name="basepackage" value="com.jim.logstashmvc.dao.generated.mapper"/> </bean>

如果是mybatis3,生成的mapper.xml格式会复杂很多,我之前遇到过这样的问题:使用mybatis3生成的mapper.xml然后错误 的配置了mapperscannerconfigurer为下面通用mapper模式,提示我的错误如下,原因可以认定是配置问题(不是某个mapper.xml中的id重复问题) ,后续再研究下非通用mapper的配置。

复制代码 代码如下:
caused by: java.lang.illegalargumentexception: mapped statements collection already contains value for com.jim.logstashmvc.dao.generated.mapper.productmapper.selectbyexampleat org.apache.ibatis.session.configuration$strictmap.put(configuration.java:837)at org.apache.ibatis.session.configuration$strictmap.put(configuration.java:809)

生成器的配置详细如下:

复制代码 代码如下:
<generatorconfiguration> <properties resource="config.properties"/> <context targetruntime="mybatis3simple" defaultmodeltype="flat"> <property name="beginningdelimiter" value="`"/> <property name="endingdelimiter" value="`"/> <plugin type="${mapper.plugin}"> <property name="mappers" value="${mapper.mapper}"/> </plugin> <jdbcconnection driverclass="${jdbc.driverclass}" connectionurl="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}"> </jdbcconnection> <javamodelgenerator targetpackage="${targetmodelpackage}" targetproject="${targetjavaproject}"/> <sqlmapgenerator targetpackage="mapper" targetproject="${targetresourcesproject}"/> <javaclientgenerator targetpackage="${targetmapperpackage}" targetproject="${targetjavaproject}" type="xmlmapper"> </javaclientgenerator> <table tablename="product" domainobjectname="product"></table> </context></generatorconfiguration>
配置maven运行参数,如下图所示即可。

图文详解mybatis+postgresql平台搭建步骤

mybatis的集成,主要是配置连接池信息,插件,mapper扫描等信息。

<bean id="jimdatasource" class="org.apache.commons.dbcp.basicdatasource">
  <property name="driverclassname" value="${jdbc.driverclass}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>

  <property name="initialsize" value="5"/>
  <property name="minidle" value="10"/>
  <property name="maxwait" value="60000"/>
  <property name="timebetweenevictionrunsmillis" value="60000"/>
  <property name="minevictableidletimemillis" value="3600000"/>
  <property name="validationquery" value="select 1"/>
  <property name="testwhileidle" value="true"/>
  <property name="testonborrow" value="false"/>
  <property name="testonreturn" value="false"/>
 </bean>

 <bean id="jimsqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean">
  <property name="datasource" ref="jimdatasource"/>
  <property name="mapperlocations" value="classpath:mapper/*.xml"/>
  <property name="typealiasespackage" value="com.jim.logstashmvc.dao.generated.entity"/>
  <property name="plugins">
   <array>
    <bean class="com.github.pagehelper.pagehelper">
     <property name="properties">
      <value>
      dialect=postgresql
      reasonable=true
      supportmethodsarguments=true
      returnpageinfo=check
      params=count=countsql
     </value>

     </property>
    </bean>
   </array>
  </property>

 </bean>

 <bean class="tk.mybatis.spring.mapper.mapperscannerconfigurer">
  <property name="sqlsessionfactorybeanname" value="jimsqlsessionfactory"/>
  <property name="basepackage" value="com.jim.logstashmvc.dao.generated.mapper"/>
 </bean>

通用mapper的用法:

• mapper,所有生成的mapper就继承于mapper<t>,默认持有通用mapper所有接口,包含crud常见操作
• iservice,通用mapper接口的定义,我们可以根据自己的业务修改此接口 

@service
public interface iservice<t> {

 t selectbykey(object key);

 int save(t entity);

 int delete(object key);

 int updateall(t entity);

 int updatenotnull(t entity);

 list<t> selectbyexample(object example);

 //todo 其他...
} 

baseservice,通用mapper的实现类 

public abstract class baseservice<t> implements iservice<t> {

 @autowired
 protected mapper<t> mapper;

 public mapper<t> getmapper() {
  return mapper;
 }

 @override
 public t selectbykey(object key) {
  return mapper.selectbyprimarykey(key);
 }

 public int save(t entity) {
  return mapper.insert(entity);
 }

 public int delete(object key) {
  return mapper.deletebyprimarykey(key);
 }

 public int updateall(t entity) {
  return mapper.updatebyprimarykey(entity);
 }

 public int updatenotnull(t entity) {
  return mapper.updatebyprimarykeyselective(entity);
 }

 public list<t> selectbyexample(object example) {
  return mapper.selectbyexample(example);
 }

 //todo 其他...
} 

具体服务类 

@service
public class productserviceimpl extends baseservice<product> implements productservice {
 @override
 public list<product> selectbyproduct(product product, int page, int rows) {
  example example = new example(product.class);
  example.criteria criteria = example.createcriteria();
  if(!stringutils.isblank(product.getname())){
   criteria.andequalto("name",product.getname());
  }
  if (product.getid() != null) {
   criteria.andequalto("id", product.getid());
  }
  pagehelper.startpage(page, rows);
  return selectbyexample(example);

 }

}

图文详解mybatis+postgresql平台搭建步骤

安装postgresql并且成功远程连接,集成mbg生成mapper以及model,然后将mybatis与spring集成,最后通过通用mapper中联起来就达到了我们的目的:通过少量的代码完成大部分的工作,重复劳动交给工具完成。但通用mapper有它的优点也就有它的缺点,需要根据项目环境来平衡,个人感觉利大于弊。

图文详解mybatis+postgresql平台搭建步骤

本文引用:
1、http://www.mybatis.tk/
2、https://github.com/abel533/mybatis-spring

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。