摘要:操作操作对象设置缓存时间有效时间等待等待设置为的时候后面可能取到值,的过期时间有延迟注意操作对象时对象需要实现序列化接口两者操作互不影响生成为生称为数据库文件相关相关相关相关相关相关相关相关相关相关相关相关
springboot_database
springboot1.5.7集成mybatis、jpa、redis、mongodb,对不同数据库进行操作的实例
项目代码获取:https://github.com/pysasuke/s...
jpa:jpa与mysql数据库交互类
</>复制代码
public interface JpaUserRepository extends JpaRepository {
//jpa有默认实现类似findBy*(支持*And*)方法,其中*号为实体属性名(名称写的不对会报错哦)
JpaUser findByUsername(String username);
@Query("select count(u.id) from JpaUser u")
long count();
@Query("select u from JpaUser u where u.id=:id")
JpaUser findUserById(@Param("id") long id);
}
mongo:mongodb数据库交互类
</>复制代码
public interface MongoUserRepository extends MongoRepository {
//有默认实现类似findBy*(支持*And*)方法,其中*号为实体属性名
MgUser findByNickname(String nickname);
//根据id为条件搜索(默认实现的findOne方法是以mongodb中ObjectId为条件的)
MgUser findById(Long id);
}
mybatis:mybatis与mysql数据库交互类
</>复制代码
//@Mapper(SpringbootDatabaseApplication类中使用了@MapperScan注解,故此处可以省略)
public interface TuserMapper {
int deleteByPrimaryKey(Long id);
int insert(Tuser record);
Tuser selectByPrimaryKey(Long id);
Tuser selectByUserName(String username);
int updateByPrimaryKeySelective(Tuser record);
}
entity:实体对象层
jpa:jpa操作mysql相关实体对象
</>复制代码
@Data
@Entity//标记这个类为数据库表映射实体
@Table(name="user")//对应数据库表名
public class JpaUser implements Serializable{
@Id//标记为主键
@GeneratedValue//标记主键自增
private Long id;
private String username;
private String password;
private String mobile;
private String email;
}
mongo:mongodb相关实体对象
</>复制代码
@Data
//需要与mongo中对象(文档)名一致
public class MgUser {
@Id
private ObjectId _id; //插入mongo时会自动生成_id,如果不加这个字段则会把id属性当成_id
@Field
private Long id;
private String nickname;
private String phone;
}
mybatis:mybatis操作mysql相关实体对象
</>复制代码
@Data
public class Tuser {
private Long id;
private String username;
private String password;
private String mobile;
private String email;
}
redis:redis相关实体对象
</>复制代码
//redisTemplate操作对象时对象需要实现序列化接口
@Data
public class Person implements Serializable{
private Long serialVersionUID=1L;
private Long id;
private String username;
private String password;
}
SpringbootDatabaseApplication:springboot启动类
</>复制代码
@SpringBootApplication
// mapper 接口类扫描包配置(可以省去dao层类上注解@Mapper)
@MapperScan("com.py.springboot_database.dao.mybatis")
public class SpringbootDatabaseApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDatabaseApplication.class, args);
}
}
resources
mapper:mybatis实体类映射文件存放包
application.properties:springboot配置文件
</>复制代码
## 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_database?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=py123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
## Mybatis 配置
##指向实体类包路径
mybatis.typeAliasesPackage=com.py.springboot_database.entity.mybatis
##配置为 classpath 路径下 mapper 包下,* 代表会扫描所有 xml 文件
mybatis.mapperLocations=classpath:mapping/*.xml
## mongodb配置
spring.data.mongodb.uri=mongodb://localhost:27017/test
## Redis 配置
## Redis数据库索引(默认为0)
spring.redis.database=0
## Redis服务器地址
spring.redis.host=127.0.0.1
## Redis服务器连接端口
spring.redis.port=6379
## Redis服务器连接密码(默认为空)
spring.redis.password=
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
## 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
## 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
## 连接超时时间(毫秒)
spring.redis.timeout=0
test
jpa:TestJpa类,jpa操作mysql对象增删改查操作测试
</>复制代码
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringbootDatabaseApplication.class)
public class TestJpa {
@Autowired
private JpaUserRepository jpaUserRepository;
@Test
public void testInsert() {
long countBefore =jpaUserRepository.count();
JpaUser jpaUser = generateJpaUser();
jpaUserRepository.save(jpaUser);
long countAfter =jpaUserRepository.count();
Assert.assertEquals(++countBefore,countAfter);
}
@Test
public void testSelect() {
JpaUser jpaUser = generateJpaUser();
/*
插入成功后id会有值(mysql数据库生成的)
前提是:
1.数据库主键设置为自动增长
2.实体对象主键属性上有注解@Id和@GeneratedValue
*/
jpaUserRepository.save(jpaUser);
JpaUser selectedJpaUser = jpaUserRepository.findOne(jpaUser.getId());
Assert.assertNotNull(selectedJpaUser);
Assert.assertEquals(jpaUser, selectedJpaUser);
}
@Test
public void testUpdate() {
JpaUser jpaUser = generateJpaUser();
jpaUserRepository.save(jpaUser);
JpaUser selectedJpaUser = jpaUserRepository.findOne(jpaUser.getId());
Assert.assertNotNull(selectedJpaUser);
selectedJpaUser.setPassword("654321");
//保存修改后的对象,相当于update操作
jpaUserRepository.save(selectedJpaUser);
//findOne(默认实现)方法与findUserById(自己实现)都是根据id查找
JpaUser updatedJpaUser = jpaUserRepository.findUserById(selectedJpaUser.getId());
Assert.assertNotNull(updatedJpaUser);
Assert.assertEquals(selectedJpaUser.getPassword(), updatedJpaUser.getPassword());
}
@Test
public void testDelete() {
JpaUser jpaUser = generateJpaUser();
jpaUserRepository.save(jpaUser);
jpaUserRepository.delete(jpaUser.getId());
JpaUser selectedJpaUser = jpaUserRepository.findUserById(jpaUser.getId());
Assert.assertNull(selectedJpaUser);
}
private JpaUser generateJpaUser() {
JpaUser jpaUser = new JpaUser();
jpaUser.setUsername("zhangsan");
jpaUser.setPassword("123456");
jpaUser.setMobile("13666666666");
jpaUser.setEmail("123456@qq.com");
return jpaUser;
}
}
mongo:TestMongo类,mongodb测试
</>复制代码
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringbootDatabaseApplication.class)
public class TestMongo {
@Autowired
private MongoUserRepository userRepository;
@Test
public void test() {
MgUser mgUser = new MgUser();
mgUser.setId(1L);
mgUser.setNickname("pysasuke");
mgUser.setPhone("18650140605");
//插入成功后_id属性有值(mongo数据库生成的)
userRepository.insert(mgUser);
//该方法使用的是mongodb中ObjectId为条件的
// MgUser selectMgUser = userRepository.findOne(1L);
// MgUser selectMgUser = userRepository.findByNickname("pysasuke");
MgUser selectMgUser = userRepository.findById(1L);
Assert.assertEquals(mgUser.getId(), selectMgUser.getId());
}
}
mybatis:TestMybatis类,mybatis操作mysql对象增删改查测试
</>复制代码
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringbootDatabaseApplication.class)
public class TestMybatis {
@Autowired
private TuserMapper tuserMapper;
@Test
public void testInsert() {
Tuser tuser = generateTuser();
int row = tuserMapper.insert(tuser);
Assert.assertEquals(1, row);
}
@Test
public void testSelect() {
Tuser tuser = generateTuser();
/*
插入成功后id会有值(mysql数据库生成的)
前提是:
1.主键设置为自动增长
2.xml中insert语句设置有:useGeneratedKeys="true" keyProperty="id"
*/
int row = tuserMapper.insert(tuser);
Assert.assertEquals(1, row);
Tuser selectedTuser = tuserMapper.selectByPrimaryKey(tuser.getId());
Assert.assertNotNull(selectedTuser);
Assert.assertEquals(tuser, selectedTuser);
}
@Test
public void testUpdate() {
Tuser tuser = generateTuser();
int row = tuserMapper.insert(tuser);
Assert.assertEquals(1, row);
Tuser selectedTuser = tuserMapper.selectByPrimaryKey(tuser.getId());
Assert.assertNotNull(selectedTuser);
selectedTuser.setPassword("654321");
tuserMapper.updateByPrimaryKeySelective(selectedTuser);
Tuser updatedTuser = tuserMapper.selectByPrimaryKey(selectedTuser.getId());
Assert.assertNotNull(updatedTuser);
Assert.assertEquals(selectedTuser.getPassword(), updatedTuser.getPassword());
}
@Test
public void testDelete() {
Tuser tuser = generateTuser();
int row = tuserMapper.insert(tuser);
Assert.assertEquals(1, row);
tuserMapper.deleteByPrimaryKey(tuser.getId());
Tuser selectedTuser = tuserMapper.selectByPrimaryKey(tuser.getId());
Assert.assertNull(selectedTuser);
}
private Tuser generateTuser() {
Tuser tuser = new Tuser();
tuser.setUsername("zhangsan");
tuser.setPassword("123456");
tuser.setMobile("13666666666");
tuser.setEmail("123456@qq.com");
return tuser;
}
}
redis:TestRedis类,redis测试
</>复制代码
/*
当redis数据库里面本来存的是字符串数据或者要存取的数据就是字符串类型数据的时候,
那么使用StringRedisTemplate即可,
但是如果数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,
那么使用RedisTemplate是更好的选择。
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringbootDatabaseApplication.class)
public class TestRedis {
//操作String
@Autowired
private StringRedisTemplate stringRedisTemplate;
//操作对象
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testPutString() {
stringRedisTemplate.opsForValue().set("testPutString", "123456");
}
@Test
public void tesGetString() {
stringRedisTemplate.opsForValue().set("tesGetString", "123456");
String str = stringRedisTemplate.opsForValue().get("tesGetString");
Assert.assertEquals("123456", str);
//设置缓存时间
stringRedisTemplate.opsForValue().set("tesGetString", "123456", 1000, TimeUnit.MILLISECONDS);//有效时间1s
try {
Thread.sleep(2000);//等待2s(等待设置为1s的时候后面可能取到值,redis的过期时间有延迟)
} catch (InterruptedException e) {
e.printStackTrace();
}
str = stringRedisTemplate.opsForValue().get("tesGetString");
Assert.assertNull(str);
}
//注意:redisTemplate操作对象时对象需要实现序列化接口
@Test
public void testObject() {
Person person = generatePerson();
redisTemplate.opsForValue().set("testObject:" + person.getUsername(), person, 600);
}
@Test
public void tesGetObject() {
Person person = generatePerson();
redisTemplate.opsForValue().set("tesGetObject:" + person.getUsername(), person);
Person cachePerson = (Person) redisTemplate.opsForValue().get("tesGetObject:" + person.getUsername());
Assert.assertEquals(person, cachePerson);
}
@Test
public void tesDeleteCache() {
stringRedisTemplate.opsForValue().set("tesDeleteCache", "123456");
String cacheStr = stringRedisTemplate.opsForValue().get("tesDeleteCache");
Assert.assertEquals("123456", cacheStr);
stringRedisTemplate.delete("tesDeleteCache");
String DeleteStr = stringRedisTemplate.opsForValue().get("tesDeleteCache");
Assert.assertNull(DeleteStr);
}
//两者操作互不影响
@Test
public void testStrRedisTempAndRedisTemp(){
Person person = generatePerson();
//生成key为:xACxEDx00x05tx00x04test
redisTemplate.opsForValue().set("testDiff", person);
//生称key为:test
stringRedisTemplate.opsForValue().set("testDiff", "123456");
String cacheStr = stringRedisTemplate.opsForValue().get("testDiff");
Assert.assertEquals("123456", cacheStr);
Person cachePerson = (Person) redisTemplate.opsForValue().get("testDiff");
Assert.assertEquals(person, cachePerson);
}
private Person generatePerson() {
Person person = new Person();
person.setId(1L);
person.setUsername("wangwu");
person.setPassword("123456");
return person;
}
}
deploy
update.sql:数据库sql文件
</>复制代码
CREATE DATABASE springboot_database;
USE springboot_database;
DROP TABLE IF EXISTS `user` ;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
`mobile` varchar(20) NOT NULL,
`email` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
pom.xml
</>复制代码
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-data-mongodb
org.springframework.boot
spring-boot-starter-redis
1.4.7.RELEASE
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-data-jpa
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/19114.html
摘要:作者重庆森林链接来源牛客网整个三月份通过牛客网和网友分享的经验学到了很多东西,现在反馈一下我的面试经历,希望对同学们有帮助。个人情况大三本方向渣硕,经过实验室学长内推,于三月底完成面试。校招是实力和运气的结合,缺一不可。 欢迎关注我的微信公众号:Java面试通关手册(坚持原创,分享美文,分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取):showImg(h...
面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,决定一次面试的成败,那么面试时如果介绍自己的项目呢? 1、在面试前准备项目描述 别害怕,因为面试官什么都不知道,面试官是人,不是神,拿到你的简历的时候,是没法核实你的项目细节的。更何况,你做的项目是以月为单位算的,而面试官最多用30分钟来从你的简历上了解你的项目经验,所以你对项目的熟悉程度要远远超过面试官,所以你一点也不用紧张...
面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,决定一次面试的成败,那么面试时如果介绍自己的项目呢? 1、在面试前准备项目描述 别害怕,因为面试官什么都不知道,面试官是人,不是神,拿到你的简历的时候,是没法核实你的项目细节的。更何况,你做的项目是以月为单位算的,而面试官最多用30分钟来从你的简历上了解你的项目经验,所以你对项目的熟悉程度要远远超过面试官,所以你一点也不用紧张...
阅读 4176·2021-11-17 09:33
阅读 3351·2021-10-08 10:05
阅读 3276·2021-09-22 15:36
阅读 1240·2021-09-06 15:02
阅读 2839·2019-08-29 12:45
阅读 1656·2019-08-26 13:40
阅读 3503·2019-08-26 13:37
阅读 496·2019-08-26 13:37