MyBatis介绍
MyBatis主要作用于Dao层,可以简化数据访问的操作
Mybatis调用步骤
先导入相关依赖
根据数据库设计对应的类
数据库连接application.properties
接口化编程 (这里使用@Mepper和@Select来简化JDBC操作)
配置Sql提示
JDBC介绍
JDBC vs Mybatis
数据库连接池
小结
Lombok的使用
上述代码实例:
UserMapper
package com.itheima.mapper;
import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper // 在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper {
// 查询全部用户信息
@Select("select * from user")
public List<User> list();
}
pojo.User
package com.itheima.pojo;
import lombok.*;
/*
@Data
@Getter
@Setter
@ToString
@EqualsAndHashCode
*/
@Data
@NoArgsConstructor // 无参构造
@AllArgsConstructor // 有参构造
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
Test
package com.itheima;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest // Springboot 整合单元测试的注解
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List<User> userList = userMapper.list();
userList.stream().forEach(user -> {
System.out.println(user);
});
}
}
日志输出
Mybatis – crud
删除
预编译SQL
SQL注入
删除小结
增加
增加(主键返回)
增加小结
更新
查询(根据id查询)
数据封装
第三种需要严格遵守数据库字段名是a_column 类中的属性名是aColumn的驼峰命名
条件查询
XML映射文件
XML映射文件定义规范
动态SQL
什么叫动态SQL?动态SQL有什么用呢?
、
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。
当我们想要查询所有姓张的用户,其余几个参数为null,
我们要返回所有姓张的数据
if标签和where标签
对where标签的理解
where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件。
在if标签和choose-when-otherwise标签的案例中,SQL语句加入了一个条件’1=1’,它既保证了where后面的条件成立,也避免了where后面出现的第一个词语是and 或者or之类的关键字。
假设把条件‘1=1’去掉,可以出现以下语句
select * from t_customer where and username like concat('%','#{username}','%')
set标签
小结
forEach标签
sql片段(相当于函数)
小结
代码示例
EmpMapper
package com.itheima.Mapper;
import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.*;
import java.time.LocalDate;
import java.util.List;
@Mapper
public interface EmpMapper {
//根据ID删除数据
@Delete("delete from mybatis.emp where id = #{id}")
public void delete(Integer id);
// 新增员工
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("Insert into mybatis.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
" values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entryDate}, #{deptId}, #{createTime}, #{updateTime})")
public void insert(Emp emp);
//public int delete(Integer id);
// 更新操作
@Update("update mybatis.emp set username = #{username}, name = #{name}, gender = #{gender}, image = #{image}," +
" job = #{job}, entrydate = #{entryDate}, dept_id = #{deptId}, update_time = #{updateTime} where id = #{id}")
public void update(Emp emp);
// 根据id查询员工
@Select("select * from mybatis.emp where id = #{id}")
public Emp getByid(Integer id);
/* @Results({
@Result(column = "dept_id", property = "deptId"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime")
})
@Select("select * from mybatis.emp where id = #{id}")
public Emp getByid(Integer id);*/
// 开启mybatis的驼峰命名自动映射开关 --- a_cloumn ------> aColumn
// 条件查询
/* @Select("select * from mybatis.emp where name like concat('%', #{name}, '%') and gender = #{gender} and " +
"entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);*/
//动态条件查询
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
//动态更新员工
public void update2(Emp emp);
// 批量删除员工
public void deleteByIds(List<Integer> ids);
}
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.Mapper.EmpMapper">
<sql id="commenSelect">
select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time
from mybatis.emp
</sql>
<!--动态更新员工信息-->
<update id="update2">
update mybatis.emp
<set>
<if test="username != null">
username = #{username},
</if>
<if test="name != null">
name = #{name},
</if>
<if test="gender != null">
gender = #{gender},
</if>
<if test="image != null">
image = #{image},
</if>
<if test="job != null">
job = #{job},
</if>
<if test="entryDate != null">
entrydate = #{entryDate},
</if>
<if test="deptId != null">
dept_id = #{deptId},
</if>
<if test="updateTime != null">
update_time = #{updateTime}
</if>
</set>
where id = #{id}
</update>
<!--resultType:单条记录所封装的类型-->
<select id="list" resultType="com.itheima.pojo.Emp">
<include refid="commenSelect"/>
<where>
<if test="name != null">
name like concat('%', #{name}, '%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="begin != null and end != null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
<!--批量删除员工 (15, 18, 19)-->
<!--collection: 遍历的集合
item:遍历出来的元素
separator:分隔符
open: 遍历开始前拼接的SQL片段
close:遍历结束后拼接的SQL片段-->
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
</mapper>
Emp
package com.itheima.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
private Integer id;
private String username;
private String password;
private String name;
private Short gender;
private String image;
private Short job;
private LocalDate entryDate;
private Integer deptId;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234
# 日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
SpringbootMybatisCrudApplicationTests
package com.itheima;
import com.itheima.Mapper.EmpMapper;
import com.itheima.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired
private EmpMapper empMapper;
@Test
public void testDelete() {
//int delete = empMapper.delete(16);
//System.out.println(delete);
empMapper.delete(16);
}
@Test
public void testInsert() {
// 构造员工对象
Emp emp = new Emp();
emp.setUsername("Tom3");
emp.setName("汤姆3");
emp.setImage("1.jpg");
emp.setGender((short) 1);
emp.setJob((short) 1);
emp.setEntryDate(LocalDate.of(2000, 1, 1));
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
emp.setId(1);
//执行新增员工的增加操作
empMapper.insert(emp);
System.out.println(emp.getId());
}
@Test
// 更新员工
public void testUpdate() {
// 构造员工对象
Emp emp = new Emp();
emp.setUsername("Tom1");
emp.setName("汤姆1");
emp.setImage("1.jpg");
emp.setGender((short) 1);
emp.setJob((short) 1);
emp.setEntryDate(LocalDate.of(2000, 1, 1));
emp.setUpdateTime(LocalDateTime.now());
emp.setId(18);
//执行更新员工操作
empMapper.update(emp);
}
//根据id查询员工
@Test
public void testGetById() {
Emp emp = empMapper.getByid(19);
System.out.println(emp);
}
// 条件查询
@Test
public void testList() {
List<Emp> empList = empMapper.list(null, (short) 1, null, null);
System.out.println(empList);
}
// 动态更新员工 - 更新ID为18的员工 username 更新为 Tom111,name更新为 汤姆111,gender而更新为2
@Test
// 更新员工
public void testUpdate2() {
// 构造员工对象
Emp emp = new Emp();
emp.setUsername("Tom222333");
/*emp.setName("汤姆222");
emp.setImage("1.jpg");
emp.setGender((short) 1);
emp.setUpdateTime(LocalDateTime.now());
*/
emp.setId(19);
//执行更新员工操作
empMapper.update2(emp);
}
@Test
public void testDeleteByIds() {
List<Integer> ids = Arrays.asList(13, 14, 15);
empMapper.deleteByIds(ids);
}
}
个人理解
空串""和null串有啥区别?
空串是一个长度为0内容为空的字符串,属于是一个字符串对象;
null串表示这个变量并未引用任何的对象或者基本数据类型值,属于是一个供引用数据变量引用的值。
空串引用String的API 会返回值,但是null串调用String的API 的话会报NullPointerException的错误。
一般情况下都会使用if(str != null && str.length() != 0)对字符串进行检查,符合条件才会使用这个字符串。