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

图片 1     
图片 2

 
最近发生只项目之数据库使用postgresql,使用原生态的mybatis操作数据,原生态之没什么不好,只不过国内来只tk.mybatis的家伙协助我们召开了很多实用的事体,大多数情下我们得以原先生态mybatis上加工的想法它多都曾发老好之贯彻,这首用享受安装postgresql,配置tk.mybatis的事无巨细步骤同当当时过程遭到或撞的一对粗问题。

  •   安装postgresql,执行下的通令就可以装了:          

    apt-get update && apt-get install postgresql

服务端安装好后我们还索要一个图形界面的客户端pdAdmin,我设置之是Windows版本的postgresql自带的,可以到夫地方探寻对应的版本。安装成功后默认会创建一个系用户,一个数据库用户,名称及密码都是postgres,我们得新创用户也可直接运用这个帐号,反正自己这无非是测试。安装好后,可能会见碰到远程访问问题:

图片 3

 
远程连接问题,默认情况下只允许本地连接,要想同意任何客户端连接,我们得以修改它的部署文件,这个文件之目在/etc/postgresql/9.5/main,这个目录下有少数个公文:
 
1:postgresql.conf,这个是服务器相关,里面来一个listen_address的地方,默认只监听本地,我们好改其。

     图片 4
 
2:pg_hba.cof,这个是用户权限相关,里面有一个跟连接相关的配备,可以安排成网关模式

     图片 5

     成功总是之后,大概是以此法,我们可以创建数据库,表等目标。

  图片 6

  •  
    mybatis代码生成器,数据库和Model的投射,这好像机械的做事应有交由机器来形成,翔使用参考这里。

  •  
    通用mapper,单表的CRUD操作可以抽像出一个公接口,tk.mybatis提供的通用mapper可拉我们缓解这看似题目。

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





    • mapper,足够简单(只需要后续通过mapper接口)

    public interface ProductMapper extends Mapper {
    }

  •   插件,这里发生分页插件,SQL性能分析插件等,与mybatis集成非常容易。

   图片 7

  如何与spring集成?

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

    • 拄的管

        <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

            <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 class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
        <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.selectByExample
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:837)
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:809)

  图片 8

 
上面的报错信息已经找到,原因是因使用了MyBatis3办法生成Mapper,但又以布置文件被破绽百出的充实了通用Mapper的插件,它见面在Mapper接口上加一个Mapper<T>的累,而只要连续了这通过接口,它里面富含的方Id与MyBatis3生成的法Id正好再,导致了于编译时提醒上面的错误。

 图片 9

  
使用了通用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<Image>, BaseMapper<Image>, ExampleMapper<Image> {
    int countByConcreteExample(ImageExample example);

    int deleteByConcreteExample(ImageExample example);

    List<Image> selectByConcreteExample(ImageExample example);

    int updateByConcreteExampleSelective(@Param("record") Image record, @Param("example") ImageExample example);

    int updateByConcreteExample(@Param("record") Image record, @Param("example") ImageExample example);
}

 

     生成器的布置详细如下:

<generatorConfiguration>
    <properties resource="config.properties"/>
    <context id="jim" 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运行参数,如下图所示即可。

        图片 10

 

  • mybatis的合一,主要是布置连接池信息,插件,mapper扫描等消息。

    <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 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 implements IService {

    @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 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);
    
    }
    

    }

 

图片 11

 

安装postgresql并且成功远程连接,集成MBG生成mapper以及model,然后拿mybatis与spring集成,最后通过通用mapper中联起来就是上了我们的目的:通过少量底代码完成大部分底干活,重复劳动交给工具就。但通用mapper有其的长处也就有它们的毛病,需要基于项目环境来平衡,个人感觉利大于弊。

 

图片 12

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

网站地图xml地图