这是我多年项目的总结,并将其抽象出来,形成一个开源的项目
部分借鉴springside,将更多的实践总结进来
基于spring+ibatis+springMVC
springmore-core专注于一些核心的应用,目前是读写分离组件
springmore-commons实用工具类
如:StringUtil,FileUtil,DateUtil,HTTPClientUtil,FTPUtil,DesUtil,ExcelUtil,XMLUtil等等
springmore-redis 封装Jedis
github地址: https://github.com/tangyanbo/springmore
特点
无缝结合spring+ibatis,对于程序员来说,是透明的
除了修改配置信息之外,程序的代码不需要修改任何东西
支持spring的容器事务
快速入门maven依赖
<dependency> <groupId>org.springmore</groupId> <artifactId>springmore-core</artifactId> <version>1.0.0</version> </dependency>
dataSource配置(applicationContext.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <!-- C3P0连接池配置 --> <bean id="master" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass"> <value>com.mysql.jdbc.Driver</value> </property> <property name="jdbcUrl"> <value>jdbc:mysql://192.168.1.246:3306/db1</value> </property> <property name="user"> <value>ysb</value> </property> <property name="password"> <value>ysb</value> </property> <property name="initialPoolSize"> <value>20</value> </property> <property name="minPoolSize"> <value>20</value> </property> <property name="maxPoolSize"> <value>200</value> </property> <property name="maxIdleTime"> <value>255000</value> </property> </bean> <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass"> <value>com.mysql.jdbc.Driver</value> </property> <property name="jdbcUrl"> <value>jdbc:mysql://192.168.1.246:3306/db2</value> </property> <property name="user"> <value>ysb</value> </property> <property name="password"> <value>ysb</value> </property> <property name="initialPoolSize"> <value>20</value> </property> <property name="minPoolSize"> <value>20</value> </property> <property name="maxPoolSize"> <value>200</value> </property> <property name="maxIdleTime"> <value>255000</value> </property> </bean> <bean id="dataSource3" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass"> <value>com.mysql.jdbc.Driver</value> </property> <property name="jdbcUrl"> <value>jdbc:mysql://192.168.1.246:3306/db3</value> </property> <property name="user"> <value>ysb</value> </property> <property name="password"> <value>ysb</value> </property> <property name="initialPoolSize"> <value>20</value> </property> <property name="minPoolSize"> <value>20</value> </property> <property name="maxPoolSize"> <value>200</value> </property> <property name="maxIdleTime"> <value>255000</value> </property> </bean> <bean id="dataSource" class="org.springmore.core.datasource.DynamicDataSource"> <property name="master" ref="master" /> <property name="slaves"> <list> <ref bean="dataSource2"/> <ref bean="dataSource3"/> </list> </property> </bean> </beans>
整合mybatis配置(applicationContext.xml中)
<!-- ibatis3 工厂类 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:sqlMapConfig.xml" /> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> <bean id="dynamicSqlSessionTemplate" class="org.springmore.core.datasource.DynamicSqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionTemplate" /> </bean>
事务配置(applicationContext.xml中)
<!-- 定义单个jdbc数据源的事务管理器 --> <bean id="transactionManager" class="org.springmore.core.datasource.DynamicDataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 以 @Transactional 标注来定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> <!-- 配置事务的传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="proc*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="select*" read-only="true" /> <tx:method name="*" read-only="false" /> <!-- <tx:method name="*" read-only="true" /> --> </tx:attributes> </tx:advice> <!-- 那些类的哪些方法参与事务 --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* org.springmore.core.dao..*(..))" /> <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" /> </aop:config>
dao代码示例:
@Repository("UserMapperImpl") public class UserMapperImpl implements UserMapper{ @Autowired private DynamicSqlSessionTemplate sqlSessionTemplate; //从库 public List<User> selectByUserNameAndPwd(User user) { return sqlSessionTemplate.selectList("selectByUserNameAndPwd", user); } //主库 public void insert(User user) { sqlSessionTemplate.insert("insert", user); } }
JedisTemplate代码示例(用于非分布式部署的redis)初始化jedisTemplate,客户端可以将该部分代码封装到工厂类中
HostAndPort address = new HostAndPort("192.168.1.245",6380); JedisPoolConfig config = new JedisPoolConfig(); JedisPool jedisPool = new JedisDirectPool("pool", address, config); jedisTemplate = new JedisTemplate(jedisPool);
调用方法:JedisTemplate负责对Jedis连接的获取与归还
jedisTemplate.set("key", "value");
JedisShardedTemplate代码示例(用于分布式部署的redis)初始化JedisShardedTemplate
HostAndPort address1 = new HostAndPort("192.168.1.245",6380); HostAndPort address2 = new HostAndPort("192.168.1.246",6380); JedisPoolConfig config = new JedisPoolConfig(); JedisPool jedisPool1 = new JedisDirectPool("pool1", address1, config); JedisPool jedisPool2 = new JedisDirectPool("pool2", address2, config); jedisTemplate = new JedisShardedTemplate(new JedisPool[] { jedisPool1, jedisPool2 });
调用方法
jedisTemplate.set("key", "value");
功能:http以及https
基于最新的httpcomponents包实现
get请求,返回String报文,返回的报文默认是UTF-8编码
如果需要制定编码,可传入编码参数
@Test public void testDoGetStringString() throws Exception { String doGet = HttpClientUtil.get("http://localhost:8888/login/"); String doGet2 = HttpClientUtil.get("http://localhost:8888/login/",HttpClientUtil.UTF_8); System.out.println(doGet); }
post请求,可以制定编码
@Test public void testDoPost() throws Exception { List <NameValuePair> nvps = new ArrayList <NameValuePair>(); nvps.add(new BasicNameValuePair("user.userName", "哈哈")); String doGet = HttpClientUtil.post("http://localhost:8888/login/login!login.ac",nvps); System.out.println(doGet); }
ssl请求
@Test public void testSSL() throws Exception { String doGet = HttpClientUtil.getSSL("https://www.baidu.com", "utf-8"); List <NameValuePair> nvps = new ArrayList <NameValuePair>(); nvps.add(new BasicNameValuePair("user.userName", "哈哈")); String post = HttpClientUtil.postSSL("https://www.baidu.com", nvps,"utf-8"); System.out.println(post); }
文件上传和下载
@Test public void getFile() throws Exception{ HttpClientUtil.getFile("http://localhost:8888/login/login!login.ac"); HttpClientUtil.postFile("http://localhost:8888/login/login!login.ac", "fileName", new File("d:/test.txt")); }