此文档是根据上课操做流程进行的整理,更多细节和图片请参见刘老师的专栏java
i. application.propertiesmysql
语法:key = value,属性-值默认条件下都是String类型,不须要添加引号面试
ii. yml文件文件说明redis
语法:key: value,yml文件中有文件父子级效果,采用缩进的方式实现spring
为属性赋值sql
i. 建立RedisController数据库
@RestController public class RedisController { private String host = "127.0.0.1"; private int port = 6379; @RequestMapping("/getNode") public String getNode(){ return host+":"+port; } }
业务需求:有时须要动态获取属性的值,若是直接写到代码中,须要从新打包编译,代码的耦合性高。可否利用配置文件的方式动态的为属性赋值?mybatis
ii. yml方式为属性赋值app
1) 编辑yml配置文件;2) 为属性赋值@value("")框架
== application.yml === # 为Redis设定属性和属性值 redis.host: 127.0.0.1 redis.port: 6379
== RedisController.java === /* 当程序启动时,会自动加载yml文件,将数据保存到spring的内部 * 以后能够经过${key}(spel表达式)进行数据取值 */ @Value("${redis.host}") private String host /*= "127.0.0.1"*/; @Value("${redis.port}") private int port /*= 6379*/; @RequestMapping("/getNode") public String getNode(){ return host+":"+port; }
iii. 指定配置文件为属性赋值
1) 定义properties文件; 2) 编辑RedisController
=== properties/redis.properties === # 通常的业务数据须要独立的配置文件为属性赋值 redis2.host = 192.168.126.129 redis2.port = 7000
=== RedisController === //指定配置文件进行加载 @PropertySource("classpath:/properties/redis.properties") ... @Value("${redis2.host}") private String host2 /*= "127.0.0.1"*/; @Value("${redis2.port}") private int port2 /*= 6379*/; @RequestMapping("/getNode") public String getNode(){ return "YML取值方式: "+host+":"+port+"<br>PRO取值方式: "+host2+":"+port2; }
iv. 若是yml和properties属性重名,以谁为准?
答:以yml方式为准,注意事项:属性尽可能不要重复
环境切换
i. 业务需求
若是小李进入了一个外包公司,须要频繁切换不一样的工做地点。因为公司的环境配置很是的繁琐,每次切换小李都须要修改大量的配置文件,问可否优化?
ii. 实现多环境切换
# 经过---方式实现yml环境的分割 --- # 定义环境的名称 spring: profiles: prod server: port: 9000 # 为Redis设定属性和属性值 redis.host: 114.114.114.1 redis.port: 7000
# 挑选执行的环境 SpringCloud微服务配置 N多个yml配置文件 配置中心 spring: profiles: active: prod
热部署配置
弊端:IDEA启动时特别耗费内存,若是配置了热部署,则卡上加卡。
i. 添加jar包
<!--支持热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
ii. IDEA配置
组合键:ctrl + alt + shift + /
Lombok
i. 添加jar包
<!--引入插件lombok 自动的set/get/构造方法插件 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
ii. 建立pojo对象
@Data //get/set/toString(只能打印本身的属性,不能输出父类的属性,如想获取getXXX)/equals等方法 @NoArgsConstructor //无参构造 @AllArgsConstructor //全参构造 @Accessors(chain = true) //链式加载规则 public class User extends Parent { //pojo实体类型中属性类型必须为包装类 private Integer id; //private int id; private String name; private Integer age; private String sex; }
iii. 面试问题:若是咱们的项目须要在Linux系统中运行,系统是否须要提早安装Lombok插件?
答:不须要,由于Lombok插件在编译期有效。由.java文件编译为.class文件时生效。
在项目中引入MyBatis
i. 添加jar包(3个)
<!--引入数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>5.1.32</version> </dependency>
<!--springBoot数据库链接 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
<!--spring整合mybatis 暂时 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
ii. 编辑yml配置文件
1) 关于url的说明:
设定时区%2B = + & 设定字符集编码格式 & 若是链接中断是否重连 & 是否容许批量操做
=== application.yml === spring: datasource: url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: root mybatis: # 类型别名包 type-aliases-package: com.jt.demo.pojo mapper-locations: classpath:/mybatis/mappers/*.xml # 开启驼峰映射 configuration: map-underscore-to-camel-case: true
2) 驼峰映射规则
<!-- 开启驼峰映射规则的说明 字段名user_id 根据驼峰命名的规则应该叫 userId 例子: 1.user表: user_id user_name user_age 2.User对象:userId userName userAge 只要开启驼峰映射规则,Mybatis会自动完成映射 原理: user_id(字段)-去除下划线-userid-首字母大写-userId(属性) 注意事项: 一旦开启了驼峰映射,必须按照要求来写 --> <select id="" resultMap="userRM"> SELECT * FROM user </select> <resultMap id="userRM" type="user"> <id column="user_id" property="userId"/> <result column="user_name" property="userName"/> <result column="user_age" property="userAge"/> </resultMap>
iii. 编写MyBatis测试方法
@Autowired private UserMapper userMapper; @Test public void testMyBatis01(){ List<User> list = userMapper.findAll(); System.out.println(list); }
以对象方式操做数据库,单表操做不须要写SQL语句。
对象关系映射 - Object Relational Mapping
核心:采用对象的方式操做数据库
思考:userMapper.insert(User对象) -- 剩余的入库SQL由框架自动完成
MyBatisPlus
i. 介绍
参见官网《简介 | MyBatis-Plus》
ii. 引入jar包
<!--spring整合mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency>
iii. 编辑pojo对象
//1.实现对象与表的映射 @TableName(value = "user") //若是表名与对象名称一致,能够省略 public class User{ //pojo实体类型中属性类型必须为包装类 //2.设定主键自增 @TableId(type = IdType.AUTO) private Integer id; //private int id; //@TableField("name") 若是数据库的字段与属性名称一致,则能够省略不写 private String name; private Integer age; private String sex; }
iv. Mapper接口继承
@Mapper //将Mapper接口交给spring管理,为其建立代理对象 CGLIB public interface UserMapper extends BaseMapper<User> { ... }
v. 修改yml配置
mybatis-plus: # 类型别名包
vi. 编写配置方法
@Test public void testMyBatisPlus01(){ //查询全部的数据 List<User> userList = userMapper.selectList(null); System.out.println(userList); }
MyBatisPlus工做原理
ORM:利用对象的方式操做数据表
SQL:1) 数据库只能识别SQL语句,不能识别对象;2) 若是天天都写特别简单的SQL没有任何价值
核心原理:1) 利用注解表示对象与表的映射关系 @TableName("表名称"),字段与属性映射;2) 将公共的接口方法抽取到公共接口中,若是须要使用只须要继承便可;3) 操做对象时须要有专门的API实现对象与SQL的转化,最终交给MyBatis去执行
例子:userMapper.insert(User entity);
INSERT INTO 表名#{entity.getClass().getAnnotation("TableName").getValue()} (字段1,字段2,字段3... 遍历拿到属性的注解,拿到字段名) VALUES (值1,值2,值3... 遍历拿到属性值)
MyBatisPlus入门案例
i. 添加日志打印
# 打印SQL语句 logging: level: com.jt.mapper: debug
ii. 编写测试方法 -- selectById(),selectList()
/* 1.查询用户数据,根据id = 51 SQL: SELECT * FROM user WHERE id = 51 */ @Test public void testSelect01(){ User user = userMapper.selectById(51); //根据主键查询 System.out.println(user); } /* 2.查询用户数据,根据name = "王昭君" SQL: SELECT * FROM user WHERE name = "王昭君" */ @Test public void testSelect02(){ //条件构造器:主要做用是动态拼接WHERE条件 // = eq,> gt,< lt,>= ge,<= le QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "王昭君"); List<User> list = userMapper.selectList(queryWrapper); System.out.println(list); }
iii. 编写测试方法 -- orderBy(),like()
/* 3.查询性别为男性,按年龄降序" SQL: SELECT * FROM user WHERE sex = "男" ORDER BY age DESC*/ @Test public void testSelect03(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("sex", "男").orderByDesc("age"); List<User> list = userMapper.selectList(queryWrapper); System.out.println(list); } /* 4.查询名字包含"精",按年龄降序" SQL: SELECT * FROM user WHERE name LIKE "%精%" ORDER BY age ASC*/ @Test public void testSelect04(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", "精").orderByAsc("age"); List<User> list = userMapper.selectList(queryWrapper); System.out.println(list); }
iv. 编写测试方法 -- between(),or(),selectBatchIds(),in()
/* 5.查询age>=18 age<100 男性 */ @Test public void testSelect05(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); //默认的逻辑运算符就是and //queryWrapper.ge("age", 18).lt("age", 100).eq("sex", "男"); queryWrapper.between("age", 18, 100).eq("sex", "男"); List<User> list = userMapper.selectList(queryWrapper); System.out.println(list); } /* 6.id = 1,3,5,6,7 name = "黑熊精","白龙驴","大乔" */ @Test public void testSelect06(){ Integer[] ids = {1,3,5,6,7}; List idList = Arrays.asList(ids); List<User> list = userMapper.selectBatchIds(idList); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.in("name", "黑熊精","白龙驴","大乔"); List<User> list2 = userMapper.selectList(queryWrapper); System.out.println(list2); }
v. 编写测试方法 -- selectMaps(),insert()
/* 7.查询id,name字段信息*/ @Test public void testSelect07(){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.select("id","name"); List<User> list = userMapper.selectList(queryWrapper); System.out.println(list); List<Map<String,Object>> map = userMapper.selectMaps(queryWrapper); System.out.println(map); } @Test public void insert(){ User user = new User(); user.setId(null).setName("嫦娥").setAge(5).setSex("女"); userMapper.insert(user); }
练习:测试update()
/* 将id = 67的数据名称改成火星5号 */ @Test public void update(){ User user = new User(); user.setName("火星5号").setId(65); //根据对象中不为空的属性当作set的条件,主键当作更新的条件 userMapper.updateById(user); } /* 将火星5号的数据改成太阳5号,年龄改成1000 */ @Test public void update02(){ //参数说明: 实体对象 - 封装须要修改的数据 // wrapper - 构建修改条件 User user = new User(); user.setName("太阳5号").setAge(1000); UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name", "火星5号"); userMapper.update(user,updateWrapper); }