一、mybatis plus
针对单表的CRUD,程序员不需要写任何SQL,MP自动生成,只需要用自己的mapper实现MP中指定的一个接口即可
但是针对多表需要自己写SQL,与mybatis一致
代码生成器:通过一个简单代码实现自动生成entity、mapper、service、controller
1.1 mapper增删改测试
导入MP、MySQL依赖
<!-- MP -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
编写entity类
@Data
@Accessors(chain = true)
@TableName("user") //指定实体类对应的表名
public class User {
@TableId(type = IdType.AUTO) //在主键字段上添加注解,表名是主键
private Integer id;
private String name;
private Integer age;
private String email;
}
编写UserMapper实现BaseMapper接口
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
在src/test中的测试类中编写测试代码
@RunWith(SpringRunner.class)//让测试在spring容器环境下运行
@SpringBootTest //表示为springboot测试类
class MybatisplusApplicationTests {
@Autowired
private UserMapper userMapper;
//查询所有
@Test
void all() {
//参数:条件构造器 可以用来指定查询的条件
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
//insert
@Test
void insert(){
User user = new User().setName("wangba").setAge(10).setEmail("111@qq.com");
userMapper.insert(user);
}
//update
@Test
void update(){
User user = new User().setId(1013).setName("赵六").setAge(20);
//根据id更新数据:user中设置了哪些属性的值,就会更新哪些数据,没有赋值的则不更新
userMapper.updateById(user);
}
//自定义条件更新
@Test
void update2(){
User user = new User().setEmail("222@qq.com").setAge(21);
//更新数据的条件构造器 eq等于 equals
UpdateWrapper<User> wrapper = new UpdateWrapper<User>().eq("name","赵六");
//
userMapper.update(user,wrapper);
}
//删除
//以id删除
@Test
void delById(){
userMapper.deleteById(1013);
}
//以id批量删除
@Test
void delByIds(){
List<Integer> ids = new ArrayList<>();
ids.add(1006);
ids.add(1007);
userMapper.deleteBatchIds(ids);
}
//条件删除
@Test
void del(){
//map中指定条件,可以存在多个条件,条件之间是and关系
Map<String,Object> map = new HashMap<>();
map.put("name","lisi");
map.put("age",100);
//where name='lisi' and age=100
userMapper.deleteByMap(map);
}
}
1.2 mapper查询
新建QueryTest类
@RunWith(SpringRunner.class)
@SpringBootTest
class QueryTest {
@Autowired
private UserMapper userMapper;
}
注意:类名不要用public修饰,测试时如果报以下错误,请导入maven相关插件
错误信息:
Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project mybatisplus: There are test failures.
Please refer to D:\idea\mybatisplus\target\surefire-reports for the individual test results.
导入插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
基本查询
@RunWith(SpringRunner.class)
@SpringBootTest
class QueryTest {
@Autowired
private UserMapper userMapper;
//通过id查询
@Test
void findById(){
User user = userMapper.selectById(1003);
System.out.println(user);
}
//通过ids查询
@Test
void findByIds(){
List<Integer> ids = new ArrayList<>();
ids.add(1001);
ids.add(1002);
//id in (1001,1002)
List<User> users = userMapper.selectBatchIds(ids);
System.out.println(users);
}
//多条件查询 and
@Test
void findByMap(){
Map<String,Object> map = new HashMap<>();
map.put("name","lisi");
map.put("age",20);
List<User> users = userMapper.selectByMap(map);
System.out.println(users);
}
//多条件查询 or 条件构造器
@Test
void findOr(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","lisi").or().eq("age",20);
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
//多条件 and 条件构造器
@Test
void findAnd(){
User user = new User().setName("lisi").setAge(20);
QueryWrapper<User> wrapper = new QueryWrapper<>(user);//将entity作为初始化参数
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
//between and
@Test
void findBetween(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age",10,30);// [10,30]
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
//in
@Test
void findIn(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
// where name in ('zhangsan','lisi')
wrapper.in("name","zhangsan","lisi");
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
//like 模糊查询
@Test
void findLike(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name","%zhang%");
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
}
分页查询
@RunWith(SpringRunner.class)
@SpringBootTest
class PageQuery {
@Autowired
private UserMapper userMapper;
@Test
void page(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//获取分页对象:分页信息、数据
Page<User> page = userMapper.selectPage(new Page<>(1,2),null);
//总条数
System.out.println(page.getTotal());
//当前页的数据
System.out.println(page.getRecords());
//总页数
System.out.println(page.getPages());
//当前页
System.out.println(page.getCurrent());
//页大小
System.out.println(page.getSize());
}
}
1.3 Service查询
mybatis还提供了service接口查询
创建UserService接口
public interface UserService extends IService<User> {
}
创建对应实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
class ServiceImplTest {
@Autowired
private UserService userService;
//插入数据
@Test
void insert(){
User user = new User().setName("赵六").setAge(10).setEmail("333@qq.com");
userService.save(user);
}
//批量插入
@Test
void inserBatch(){
User user1 = new User().setName("赵六1").setAge(10).setEmail("333@qq.com");
User user2 = new User().setName("赵六2").setAge(10).setEmail("333@qq.com");
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
//全部插入
//userService.saveBatch(users);
//参数2:每次插入几条 自动分成多条SQL分别插入
userService.saveBatch(users,1);
}
//saveOrUpdate 插入或者更新 如果数据不存在则插入,否则更新 判断依据:主键
@Test
void saveOrUpdate(){
User user = new User().setId(1017).setName("孙七2");
userService.saveOrUpdate(user);
//userService.saveOrUpdateBatch() 批量更新或者插入
//userService.removeById() 以id删除
//userService.removeByIds(); 以ids批量删除
}
//多条件删除 and
@Test
void rmAnd(){
User user = new User().setName("lisi").setAge(20);
QueryWrapper<User> wrapper = new QueryWrapper<>(user);
//wrapper.eq().or().eq()
userService.remove(wrapper);
}
//多条件删除 or
/**
* 查询
*/
//id
@Test
void getId(){
User user = userService.getById(1001);
}
//条件查询
@Test
void getOne(){
User user = new User().setName("lisi");
QueryWrapper<User> wrapper = new QueryWrapper<>(user);
userService.getOne(wrapper);
}
//查询所有
@Test
void all(){
List<User> users = userService.list();
System.out.println(users);
}
//分页
@Test
void page(){
Page<User> page = new Page<>(1,2);
userService.page(page);
System.out.println(page.getTotal());
}
//条件分页
@Test
void conditionPage(){
//分页条件
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name","%a%");
//page
Page<User> page = new Page<>(1,2);
//查询
userService.page(page,wrapper);
//数据
System.out.println(page.getRecords());
}
}
1.4 自定义查询
如果对mybatis-plus方法不满意也可以自己编写SQL语句
在UserMapper中添加方法编写SQL
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
@Select("select * from user")
public List<User> all();
}
在UserService接口中添加对应方法
public interface UserService extends IService<User> {
public List<User> all();
}
在UserServiceImpl实现类中注入UserMapper实现方法
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> all() {
return userMapper.all();
}
}
测试mapper:
//自定义SQL
@Test
void all(){
List<User> users = userMapper.all();
System.out.println(users);
}
测试service
//自定义方法
@Test
void all2(){
List<User> users = userService.all();
System.out.println(users);
}
1.5 代码生成器
引入依赖
<!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<!-- velocity引擎:Apache下生成代码引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!-- ehcache缓存:缓存查询到的数据 -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
生成代码
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
public class CodeGenerator {
public static void main(String[] args) {
//全局设置
GlobalConfig globalConfig = new GlobalConfig();
//生成的文件输出到哪个位置,存放到哪个文件夹
globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
globalConfig.setAuthor("xiangwei"); //作者
globalConfig.setOpen(false); //是否打开输出目录
globalConfig.setFileOverride(true); //反复生成时是否覆盖
//设置service接口名字,%s为获取实体类名字,如果不设置Service
//接口将以大写字母I开头
globalConfig.setServiceName("%sService");
globalConfig.setControllerName("%sController");//设置controller的名字
globalConfig.setBaseColumnList(true); //是否生成字段的SQL代码片段
globalConfig.setEnableCache(true); //是否开启二级缓存
globalConfig.setBaseResultMap(true); //是否生成基本的resultMap
//设置数据源
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/plus?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("root");
//配置策略
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(true); //全局大写命名
strategyConfig.setEntityLombokModel(true); //是否为lombok样式的entity
strategyConfig.setTablePrefix(new String[]{"mall_"}); //忽略表前缀 类名相关 User
//strategyConfig.setFieldPrefix(new String[]{""});//忽略字段前缀 属性相关
//包名策略
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.woniuxy.mybatisplusgenerater") //父包名
.setController("controller") //controller包名
.setEntity("entity") //entity包名
.setMapper("mapper") //mapper接口包名
.setXml("mapper.xml") //mapper.xml包名
.setService("service") //service包名
.setServiceImpl("service.impl"); //service实现类包名
//代码生成器
AutoGenerator autoGenerator = new AutoGenerator();
//生成器设置属性
autoGenerator.setGlobalConfig(globalConfig);
autoGenerator.setDataSource(dataSourceConfig);
autoGenerator.setStrategy(strategyConfig);
autoGenerator.setPackageInfo(packageConfig);
//执行生成代码
autoGenerator.execute();
}
}
运行程序生成controller、service、mapper、entity及xml文件
在resource下创建mybatis文件夹,并添加mybatis-config.xml,创建mappers目录将刚才生成的所有xml文件移到该目录下
修改application.yml指定配置文件加载路径、数据库基本参数
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/plus?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
logging:
level:
root: info #logback全局默认日志级别
mybatis-plus:
config-location: classpath:/mybatis/mybatis-config.xml #主配置文件
mapper-locations: classpath:/mybatis/mappers/*.xml #mapper文件
type-aliases-package: com.woniuxy.mybatisplusgenerater.entity #别名
修改UserController添加方法用于测试
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/all")
@ResponseBody
public List<User> all(){
return userService.list();
}
}
在UserMapper上添加对应注解
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
在主启动类上开启mapper扫描
@SpringBootApplication
@MapperScan("com.woniuxy.mybatisplusgenerater.mapper")
public class MybatisPlusGeneraterApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusGeneraterApplication.class, args);
}
}
运行项目发送请求测试
二、Linux - 操作系统
基本操作指令
安装JDK、MySQL、Tomcat、项目部署、程序安装
常见操作系统
- windows
- Unix
- Linux
- Mac
- Android
- 塞班
Unix系统,现在大多数的操作都是基于Unix发展而来,windows核心就Unix,Linux借鉴了Unix思想发展而来
Linux分类
- Redhat 20W
- Ubuntu
- centos
为啥要学Linux - 项目需要部署到Linux操作系统上
虚拟机:
- 虚拟机软件:安装在windows,用来运行Linux操作系统
- VMware
- virtualbox
- 操作系统:操作运行在虚拟机软件上
安装虚拟机软件及操作系统
坑1:VMware14版本的 电脑比较老 建议换12及以下的版本
坑2:在安装系统是可能会弹一个蓝色对话框 vmxxx ->百度 按照百度上步骤去修BIOS参数 重启