Spring(二)Spring数据操作JDBC/Redis/MongoDB
数据操作jdbc redis mongodb
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配置合适的值
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)