【MyBatis】| 使⽤MyBatis完成CRUD操作

目录

一:使⽤MyBatis完成CRUD

1. Mybatis完成insert使用Map集合传参

2. Mybatis完成insert使用PoJo传参

3. MyBatis完成delete删除操作

4. MyBatis完成update更新操作

5.  MyBatis完成select查一个

6. Mybatis完成select查所有

7. SQL Mapper映射文件的namespace


一:使⽤MyBatis完成CRUD

准备工作

(1)创建module(Maven的普通Java模块)

(2)配置pom.xml

①打包⽅式jar

②引入依赖:mybatis依赖、mysql驱动依赖、junit依赖、logback依赖

(3)mybatis-config.xml放在类的根路径下

(4)CarMapper.xml放在类的根路径下

(5)logback.xml放在类的根路径下

(6)提供com.bjpowernode.mybatis.utils.SqlSessionUtil⼯具类

(7)创建测试⽤例:com.powernode.mybatis.CarMapperTest

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>mybatis-002-crud</groupId>
    <artifactId>com.bjpowernode</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--出现1.5的警报,就加上这两句话-->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <!--打包方式jar-->
    <packaging>jar</packaging>
    <!--引入依赖-->
    <dependencies>
        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>
        <!--mysql驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.23</version>
        </dependency>
        <!--加入单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--引入logback的依赖-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

1. Mybatis完成insert使用Map集合传参

(1)什么是CRUD,C: Create增、R: Retrieve查(检索)、U: Update改、D: Delete删

(2)原先使用的insert语句是写死到配置文件中的,这个在实际开发中是不存在的。一定是前端的form表单提交过来数据,然后将值传给sql语句

<?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="first">
    <insert id="insertCar">
      insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
      values(null,'1003','丰田',30.0,'2000-10-11','燃油车');
    </insert>
</mapper>

(3)在JDBC当中占位符采用的是?在mybatis当中是#{}; #{} 和 JDBC当中的?是等效的。并且这个#{}里面传的值,是Map集合的key,如果key不存在,获取的是null!

(4)测试类

package com.bjpowernode.mybatis.test;

import com.powernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.test
 * @Project:mybatis
 * @name:CarMapperTest
 * @Date:2022/12/28 21:53
 */
public class CarMapperTest {
    @Test
    public void testInsertCarByUtil(){
        SqlSession sqlSession = SqlSessionUtils.openSession();

        // Map集合的数据
        Map<String, Object> map = new HashMap<>();
        map.put("carNum","1111");
        map.put("brand","比亚迪汉");
        map.put("guidePrice",10.0);
        map.put("produceTime","2022-11-11");
        map.put("carType","电车");
        // insert方法:一个参数是id,另一个参数是一个map集合
        int count = sqlSession.insert("insertCar",map);
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }

}

(5)sql语句

<?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="first">
    <insert id="insertCar">
      insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
      values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
    </insert>
</mapper>

2. Mybatis完成insert使用PoJo传参

(1)除了使用Map集合给SQL语句的占位符传值,使用一个PoJo类(普通的java类)也可以

Pojo类 

package com.powernode.mybatis.pojo;

/**
 * @Author:朗朗乾坤
 * @Package:com.powernode.mybatis.pojo
 * @Project:mybatis
 * @name:Car
 * @Date:2022/12/29 19:09
 * 封装汽车相关信息的pojo类,普通的java类
 */
