标签:
Spring Boot 本身自带已经集成JPA,实现JPA规范最好的是hibernation, 最近几年中持久层框架中应用更多是MyBatis,原因呢?Hibernate 的灵活性没有Mybatis好,而且Hibernate的学习成本相对于MyBatis要高很多。
应用按照分层的理念进行了拆分,它具有高度的可扩展性.将公共抽离出来,做成服务供其他模块调用。实现RPC
可以采用RMI、Hession,但是
但是由于服务越来越多,依赖难以管理,而且RPC调用没有负载均衡,服务心跳检查。。。救星到来。。。阿里Dubbo(RPC服务治理框架)
客户端层:客户端层包含了针对目标平台的用户界面,可能会包括基于Web的、移动端用户界面。一般来讲,这可能会是Web应用,包含诸如用户管理、会话管理、页面构建等功能,客户端所发起Http请求,都需要以RESTful服务的形式返回。
服务端:服务端包含了数据的选取,数据的来源诸如关系型数据库、Redis、memcache,对外提供服务。
应用技术:
Spring Boot
Dubbo
MyBatis
FlyWay
Zookeeper
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.dcms.cif</groupId> <artifactId>dcms-cif-business</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>dcms-cif-business</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.13</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>org.dcms.cif</groupId> <artifactId>dcms-cif-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.dcms.cif</groupId> <artifactId>dcms-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.dcms.cif</groupId> <artifactId>dcms-cif-base</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.4</version> </dependency> <dependency> <groupId>com.googlecode.flyway</groupId> <artifactId>flyway-core</artifactId> <version>2.3.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
<strong><span style="font-size:18px;">application.yml</span></strong>
server: port: 18080 logging: config: classpath:logback.xml path: D:\workspace\dcms-web-restful file: log.log spring: datasource: name: maint type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&failOverReadOnly=false username: root password: root filters: stat,wall,slf4j maxActive: 15 initialSize: 1 maxWait: 10000 useUnfairLock: true timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 30000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: false jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8application-mybatis.xml
<?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:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/> <property name="basePackage" value="com.dcms.cif.mapper"/> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactoryBean"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="find*" read-only="true" /> <tx:method name="select*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="submit*" propagation="REQUIRED"/> <tx:method name="clear*" propagation="REQUIRED"/> <tx:method name="create*" propagation="REQUIRED"/> <tx:method name="activate*" propagation="REQUIRED"/> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="remove*" propagation="REQUIRED"/> <tx:method name="execute*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config expose-proxy="true" proxy-target-class="true" > <aop:pointcut expression="execution(public * com.dcms..service.*.*(..))" id="pt"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/> </aop:config> </beans>dubbo-cif-providers.xml
<?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:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <bean id="userServiceImp" class="com.dcms.cif.service.imp.UserServiceImp" /> <!-- 应用配置,配置当前应用信息--> <dubbo:application name="cif-providers" /> <!-- 配置中心,配置注册中心 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" ></dubbo:registry> <!-- 协议配置,用于配置提供者的协议,协议由提供方指定,消费放被动接受 --> <dubbo:protocol name="dubbo" port="28888"></dubbo:protocol> <!-- 暴露一个服务,定义服务的原信息,一个服务可以注册到多个注册中心。一个服务可以用多个协议暴露 --> <dubbo:service interface="com.dcms.cif.service.UserService" ref="userServiceImp" timeout="3000"> <dubbo:method name="findUserById" timeout="2000"></dubbo:method> </dubbo:service> </beans>UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.dcms.cif.mapper.UserMapper"> <resultMap type="com.dcms.cif.domain.CifVO" id="RM_CIF"> <id column="ID" property="id" /> <result column="NM" property="nm" /> <result column="AGE" property="age" /> <result column="TELEPHONE" property="telephone" /> <result column="EMAIL" property="email" /> <result column="CB_HOST_NO" property="cbHostNo" /> <result column="DT_CREATED" property="dtCreated" /> <result column="CREATED_BY" property="createdBy" /> <result column="DT_UPDATED" property="dtUpdated" /> <result column="UPDATE_BY" property="updatedBy" /> </resultMap> <sql id="allcolumn"> <![CDATA[ ID, NM, AGE, TELEPHONE, EMAIL, CB_HOST_NO, DT_CREATED, CREATED_BY, DT_UPDATED, UPDATE_BY ]]> </sql> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> <![CDATA[ INSERT INTO CIF ( ID, NM, AGE, TELEPHONE, EMAIL, CB_HOST_NO, DT_CREATED, CREATED_BY, DT_UPDATED, UPDATE_BY )VALUES( #{id}, #{nm}, #{age}, #{telephone}, #{email}, #{cbHostNo}, #{dtCreated}, #{createdBy}, #{dtUpdated}, #{updatedBy} ) ]]> </insert> <select id="findById" resultMap="RM_CIF"> select <include refid="allcolumn" /> from cif where cif.id = #{id} </select> <select id="findUserByNm" resultMap="RM_CIF"> select <include refid="allcolumn" /> from cif where cif.nm like '${nm}%' </select> <select id="findUserByOwner" resultMap="RM_CIF"> select <include refid="allcolumn" /> from cif where cif.nm in <foreach collection="owners" item="owner" index="index" open=" (" close=")" separator=","> #{owner} </foreach> </select> </mapper>
package com.dcms.cif.mapper; import java.util.List; import com.common.mapper.BaseMapper; import com.dcms.cif.domain.CifVO; public interface UserMapper extends BaseMapper<CifVO> { /** * @param nm * @return List<CifVO> * @description: 根据指定nm去模糊查询记录,结果可能是多条数据 */ public List<CifVO> findUserByNm(String nm); /** * @param owner * @return List<CifVO> * @description: 根据指定nm去模糊查询记录,结果可能是多条数据 * */ public List<CifVO> findUserByOwner(String... owners); }
package com.dcms.cif.service.imp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.dcms.cif.domain.CifVO; import com.dcms.cif.mapper.UserMapper; import com.dcms.cif.service.UserService; public class UserServiceImp implements UserService { public static final Logger logger = LoggerFactory.getLogger(UserServiceImp.class); @Autowired private UserMapper userMapper; public CifVO findUserById(int id) { return userMapper.findById(id); } }
package com.dcms.cif; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; @Configuration @EnableAutoConfiguration @ComponentScan @ImportResource(value = {"classpath:dubbo-cif-providers.xml", "classpath:application-mybatis.xml"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
标签:
原文地址:http://blog.csdn.net/manmanxiaohui/article/details/51883199