Mybatis&Mybatis-Plus
2023-12-28 20:39:33
    		一、idea开发mybatis
1.导入坐标
? ? ? ? 在pom.xml文件中导入所需要的坐标
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>2.构造实体类
public class Student {
    private int stuId;
    private String stuName;
    private String stuHobby;
    private String stuAge;
    @Override
    public String toString() {
        return "Student{" +
                "stuId=" + stuId +
                ", stuName='" + stuName + '\'' +
                ", stuHobby='" + stuHobby + '\'' +
                '}';
    }
    public int getStuId() {
        return stuId;
    }
    public void setStuId(int stuId) {
        this.stuId = stuId;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public String getStuHobby() {
        return stuHobby;
    }
    public void setStuHobby(String stuHobby) {
        this.stuHobby = stuHobby;
    }
    public Student(){
    }
    public Student(String stuName, String stuHobby) {
        this.stuName = stuName;
        this.stuHobby = stuHobby;
    }
    public Student(int stuId, String stuName, String stuHobby) {
        this.stuId = stuId;
        this.stuName = stuName;
        this.stuHobby = stuHobby;
    }
}
3.配置文件
StudentMapper文件:
public interface StudentMapper {
    @Insert("insert into student(stu_name,stu_hobby) values(#{stuName},#{stuHobby})")
    public void saveStu(Student student);
    @Select("select * from student")
    public List<Student> findAll();
}
Application.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--全局设置-->
    <settings>
        <!--自动驼峰映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--开发模式-->
    <environments default="env">
        <environment id="env">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/230809db?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册映射器-->
    <mappers>
        <package name="com.apesource.dao"/>
    </mappers>
</configuration>4.编写映射器
public interface StudentMapper {
    @Insert("insert into student(stu_name,stu_hobby) values(#{stuName},#{stuHobby})")
    public void saveStu(Student student);
    @Select("select * from student")
    public List<Student> findAll();
}5.测试
public class Test01 {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/230809db?serverTimezone=GMT", "root", "123456");
            System.out.println(root);
        } catch (ClassNotFoundException exception) {
            exception.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}mybatis自动驼峰映射
| JavaBean | DB | 
| stuId | stu_id | 
| stuName | stu_name | 
| stuHobby | stu_hobby | 
开启自动驼峰映射步骤:配置文件中配置mapUnderscoreToCamelCase
<settings>
        <!--自动驼峰映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>junit
含义:junit专业测试方法的工具
注意:在test目录下的java目录下创建包的时候,包的名称必须与main下的java目录里面的父包名称一致
步骤:
1.坐标
<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.13.2</version>
     <scope>test</scope>
</dependency>2.注解:修饰在方法上
????????@Test=========》main
????????@Before=======》在@Test直接执行之前运行
????????@After========》在@Test直接执行之后运行
public class Test01 {
    InputStream inputStream = null;
    SqlSession sqlSession = null;
    StudentMapper mapper = null;
    @Before
    public void beforeMethod(){
        try {
            inputStream = Resources.getResourceAsStream("Application.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = sqlSessionFactoryBuilder.build(inputStream);
            sqlSession = factory.openSession(true);
            mapper = sqlSession.getMapper(StudentMapper.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @After
    public void afterMethod(){
        try {
            sqlSession.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void findAll(){
        List<Student> all = mapper.findAll();
        for (int i = 0; i < all.size(); i++) {
            Student student =  all.get(i);
            System.out.println(student);
        }
    }
    @Test
    public void save(){
            Student student1 = new Student("张三","敲代码~");
            Student student2 = new Student("李四","唱跳rap");
            Student student3 = new Student("王五","篮球");
            mapper.saveStu(student1);
            mapper.saveStu(student2);
            mapper.saveStu(student3);
    }
}
lombok
步骤:
1.idea开发工具安装插件(有且只做一次)
2.坐标
<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>3.注解
- @Data:该注解会自动生成 getter、setter、equals、hashCode 和 toString 方法,同时还会生成一个无参构造函数和一个拷贝构造函数。
- @Getter:该注解用于生成指定字段的 getter 方法。
- @Setter:该注解用于生成指定字段的 setter 方法。
- @NoArgsConstructor:该注解用于生成一个无参构造函数。
- @AllArgsConstructor:该注解用于生成一个包含所有字段的构造函数。
- @ToString:该注解用于生成一个 toString 方法,该方法将返回类名和字段值的字符串表示形式。
- @EqualsAndHashCode:该注解用于生成 equals 和 hashCode 方法,用于比较对象是否相等。
- @Slf4j:该注解用于生成一个 logger 对象,用于记录日志。
- @Log4j:该注解用于生成一个 Log4j logger 对象,用于记录日志。
mybatis-plus
步骤:
1.坐标
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.1.1</version>
</dependency>? ? ? ? 注意:mp坐标添加后,mybatis坐标移除
2.编写注解配置实体类与关系表映射关系(truncate清空表以及主键)
? ? ? ? @TableName(value = "关联表名称")????????修饰在类
? ? ? ? @TableField(value = "关联字段名称")????????修饰在属性
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?exist = "忽略字段"
? ? ? ? @TableId(type="指定主键生成策略,默认雪花算法")????????修饰在属性
- ? ? ? ? ? ? ? ? ? ? AUTO(0),
- ? ? ? ? ? ? ? ? ? ? NONE(1),
- ? ? ? ? ? ? ? ? ? ? INPUT(2),
- ? ? ? ? ? ? ? ? ? ? ASSIGN_ID(3),
- ? ? ? ? ? ? ? ? ? ? ASSIGN_UUID(4);
-  @TableName(value = "student") public class Student { @TableId(value = "stuid",type = IdType.AUTO) private int stuId; @TableField(value = "stuname") private String stuName; @TableField(value = "stuhobby") private String stuHobby; @TableField(value = "stuage") private String stuAge; public Student(String stuName, String stuHobby) { this.stuName = stuName; this.stuHobby = stuHobby; } }
? ? 3.使用
? ? ? ? BaseMapper????????公共的数据访问层
? ? ? ? IService/ServiceImp????????公共的业务层
public interface StudentMapper extends BaseMapper<Student> {
    @Insert("insert into student(stuname,stuhobby) value(#{stuName},#{stuHobby})")
    public void saveStu(Student student);
    @Select("select * from student")
    public List<Student> findAll();
}? ? 4.测试代码使用MyBatisSqlSessionFactoryBuilder
public class Test03 {
    InputStream inputStream = null;
    SqlSession sqlSession = null;
    StudentMapper mapper = null;
    @Before
    public void beforeMethod(){
        try {
            //1.加载资源文件
            inputStream =  Resources.getResourceAsStream("mybatis.xml");
            //2.创建构造器
            MybatisSqlSessionFactoryBuilder builder = new MybatisSqlSessionFactoryBuilder();
            //3.创建工厂
            SqlSessionFactory factory = builder.build(inputStream);
            //4.获取会话
            sqlSession =  factory.openSession(true);
            //5.加载映射器
            mapper =  sqlSession.getMapper(StudentMapper.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @After
    public void afterMethod(){
        try {
            sqlSession.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void findAll(){
        List<Student> all = mapper.findAll();
        for(int i = 0; i< all.size();i++){
            Student student = all.get(i);
            System.out.println(student);
        }
    }
    @Test
    public void show1(){
       //1.条件查询
        LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper<Student>();
        lambdaQueryWrapper.eq(Student::getStuName,"123");
        //2.查询
        List<Student> list = mapper.selectList(lambdaQueryWrapper);
        for (int i = 0; i < list.size(); i++) {
            Student student =  list.get(i);
            System.out.println(student);
        }
    }
    //模拟动态查询1
    @Test
    public void test02(){
        Integer num1 = null;
        Integer num2 = 30;
        //1.查询条件
        LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper<Student>();
        //2.判断
        if (null != num2){
            lambdaQueryWrapper.lt(Student::getStuAge,num2);
        }
        if (null != num2){
            lambdaQueryWrapper.gt(Student::getStuAge,num1);
        }
        //3.查询
        List<Student> list =  mapper.selectList(lambdaQueryWrapper);
        for (int i = 0; i < list.size(); i++) {
            Student student =  list.get(i);
            System.out.println(student);
        }
    }
    //模拟动态查询2
    @Test
    public void show3(){
        //1.前端发送来的数据
        Integer num1 = null;
        Integer num2 = 30;
        //1.查询条件
        LambdaQueryWrapper<Student> lambdaQueryWrapper =  new LambdaQueryWrapper<Student>();
        //2.判断
        lambdaQueryWrapper.lt(null != num2, Student::getStuAge,num2);
        lambdaQueryWrapper.gt(null != num1, Student::getStuAge,num1);
        //3.查询
        List<Student> list =  mapper.selectList(lambdaQueryWrapper);
        for (int i = 0; i < list.size(); i++) {
            Student student =  list.get(i);
            System.out.println(student);
        }
    }
    //投影查询-字段查询
    @Test
    public void show4() {
        //1.条件
        LambdaQueryWrapper<Student> lambdaQueryWrapper  = new LambdaQueryWrapper<Student>();
        lambdaQueryWrapper.select(Student::getStuName, Student::getStuHobby);
        //2.查询
        List<Student> list =  mapper.selectList(null);
        //4.遍历
        for (int i = 0; i < list.size(); i++) {
            Student student =  list.get(i);
            System.out.println(student);
        }
    }
    //投影查询-聚合查询
    @Test
    public void show5() {
        //1.查询条件
        QueryWrapper queryWrapper = new QueryWrapper<Student>();
        //2.判断
        queryWrapper.select("count(*) as num1,sum(stu_age) as num2,max(stu_age) as num3");
        //3.查询
        List<Map<String,Object>> list =  mapper.selectMaps(queryWrapper);
        //4.遍历
        System.out.println(list);
    }
    //分组查询
    @Test
    public void show6() {
        //1.查询条件
        QueryWrapper queryWrapper = new QueryWrapper<Student>();
        //2.判断
        queryWrapper.select("count(*) as num1,stu_hobby");
        queryWrapper.groupBy("stu_hobby");
        //3.查询
        List<Map<String,Object>> list =  mapper.selectMaps(queryWrapper);
        //4.遍历
        System.out.println(list);
    }
    /**
     * 物理删除:业务数据从数据库中丢弃,执行的是delete操作
     * 逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,
     *         数据保留在数据库中,执行的是update操作
     *         实现步骤:
     *          步骤1:修改数据库表添加`deleted`列,比如`0`代表正常,`1`代表删除,可以在添加列的同时设置其默认值为`0`正常。
     *          步骤2:实体类添加属性以及注解
     *          @TableLogic(value="0",delval="1")
     *          private Integer deleted;
     *              value为正常数据的值,delval为删除数据的值
     * */
    //逻辑删除
    @Test
    public void show7() {
        mapper.deleteById(6);
    }
}
?
    			文章来源:https://blog.csdn.net/m0_73514610/article/details/135222069
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!