public class Car {
    // 数据库表中的字段应该和pojo类的属性一一对应
    private Long id;
    private String carNum;
    private String brand;
    private Double guidePrice;
    private String produceTime;
    private String carType;
    // 构造方法
    public Car() {
    }
    public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
        this.id = id;
        this.carNum = carNum;
        this.brand = brand;
        this.guidePrice = guidePrice;
        this.produceTime = produceTime;
        this.carType = carType;
    }
    // setter  and getter
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    public String getCarNum() {
        return carNum;
    }
    public void setCarNum(String carNum) {
        this.carNum = carNum;
    }

    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Double getGuidePrice() {
        return guidePrice;
    }
    public void setGuidePrice(Double guidePrice) {
        this.guidePrice = guidePrice;
    }

    public String getProduceTime() {
        return produceTime;
    }
    public void setProduceTime(String produceTime) {
        this.produceTime = produceTime;
    }

    public String getCarType() {
        return carType;
    }
    public void setCarType(String carType) {
        this.carType = carType;
    }

    // toString方法
    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", carNum='" + carNum + '\'' +
                ", brand='" + brand + '\'' +
                ", guidePrice=" + guidePrice +
                ", produceTime='" + produceTime + '\'' +
                ", carType='" + carType + '\'' +
                '}';
    }
}

(2)编写测试类,直接传一个我们封装好的PoJo类进去

package com.bjpowernode.mybatis.test;

import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.test
 * @Project:mybatis
 * @name:CarMapperTest
 * @Date:2022/12/28 21:53
 */
public class CarMapperTest {

    public void testInsertCarByPojo(){
        SqlSession sqlSession = SqlSessionUtils.openSession();
        // 使用Pojo类封装
        Car car = new Car(null,"333","比亚迪森",30.0,"2020-11-11","新能源");
        // 执行sql
        int count = sqlSession.insert("insertCar", car);
        System.out.println(count);

        sqlSession.commit();
        sqlSession.close();
    }

}

(3)Map集合的方式给Sql语句传值传的是Map集合的key,那么使用PoJo类的方式怎么传值呢?传的值是getXxx()方法的方法名去掉get,然后将剩下的单词首字母小写xxx,然后放进去;例如:getUsername() --> #{username}

<?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="first">
    <insert id="insertCar">
      insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
      <!--对应get方法所得到的参数-->
      values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
    </insert>
</mapper>

3. MyBatis完成delete删除操作

(1)编写删除的Sql语句

注意:如果占位符只有一个,那么#{}的大括号里可以随意,但是最好见名知意。

<?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="first">
    <!--通过id删除-->
    <delete id="deleteById">
        <!--变量名随便写-->
        delete from t_car where id = #{id};
    </delete>
</mapper>

(2)编写测试方法,进行测试

package com.bjpowernode.mybatis.test;

import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.test
 * @Project:mybatis
 * @name:CarMapperTest
 * @Date:2022/12/28 21:53
 */
public class CarMapperTest {
    @Test
    public void testDeleteById(){
        SqlSession sqlSession = SqlSessionUtils.openSession();
        // 执行sql,一个参数是id,另一个参数是要删除的id
        int count = sqlSession.delete("deleteById", 10);
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }

}

4. MyBatis完成update更新操作

(1)通过id修改某条记录

注:使用PoJo进行数据的封装,和插入数据很相似,插入数据id我们传null,因为它会自动生成;对于更新操作,我们需要传入id,然后根据id进行数据的整体覆盖

(2)编写更新的Sql语句

<?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">
    <!--通过id更新-->
    <update id="updateById">
        update t_car set 
          car_num = #{carNum},
          brand = #{brand},
          guide_price = #{guidePrice},
          produce_time = #{produceTime},
          car_type = #{carType}
        where 
          id = #{id};
    </update>
</mapper>

(3)编写测试方法,进行测试

package com.bjpowernode.mybatis.test;

import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.test
 * @Project:mybatis
 * @name:CarMapperTest
 * @Date:2022/12/28 21:53
 */
public class CarMapperTest {
    // 更新、修改
    @Test
    public void updateById(){
        SqlSession sqlSession = SqlSessionUtils.openSession();
        // 执行sql,根据传的id进行数据的覆盖修改
        Car car = new Car(4L,"9999","凯美瑞",30.3,"1999-11-10","燃油车");
        int count = sqlSession.update("updateById", car);
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }
}

