博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从头开始搭建一个mybatis+postgresql平台
阅读量:6476 次
发布时间:2019-06-23

本文共 8527 字,大约阅读时间需要 28 分钟。

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

  • 安装postgresql,执行下面的命令就可以安装了:
apt-get update && apt-get install postgresql

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

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

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

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

  • mybatis代码生成器,数据库与Model的映射,这类机械的工作应该交给机器来完成,。
  • 通用mapper,单表的CRUD操作可以抽像出一个公共接口,tk.mybatis提供的可以帮助我们解决这类问题。
    • mapper.xml,足够小(只包含字段映射)
复制代码
复制代码
    • mapper,足够简单(只需要继承通过mapper接口)
public interface ProductMapper extends Mapper
{}
  • 插件,这里有分页插件,SQL性能分析插件等,与mybatis集成非常容易。

如何与spring集成?

  • 生成器的集成,可以采用maven方式来运行代码生成器
    • 依赖的包
复制代码
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
org.mybatis.generator
mybatis-generator-core
${MBG.version}
compile
true
com.github.pagehelper
pagehelper
${pagehelper.version}
tk.mybatis
mapper
${mapper.version}
javax.persistence
persistence-api
1.0
org.postgresql
postgresql
9.3-1102-jdbc41
复制代码
    • 配置生成器插件,指定配置文件路径,配置依赖:一个是数据库驱动,一个是通用mapper
复制代码
org.mybatis.generator
mybatis-generator-maven-plugin
${MBG.version}
${basedir}/src/main/resources/generator/generatorConfig.xml
true
true
org.postgresql
postgresql
9.3-1102-jdbc41
tk.mybatis
mapper
${mapper.version}
复制代码
  • 生成器配置文件
    • 配置数据库连接
    • 配置生成的model,mapper以及mapper.xml的存放路径
    • 配置需要生成的表信息

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

如果是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)

上面的报错信息已经找到,原因是因为采用了MyBatis3方式生成Mapper,但同时在配置文件中错误的增加了通用Mapper的插件,它会在Mapper接口上增加一个Mapper<T>的继承,而一旦继承了这个通过接口,它里面包含的方法Id与MyBatis3生成的方法Id正好重复,导致了在编译时提示上面的错误。

使用了通用Mapper之后,有个缺点就是使用Example时没有强类型的方法了,比如不能这样:

ProductExample example =new ProductExample();        ProductExample.Criteria criteria=example.createCriteria();        if (product.getId() != null) {            criteria.andIdEqualTo(product.getId());        }

而只能这样写,字段名称需要以字符串的形式进行指定。这种方式非常适合于动态构建查询,比如:

Example example = new Example(Product.class);        Example.Criteria criteria = example.createCriteria();        if (product.getId() != null) {            criteria.andEqualTo("id", product.getId());        }

我们之前的项目为了能够使用动态条件构建,又想使用强类型的Example进行简单的查询,我们扩展了targetRuntime,让其生成的Mapper即继承自Map<T>又生成了具体的方法,只不过生成的具体方法在名称上做了调整,在名称中间增加了一个独有的占有符,默认MBG生成的查询方法名称是selectByExample,这里我们另外生成一个selectByConcreteExample。这样做也是有代价的,生成的mapper.xml也不再只包含实体映射,mapper接口也不再只是继承的近似空接口了,具体怎么用仁者见仁吧。

复制代码
public interface ImageMapper extends PartyInterface, RowBoundsMapper, BaseMapper, ExampleMapper {    int countByConcreteExample(ImageExample example);    int deleteByConcreteExample(ImageExample example);    List selectByConcreteExample(ImageExample example);    int updateByConcreteExampleSelective(@Param("record") Image record, @Param("example") ImageExample example);    int updateByConcreteExample(@Param("record") Image record, @Param("example") ImageExample example);}
复制代码

 

生成器的配置详细如下:

复制代码
复制代码
  • 配置maven运行参数,如下图所示即可。

 

  • mybatis的集成,主要是配置连接池信息,插件,mapper扫描等信息。
复制代码
dialect=postgresql reasonable=true supportMethodsArguments=true returnPageInfo=check params=count=countSql
复制代码
  • 通用mapper的用法:
    • mapper,所有生成的mapper就继承于Mapper<T>,默认持有通用mapper所有接口,包含CRUD常见操作
    • IService,通用mapper接口的定义,我们可以根据自己的业务修改此接口
复制代码
@Servicepublic interface IService
{ T selectByKey(Object key); int save(T entity); int delete(Object key); int updateAll(T entity); int updateNotNull(T entity); List
selectByExample(Object example); //TODO 其他...}
复制代码
    • BaseService,通用mapper的实现类
复制代码
public abstract class BaseService
implements IService
{ @Autowired protected Mapper
mapper; public Mapper
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
selectByExample(Object example) { return mapper.selectByExample(example); } //TODO 其他...}
复制代码
    • 具体服务类
复制代码
@Servicepublic class ProductServiceImpl extends BaseService
implements ProductService { @Override public List
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); }}
复制代码

 

 

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

 

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

http://www.cnblogs.com/ASPNET2008/p/5657027.html

 

你可能感兴趣的文章
Xilinx 常用模块汇总(verilog)【03】
查看>>
脱离标准文档流(2)---定位
查看>>
IO流之字符流
查看>>
集合异常之List接口
查看>>
Softmax回归
查看>>
紫书 习题11-11 UVa 1644 (并查集)
查看>>
App工程结构搭建:几种常见Android代码架构分析
查看>>
使用openssl进行证书格式转换
查看>>
ZOJ 3777 Problem Arrangement
查看>>
虚拟机类加载机制
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
uva 10815 - Andy's First Dictionary(快排、字符串)
查看>>
观察者模式
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>