Spring JDBC

①、数据库连接池构造JdbcTemplate

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
	<property name="url" value="${mysql.url}"/>
	<property name="username" value="${mysql.user}"/>
	<property name="password" value="${mysql.pwd}"/>
	<property name="maxTotal" value="64"/>
	<property name="maxWaitMillis" value="3000"/>
	<property name="maxIdle" value="32"/>
	<property name="minIdle" value="0"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="dataSource"/>
</bean>

②、注入JdbcTemplate到DAO中进行数据库操作

@Repository
public class UserDao{
	
	@Resource
	private JdbcTemplate jdbcTemplate;

	public User getById(long id){
		return jdbcTemplate.queryForObject("select * from test_user where id=? ",new Object[]{id},User.class);
	}

	public List<User> getByName(String name){
		return jdbcTemplate.queryForList("select * from test_user where name=?",new Object[]{name},User.class)
	}
}

③、Spring tx提供了对事务的支持

<tx:annotation-driven transaction-manager-manager="txManager"/>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>
@Service
class UserServiceImpl implements IUserService{
	
	//处理删除用户业务逻辑,使用@Transactonal注解实现该方法的事务管理
	//开启了事务的方法在数据库错误时应抛出异常,否则无法做到事务回滚
	@Transactional
	public void DelUser(Long id){
		..
	}
}

Spring Redis

①、配置Jedis连接池

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
	<property name="maxTotal" value="${redis.pool.maxActive}"/>
	<property name="maxIdle" value="${redis.pool.maxIdle}"/>
	<property name="minIdle" value="4"/>
	<property name="maxWaitMillis" value="${redis.pool.maxWait}"/>
	<property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
</bean>

②、配置连接工厂

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnctionFactory">
	<constructor-arg index="0" ref="jedisPoolConfig"/>
	<property name="hostName" value="${redis.host}"/>
	<property name="port" value="${redis.port}"/>
	<property name="usePool" value="true"/>
</bean>

③、构造RedisTemplate即可用来操作

<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
	<property name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>
redisTemplate.opsForValue().set("test_key","test_value");
redisTemplate.opsForValue.getOperations().delete("test_key");
redisTemplate.opsForHash().put("testKey","testField","testValue");

直接使用RedisTemplate,那么Redis的key使用的是String的JDK序列化字节数组,并非是用String.getBytes()得到的字节数组
可以通过RedisTemplate的defaultSerializer/keySerializer/valueSerializer/hashKeySerializer以及hashValueSerializer几个属性设置想要使用的序列化机制。
其支持的序列化机制如下:

  • StringRedisSerializer 简单的字符串序列化,使用的是String.getBytes()
  • GenericToStringSerializer 可以将任何对象泛化为字符串并序列化,对于每一种对象类型都有不同的实现
  • JacksonJsonRedisSerializer JSON的序列化方式,使用Jakson Mapper将Obect序列化json字符串
  • Jackson2JsonRedisSerializer 同上,是json序列化方式,使用的是jackson databind
  • JdkSerializationRedisSeiralizer 使用JDK自带的序列化机制

Spring MongoDB

①、定义Mongo对象并构造数据库工厂

<!--replica-set设置集群副本的IP地址和端口-->
<mongo:mongo id="mongo" replica-set="${mongo.hostport}">
	<!--一些连接属性的设置-->
	<mongo:options connctions-per-host="${mongo.connectionsPerHost}"
		threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
		connection-timeout="${mongo.connectTimeout}"
		max-wait-time="${mongomaxWaitTime}"
		auto-connect-retry="${mongo.autoConnectRetry}"
		socket-keep-alive="${mongo.socketKeepAlive}"
		socket-timeout="${mongo.socketTimeout}"
		slave-ok="${mongo.slaveOk}"
		write-number="1"
		write-timeout="0"
		write-fsync="true"
	/>
</mongo:mongo>

<mongo:db-factory dbname="${mongo.dbname}" nongo-ref="mongo" username="${mongo.username}" password="${nongo.password}"/>

<!--配置映射相关信息,包括映射上下文、类型映射、映射转换等-->
<bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/>

<!--默认MongoDB类型映射-->
<bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
	<constructor-arg name="typeKey">
		<null/>
	</constructor-arg>
</bean>

<!--配置MongoDB映射类型-->
<bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappignMongoConverter">
	<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
	<constructor-arg name="mappingContext" ref=mappingContext/>
	<property name="typeMapper" ref="defaultMongoTypeMapper">
</bean>

②、构造MongoTemplate

配置的writeResultChecking和writeConcern是为了安全写入

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
	<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
	<constructor-arg name="mongoConverter" ref="mappingMongoConverter"/>
	<property name="writeResultChecking" value="EXCEPTION"/>
	<property name="writeConcern" value="ACKNOWLEDGED"/>
</bean>
@Document(collection="test_user")
public class User{
	
	private String id;
	private String userName;
	private String nickName;
}
User user = new User();
user.setName("test");
user.setNickName("测试用户");

MongoTemplate.insert(user);
user.setName("test2");
mongoTemplate.save(user);

Criteria criteria = Criteria.where("name").is("test2");
mongoTemplate.findOne(Query.query(criteria),User.class);

SpringData MongoDB会默认在每个Collection中添加_class字段,用于标识原始来源类型,可以在defaultMongoTypeMapper将typeKey设置为NULL来去掉此字段
SpringData MongoDB会把实体类中的id属性转换为ID,因此当使用Spring Mongo做了数据操作的时候,如果再使用Mongo JavaDriver查询,注意一定要用_id而不是id
实体类中的ID如果为空,那么会自动生成ObjectId作为ID
要注意对MongoDB安全写的配置,根据业务场景对MongoTemplate的writeResultCheckin和writeConcern配置合适的值

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