使用 Spring+Mybatis 操做 Phoenix 和操做其餘的關係型數據庫(如 Mysql,Oracle)在配置上是基本相同的,下面會分別給出 Spring/Spring Boot 整合步驟,完整代碼見本倉庫:html
除了 Spring 相關依賴外,還須要導入 phoenix-core
和對應的 Mybatis 依賴包java
<!--mybatis 依賴包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!--phoenix core--> <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>4.14.0-cdh5.14.2</version> </dependency>
在數據庫配置文件 jdbc.properties
中配置數據庫驅動和 zookeeper 地址git
# 數據庫驅動 phoenix.driverClassName=org.apache.phoenix.jdbc.PhoenixDriver # zookeeper地址 phoenix.url=jdbc:phoenix:192.168.0.105:2181
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 開啓註解包掃描--> <context:component-scan base-package="com.heibaiying.*"/> <!--指定配置文件的位置--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--配置數據源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!--Phoenix 配置--> <property name="driverClassName" value="${phoenix.driverClassName}"/> <property name="url" value="${phoenix.url}"/> </bean> <!--配置 mybatis 會話工廠 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--指定 mapper 文件所在的位置--> <property name="mapperLocations" value="classpath*:/mappers/**/*.xml"/> <property name="configLocation" value="classpath:mybatisConfig.xml"/> </bean> <!--掃描註冊接口 --> <!--做用:從接口的基礎包開始遞歸搜索,並將它們註冊爲 MapperFactoryBean(只有至少一種方法的接口才會被註冊;, 具體類將被忽略)--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--指定會話工廠 --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!-- 指定 mybatis 接口所在的包 --> <property name="basePackage" value="com.heibaiying.dao"/> </bean> </beans>
新建 mybtais 配置文件,按照需求配置額外參數, 更多 settings 配置項能夠參考官方文檔github
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- mybatis 配置文件 --> <configuration> <settings> <!-- 開啓駝峯命名 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 打印查詢 sql --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> </configuration>
public interface PopulationDao { List<USPopulation> queryAll(); void save(USPopulation USPopulation); USPopulation queryByStateAndCity(@Param("state") String state, @Param("city") String city); void deleteByStateAndCity(@Param("state") String state, @Param("city") String city); }
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.heibaiying.dao.PopulationDao"> <select id="queryAll" resultType="com.heibaiying.bean.USPopulation"> SELECT * FROM us_population </select> <insert id="save"> UPSERT INTO us_population VALUES( #{state}, #{city}, #{population} ) </insert> <select id="queryByStateAndCity" resultType="com.heibaiying.bean.USPopulation"> SELECT * FROM us_population WHERE state=#{state} AND city = #{city} </select> <delete id="deleteByStateAndCity"> DELETE FROM us_population WHERE state=#{state} AND city = #{city} </delete> </mapper>
@RunWith(SpringRunner.class) @ContextConfiguration({"classpath:springApplication.xml"}) public class PopulationDaoTest { @Autowired private PopulationDao populationDao; @Test public void queryAll() { List<USPopulation> USPopulationList = populationDao.queryAll(); if (USPopulationList != null) { for (USPopulation USPopulation : USPopulationList) { System.out.println(USPopulation.getCity() + " " + USPopulation.getPopulation()); } } } @Test public void save() { populationDao.save(new USPopulation("TX", "Dallas", 66666)); USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas"); System.out.println(usPopulation); } @Test public void update() { populationDao.save(new USPopulation("TX", "Dallas", 99999)); USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas"); System.out.println(usPopulation); } @Test public void delete() { populationDao.deleteByStateAndCity("TX", "Dallas"); USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas"); System.out.println(usPopulation); } }
<!--spring 1.5 x 以上版本對應 mybatis 1.3.x (1.3.1) 關於更多 spring-boot 與 mybatis 的版本對應能夠參見 <a href="http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/">--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!--phoenix core--> <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>4.14.0-cdh5.14.2</version> </dependency> <dependency>
spring boot 與 mybatis 版本的對應關係:spring
MyBatis-Spring-Boot-Starter 版本 | MyBatis-Spring 版本 | Spring Boot 版本 |
---|---|---|
1.3.x (1.3.1) | 1.3 or higher | 1.5 or higher |
1.2.x (1.2.1) | 1.3 or higher | 1.4 or higher |
1.1.x (1.1.1) | 1.3 or higher | 1.3 or higher |
1.0.x (1.0.2) | 1.2 or higher | 1.3 or higher |
在 application.yml 中配置數據源,spring boot 2.x 版本默認採用 Hikari 做爲數據庫鏈接池,Hikari 是目前 java 平臺性能最好的鏈接池,性能好於 druid。sql
spring: datasource: #zookeeper 地址 url: jdbc:phoenix:192.168.0.105:2181 driver-class-name: org.apache.phoenix.jdbc.PhoenixDriver # 若是不想配置對數據庫鏈接池作特殊配置的話,如下關於鏈接池的配置就不是必須的 # spring-boot 2.X 默認採用高性能的 Hikari 做爲鏈接池 更多配置能夠參考 https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby type: com.zaxxer.hikari.HikariDataSource hikari: # 池中維護的最小空閒鏈接數 minimum-idle: 10 # 池中最大鏈接數,包括閒置和使用中的鏈接 maximum-pool-size: 20 # 此屬性控制從池返回的鏈接的默認自動提交行爲。默認爲 true auto-commit: true # 容許最長空閒時間 idle-timeout: 30000 # 此屬性表示鏈接池的用戶定義名稱,主要顯示在日誌記錄和 JMX 管理控制檯中,以標識池和池配置。 默認值:自動生成 pool-name: custom-hikari #此屬性控制池中鏈接的最長生命週期,值 0 表示無限生命週期,默認 1800000 即 30 分鐘 max-lifetime: 1800000 # 數據庫鏈接超時時間,默認 30 秒,即 30000 connection-timeout: 30000 # 鏈接測試 sql 這個地方須要根據數據庫方言差別而配置 例如 oracle 就應該寫成 select 1 from dual connection-test-query: SELECT 1 # mybatis 相關配置 mybatis: configuration: # 是否打印 sql 語句 調試的時候能夠開啓 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
上面 Spring+Mybatis 咱們使用了 XML 的方式來寫 SQL,爲了體現 Mybatis 支持多種方式,這裏使用註解的方式來寫 SQL。數據庫
@Mapper public interface PopulationDao { @Select("SELECT * from us_population") List<USPopulation> queryAll(); @Insert("UPSERT INTO us_population VALUES( #{state}, #{city}, #{population} )") void save(USPopulation USPopulation); @Select("SELECT * FROM us_population WHERE state=#{state} AND city = #{city}") USPopulation queryByStateAndCity(String state, String city); @Delete("DELETE FROM us_population WHERE state=#{state} AND city = #{city}") void deleteByStateAndCity(String state, String city); }
@RunWith(SpringRunner.class) @SpringBootTest public class PopulationTest { @Autowired private PopulationDao populationDao; @Test public void queryAll() { List<USPopulation> USPopulationList = populationDao.queryAll(); if (USPopulationList != null) { for (USPopulation USPopulation : USPopulationList) { System.out.println(USPopulation.getCity() + " " + USPopulation.getPopulation()); } } } @Test public void save() { populationDao.save(new USPopulation("TX", "Dallas", 66666)); USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas"); System.out.println(usPopulation); } @Test public void update() { populationDao.save(new USPopulation("TX", "Dallas", 99999)); USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas"); System.out.println(usPopulation); } @Test public void delete() { populationDao.deleteByStateAndCity("TX", "Dallas"); USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas"); System.out.println(usPopulation); } }
上面單元測試涉及到的測試表的建表語句以下:apache
CREATE TABLE IF NOT EXISTS us_population ( state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city)); -- 測試數據 UPSERT INTO us_population VALUES('NY','New York',8143197); UPSERT INTO us_population VALUES('CA','Los Angeles',3844829); UPSERT INTO us_population VALUES('IL','Chicago',2842518); UPSERT INTO us_population VALUES('TX','Houston',2016582); UPSERT INTO us_population VALUES('PA','Philadelphia',1463281); UPSERT INTO us_population VALUES('AZ','Phoenix',1461575); UPSERT INTO us_population VALUES('TX','San Antonio',1256509); UPSERT INTO us_population VALUES('CA','San Diego',1255540); UPSERT INTO us_population VALUES('CA','San Jose',912332);
更多大數據系列文章能夠參見 GitHub 開源項目: 大數據入門指南mybatis