1.Spring 补充
1.1 Spring内部数据结构
1.数据的结构: Map 理解为容器
2.数据内容: KEY-VALUE -KEY:一般都是类名的首字母小写 helloController -Value: 一般存储的是经过反射等机制实例化的对象 Map<helloController,controller对象>
3.单例: 容器中只保存一个对象, spring容器管理对象的生命周期 和容器几乎同生共死
默认:单例对象
多例: 如果用户需要使用,则新创建一个对象交给用户使用,由用户管理对象的生命周期.
- bean配置文件说明
<bean id="唯一标识" class="类的路径" /> 与Map集合进行关联
2.关于环境代码报错
2.1 数据库问题
Mysql数据库版本: 教师机 5.5 高版本的数据库6.0以上.
2.2 IDEA版本问题
修改mybatis的路径
3. MybatisPlus
3.1 MP介绍
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
3.2 特点说明
重点说明: MP适用于单表操作 如果遇到多表关联,则手写Sql效率更高.
3.3 MP入门案例
3.3.1 导入jar包
说明: 由于MP内部兼容了Mybatis 则引入MP之后将原来的mybatis的包删除.
<!--spring整合mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
3.3.2 对象与表映射
3.3.3 继承公共的Mapper接口
3.3.4 修改YML配置文件
说明: springBoot应该由原来的Mybatis操作数据库,现在换成MP的机制,所以应该修改SpringBoot整合MP的操作.
3.3.4 编辑MP入门案例
对比Sql写法/MP写法的区别…
@SpringBootTest
public class TestMybatis {
// sprign容器 <userMapper,代理对象>
// 面向接口编程 扩展性好
@Autowired
private UserMapper userMapper;//JDK动态代理
//报错说明:com.jt.mapper.UserMapper.findAll 不匹配!!!!
//关于测试类代码说明: 要求: public 返回值void 方法名称不能叫test
@Test
public void test01(){
System.out.println(userMapper.getClass());
List<User> userList = userMapper.findAll(); //接口的方法 数据库只能识别Sql语句
System.out.println(userList);
}
//查询 用户的全部记录 面向对象的方式操作数据库.
//只能用于单表查询
@Test
public void testFind(){
//暂时不需要任何where条件 查询的是全部记录.
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
}
3.4 Mybatis CURD操作练习
3.4.1 编辑测试代码
@Test
public void insert(){
User user = new User();
user.setName("星期五").setAge(18).setSex("男");
userMapper.insertUser(user);
System.out.println("新增用户成功");
}
//根据name="星期五",将name="星期六"
@Test
public void update(){
String oldName = "星期五";
String newName = "星期六";
userMapper.updateByName(oldName,newName);
System.out.println("更新用户成功");
}
//删除用户信息 根据name属性删除数据
@Test
public void delete(){
String name = "星期六";
userMapper.deleteByName(name);
System.out.println("删除用户成功");
}
3.4.2 编辑Mapper接口
@Insert("insert into demo_user(id,name,age,sex) " +
"value (null,#{name},#{age},#{sex})")
void insertUser(User user);
@Update("update demo_user set name = #{newName} where name=#{oldName}")
void updateByName(String oldName, String newName);
//Mybatis中如果传递的参数只有一个,则名称任意 一般不用.
@Delete("delete from demo_user where name=#{name}")
void deleteByName(String name);
3.5 MP的工作原理
1).通过注解 实现对象与表一一映射.
2).通过属性注解 实现对象的属性与表中的字段一一映射.
3).将公共的方法进行抽取,抽取到BaseMapper接口中
4).将用户操作的方法对象,转化为数据库能够识别的Sql语句.
demo1: userMapper.insert(user对象)
Sql1: insert into 表名(字段名…) value (属性值…)
其实就是在做字符串拼接
拼接过程:
insert into 表名(字段名…) value (属性值…)
1).通过userMapper 查找父级接口BaseMapper
2).根据BaseMapper 查找泛型对象 User对象.
3).根据user对象 查找指定的注解 @TableName,获取表名
4).根据user对象的属性,动态获取表中的字段.@TableField
5).在获取字段的同时,获取属性的值,最后进行sql拼接
6).MP将拼接好的Sql交给Mybatis框架处理执行.
insert into demo_user(id,name…) value (value1,value2…)
3.6 MP练习
3.6.1 根据ID查询
/**
* 1.根据Id=23数据
*/
@Test
public void select01(){
User user = userMapper.selectById(23);
System.out.println(user);
}
3.6.2 对象查询
配置日志:
/**
* 查询 name="潘凤" sex="男"
* 结果: 1项 userMapper.selectOne()
* 多项 userMapper.selectList()
* Sql: where name="xxx" and sex="xxx"
* queryWrapper: 条件构造器 拼接where条件
* 如果遇到多条件查询,则默认的连接符and
* 方式1: 可以通过对象的方式进行控制
*/
@Test
public void select02(){
User user = new User();
user.setName("潘凤").setSex("男");
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
3.6.3 特殊字符练习
/**
* 要求: age>18岁 or sex=男的用户
* 转义字符: > gt, < lt , = eq
* >= ge , <= le
*/
@Test
public void select03(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//编辑的是数据库字段信息
queryWrapper.gt("age", 18)
.or()
.eq("sex","男");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
3.6.4 like关键字
/**
* 要求: 查询name中包含"精" 并且按照age 降序排列
* Sql: like "%精%" 包含精
* like "精%" 以精开头
* like "%精" 以精结尾
*/
@Test
public void select04(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name","精")
.orderByDesc("age");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
3.6.5 In关键字
/**
* 查询多个数据
* 查询ID= 1 3 6 7的数据
* where id in (xx,xx,xx,xx)
* 如果遇到多值传参,一般采用对象的方式封装数据
*/
@Test
public void select05(){
Integer[] ids = {1,3,6,7};
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.in("id", ids);
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
3.6.6 不为null查询
/**
* 需求: 查询name为null的数据
*/
@Test
public void select06(){
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.isNull("name");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
3.6.7 动态Sql语句查询
/**
* 动态sql查询:
* 要求: 根据 age 属性与sex属性进行查询.
* 如果其中数据为null 则不参与where条件的拼接
* where age>18 and sex="男"
* 错误Sql:
* SELECT id,name,age,sex FROM demo_user WHERE (age > ? AND sex = ?)
* 18(Integer), null
* MP实现动态查询:
* 参数1: condition boolean类型数据 true 拼接条件
* false 不拼接条件
* 参数2: 字段名称
* 参数3: 字段值
*/
@Test
public void select07(){
Integer age = 18;
String sex = "男";
//boolean flag = sex != null && sex.length()>0;
//条件判断
boolean flag = StringUtils.hasLength(sex);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt(age>0, "age", age)
.eq(flag,"sex",sex);
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
3.6.8 挑选字段查询
/**
* demo1:只查询 name,age字段信息
* 挑选查询的字段信息
* queryWrapper.select("name","age");
*/
@Test
public void select08(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name","age");
//没有查询的数据以null返回
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
//* demo2: 只要求返回name,age字段
@Test
public void select09(){
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.select("name","age");
List<Map<String,Object>> list = userMapper.selectMaps(queryWrapper);
System.out.println(list);
}
//* 要求返回第一列的数据
// 如果包含了条件数据 则需要通过条件构造器封装
@Test
public void select10(){
List<Object> list = userMapper.selectObjs(null);
System.out.println(list);
}