【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



    4.0.0

    mybatis-002-crud
    com.bjpowernode
    1.0-SNAPSHOT
    
    
        1.8
        1.8
    

    
    jar
    
    
        
        
            org.mybatis
            mybatis
            3.5.10
        
        
        
            mysql
            mysql-connector-java
            5.1.23
        
        
        
            junit
            junit
            4.12
            test
        
        
        
            ch.qos.logback
            logback-classic
            1.2.11
            test
        
    

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

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

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






    
      insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
      values(null,'1003','丰田',30.0,'2000-10-11','燃油车');
    

(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 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语句






    
      insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
      values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
    

2. Mybatis完成insert使用PoJo传参

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

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}





    
      insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
      
      values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
    

3. MyBatis完成delete删除操作

(1)编写删除的Sql语句

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






    
    
        
        delete from t_car where id = #{id};
    

(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语句



    
    
        update t_car set 
          car_num = #{carNum},
          brand = #{brand},
          guide_price = #{guidePrice},
          produce_time = #{produceTime},
          car_type = #{carType}
        where 
          id = #{id};
    

(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对象。你需要告诉mybatis。
resultType通常写的是:全限定类名,带上包名。





    
    

(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);
        // DQL语句,不需要提交
        sqlSession.close();
    }

    
}

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

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





    
    

6. Mybatis完成select查所有

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

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





    
    

(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 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,并且这两个文件都被引用到核心文件mbatis-config.xml文件中;我们编写测试程序通过id获取返回结果就会出错!

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

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

                            
                        
                    
                    
                    

你可能感兴趣的:(第四步:SSM框架,mybatis,java,mysql)