5.  MyBatis完成select查一个

(1)注意:select标签中有一个resultType属性,这个属性用来告诉mybatis,查询结果集封装成什么类型的java对象。
resultType通常写的是:全限定类名,带上包名。

<?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="first">
    <!--通过id查询,一个结果-->
    <select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
        select * from t_car where id = #{id};
    </select>
</mapper>

(2)测试代码的编写,得到的结果实际上会自动进行封装;前面resultType属性已经指定了类型是Car,所以返回的类型实际上也是一个Car类型

package com.bjpowernode.mybatis.test;

import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.test
 * @Project:mybatis
 * @name:CarMapperTest
 * @Date:2022/12/28 21:53
 */
public class CarMapperTest {
    // 查询一个
    @Test
    public void selectById(){
        SqlSession sqlSession = SqlSessionUtils.openSession();
        // 执行sql,这里会自动进行数据的封装
        // 前面已经指定了类型是Car,返回的类型实际上也是一个Car类型
        Object car = sqlSession.selectOne("selectById", 1);
        System.out.println(car instanceof Car); // true,返回的就是Car类型
        System.out.println(car);
        // DQL语句,不需要提交
        sqlSession.close();
    }

    
}

(3)注意:经过测试发现一个奇怪的现象,只有id和brand字段有值,其它字段都为null;因为数据中的其它字段car_num、guide_price、produce_time、car_type与封装的Car类carNum、guidePrice、produceTime、carType字段对应不上,所以没有赋值上!

(4)怎么解决?使用as关键字起一个对应的别名即可,重新编写sql语句;全都正常赋值!

注意:后期我们还可以在mybatis-config.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="first">
    <!--通过id查询,一个结果-->
    <select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
        select
            id,
            car_num as carNum,
            brand,
            guide_price as guidePrice,
            produce_time as produceTime,
            car_type as carType
        from
            t_car
        where
            id = #{id}
    </select>
</mapper>

6. Mybatis完成select查所有

(1)编写sql语句,查询所有就不需要传id了

注意:resultType还是指定要封装的结果集的类型,不是指定List类型,是指定List集合中元素的类型;mybatis通过selectList这个方法就可以得知你需要一个List集合;它会自动给你返回一个List集合!

<?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="first">
    <!--查询所有-->
    <select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">
        select
            id,
            car_num as carNum,
            brand,
            guide_price as guidePrice,
            produce_time as produceTime,
            car_type as carType
        from
            t_car
    </select>
</mapper>

(2)查所有返回的就不是一个单纯的对象了,调用selectList方法返回的是一个List集合;所以遍历打印这个集合即可

package com.bjpowernode.mybatis.test;

import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.test
 * @Project:mybatis
 * @name:CarMapperTest
 * @Date:2022/12/28 21:53
 */
public class CarMapperTest {

    // 查询所有
    @Test
    public void selectAll(){
        SqlSession sqlSession = SqlSessionUtils.openSession();
        // 执行sql,返回的是一个List集合
        List<Object> list = sqlSession.selectList("selectAll");
        // 遍历输出
        for (Object car:list) {
            System.out.println(car);
        }
    }
}

7. SQL Mapper映射文件的namespace

(1)在XxxMapper.xml文件当中有一个namespace属性,这个属性是用来指定命名空间的。用来防止id重复!
(2)怎么用?例如:有两个CarMapper.xml和UserMapper.xml文件中含有相同类型的insert语句,并且语句含有相同的id,并且这两个文件都被引用到核心文件mybatis-config.xml文件中;我们编写测试程序通过id获取返回结果就会出错!

(3)所以我们可以加上namespace属性,防止id重复冲突;所以以后正确的语法应该是:namespace.id,例如:

// first是namespace属性的值,selectAll是查询语句的id
List<Object> cars = sqlSession.selectList("first.selectAll");

猜你喜欢

转载自blog.csdn.net/m0_61933976/article/details/128482203