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

java 可以以is开头命名吗_User

 

java 可以以is开头命名吗_java 可以以is开头命名吗_02

@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容器启动成功,等待用户的调用.

java 可以以is开头命名吗_User_03


版权声明:本文为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包

java 可以以is开头命名吗_java 可以以is开头命名吗_04

 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);
    }