volatile原理
(1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
(2)它会强制将对缓存的修改操作立即写入主存;
yield()
yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!果是写操作,它会导致其他CPU中对应的缓存行无效。
Springel表达式:
工作原理:
容器: 在内存中一个存储大量数据的Map集合
当SpringBoot程序启动时,首先加载application.yml的配置文件
当程序加载key-value结构时,将数据保存到Map集合中(容器内部)
利用Spel表达式,通过key,获取value,之后为属性赋值.
在yml中配置
userinfo:
name: jack
age: 18
//使用@Value将值赋给name,和value
@Value("${userinfo.name}")
String name;
@Value("${userinfo.age}")
String age;
@RequestMapping("/get")
public void get(){
//测试输出结果过
System.out.println(name);
System.out.println(age);
}
}
//输出
jack
18
在properties中配置
user.info2=liu
使用
//指定配置文件加载
@PropertySource(value="classpath:/user.properties",encoding = "utf-8")
@RestController
public class CarController {
@Value("${user.info2}")//赋值
String name2;
@RequestMapping("/get2")
public void get2(){
System.out.println(name2);
}
//输出结果
liu
热部署
热部署jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
装好后 重启idea,使用组合键ctrl+shift+alt+/或者ctrl+alt+a
选中Registry
@SpeingBootTest
注解说明: 如果测试方法中添加了该注解,则当执行@Test注解方法时,则Spring容器将会启动,启动之后将所有需要依赖注入的信息完整构建.之后用户有针对性的挑选需要测试的代码 测试即可.
SpringBoot加载器顺序
当用户点击main方法时启动程序.(开始)
SpringBoot程序开始加载主启动类上边的注解@SpringBootApplication(SpringBoot内部运行机制开始执行)
当SpringBoot程序开始执行,则会动态的获取当前主启动类的包路径.(com.jt)
通过包扫描的机制 将特定的注解标识的类(Controller/Service/Dao).交给Spring容器管理.
Spring容器维护的是一个Map集合 <K,V>
key: 类名首字母小写 userController
value: 实例化的对象
例子: Map<userController,UserController的对象>
当对象创建时(实例化),遇到@Autowired 则需要依赖注入对象,当整个Spring容器内部都没有该对象时,则会报错 注入失败. 如果Map中维护了需要注入的对象,.则@Autowired 注入成功, 则最终对象实例化正常.
当上述的操作都运行成功之后则spring容器启动成功,等待用户的调用.
版权声明:本文为CSDN博主「闪耀太阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
mybatis使用注解方式查询数据库:
在mapper接口上加
注意:映射文件和注解只能二选一,不然会报错
package cn.tedu.mapper;
import cn.tedu.pojo.Car;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface CarMapper {
@Select("select * from car where id =#{id}")
Car get(int id);
}
@Select
@Insert
@Update
@Delete
MP入门
1.导入mybatis-plus包
2.创建映射类
package cn.tedu.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)//开启链式加载
@TableName("user")//表的名字与对象名字对应
public class User {
// @TableId(type = IdType.AUTO)设定主键自增
private Integer id;
// @TableField("name") 属性和字段映射,名字相同时可省略
private String name;
private String addr;
private Integer age;
}
3.创建yml配置文件
mybatis-plus:
#设置包别名
type-aliases-package: cn.tedu.pojo
# 加载配置文件
mapper-locations: classpath:/mappers/*.xml
# 开启驼峰映射
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.tedu.mapper: debug #打印sql语句
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: root
server:
port: 8090
4.创捷mapper层
package cn.tedu.mapper;
import cn.tedu.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
//一定要继承公共接口,添加泛型,泛型对象未用来映射的类
public interface UserMapper extends BaseMapper<User> {
}
5,创建service层
package cn.tedu.service;
import cn.tedu.pojo.User;
import java.util.List;
public interface Uservice {
List<User> finaAll();
}
package cn.tedu.service;
import cn.tedu.mapper.UserMapper;
import cn.tedu.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements Uservice {
@Autowired
UserMapper userMapper;
@Override
public List<User> finaAll() {
List<User> list = userMapper.selectList(null);//直接使用userMapper代理对象调用mybatis-plus的方法来查询数据库
return list;
}
}
6.创建controller层
package cn.tedu.controller;
import cn.tedu.pojo.User;
import cn.tedu.service.Uservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class Controller {
@Autowired
Uservice uservice;
@RequestMapping("/findAll")
public List<User> findAll(){
return uservice.finaAll();
}
}
7.启动测试类
package cn.tedu;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("cn.tedu.mapper")
@SpringBootApplication
public class TestSsm3Application {
public static void main(String[] args) {
SpringApplication.run(TestSsm3Application.class, args);
}
}
MP的一些基础用法:
1.
//通过id查询数据库,将数据封装进对象中
@RequestMapping("/get/{id}")
public User get(User user){
return uservice.get(user);
}
@Override
public User get(User user) {
User user1 = userMapper.selectById(user.getId());//根据id查询
QueryWrapper queryWrapper=new QueryWrapper(user);//根据对象中不为空的属性查询
User user2 = userMapper.selectOne(queryWrapper);
// return user1;
return user2;
}
2.条件构造器
gt > lt< eq= >=ge <=le !=ne
like关键字; 包含某个字符的 :queryWrapper.like(,)
以某个字符开头的:queryWrapper.likeLeft
以某个字符结尾的:queryWrapper.likeRight
用法和下面一样
@Override
public User get() {
QueryWrapper queryWrapper =new QueryWrapper();
queryWrapper.eq("age", 28);//条件构造器 eq==
return userMapper.selectOne(queryWrapper);
}
关键字
@Override
public List<User> get() {
Integer [] id=new Integer[]{1,2,3};
QueryWrapper<User> queryWrapper=new QueryWrapper();
queryWrapper.in("id", id);
List<User> list = userMapper.selectList(queryWrapper);
return list;
}
注意:查询结果为一个的时候可以使用selectOne,不确定的情况下使用selectList
获取主键
List<Object> objects = userMapper.selectObjs(null);
根据用户的条件动态的拼接where条件
@Override
public List<User> get(User user) {
Boolean b=(user.getName()!=null&& StringUtils.hasLength(user.getName()));//b为true时才拼串
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq(b,"name",user.getName());
return userMapper.selectList(queryWrapper);
}
修改,删除操作基本一致,将select换成update/delete即可
新增操作:
@Override
public void get() {
User user=new User();
user.setAddr("长").setAge(12).setId(21).setName("jj");
userMapper.insert(user);
}
修改
@Override
public void get() {
User user=new User();
user.setAddr("deng").setAge(12).setName("jack").setId(2);
userMapper.updateById(user);
}