回顾: 上节课我们完成了MyBatis的环境搭建
核心配置文件
映射文件
API的执行过程
如何执行定制的SQL语句

我们测试的是"死"的数据,那么下面我们使用容器传递动态的数据

添加操作传递数据专题

1.通过Map传递数据

  • 映射文件代码
 <!--  <insert id="add02" 
    parameterType="java.util.Map"></insert> -->
  <insert id="add02" 
    parameterType="map">
    INSERT INTO skill  (skill_name,num) 
        VALUES 
     (#{shxt},#{number})
    </insert>

parameterType : 传递参数数据的类型 java.util.Map或者MyBatis提供额内置类型映射map
#{map中的Key}获取对应的值,并且进行了预处理

  • Java测试代码
public class 动态数据之通过Map传递数据 {
    public static void main( String[] args ) {
        SqlSession sqlSession = null;
        try {
            //1.读取核心配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //2.创建SqlSession工厂(SqlSessionFactory) 
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //3.获取SqlSession 
            //****** SqlSession完成所有的持久化操作CRUD
            sqlSession = sqlSessionFactory.openSession();
            //4.关键步骤: 定位执行SQL语句
            //****如何定位  (namespace+"."+id)

            Map<String, Object> map = new HashMap<String, Object>();
            map.put("shxt", "CSS");
            map.put("number", 66);

            int row = sqlSession.insert("shxt.cy42.mss.add02",map);
            //5.针对于CUD操作需要手动提交事务
            sqlSession.commit();
            System.out.println("影响的行数:"+row);
        } catch (IOException ex) {
            ex.printStackTrace();
        }finally {
            //6.关闭资源
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }

}
  • 图解说明
    map传递数据

2.通过自定义Java类传递数据

  • 自定义Java类
public class Skill {

    private Integer skillId;
    private String skillName;
    private Integer skillNumber;
       //省略getter和setter方法
}
  • 映射文件代码
    <insert id="add03" 
    parameterType="com.shxt.model.Skill">
    INSERT INTO skill  (skill_name,num) 
        VALUES 
     (#{skillName},#{skillNumber})
    </insert>

parameterType:如果不是Java内容类型,可以设置自定义类型的全路径,后面我们也可以
设置自定义别名
#{Java类中属性}获取对应的值

  • Java代码测试
public class 动态数据之通过Skill持久化类传递数据 {
    public static void main( String[] args ) {
        SqlSession sqlSession = null;
        try {
            //1.读取核心配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //2.创建SqlSession工厂(SqlSessionFactory) 
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //3.获取SqlSession 
            //****** SqlSession完成所有的持久化操作CRUD
            sqlSession = sqlSessionFactory.openSession();
            //4.关键步骤: 定位执行SQL语句
            //****如何定位  (namespace+"."+id)


            Skill s = new Skill();
            s.setSkillName("jquery");
            s.setSkillNumber(99);

            int row = sqlSession.insert("shxt.cy42.mss.add03",s);//传递数据哟
            //5.针对于CUD操作需要手动提交事务
            sqlSession.commit();
            System.out.println("影响的行数:"+row);
        } catch (IOException ex) {
            ex.printStackTrace();
        }finally {
            //6.关闭资源
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }

}
  • 图解说明
    使用自定义Java类传递数据

3.关联对象

  • 自定义Java类
    Teacher.java
public class Teacher {
    private Integer id;
    private String name;
       //省略getter和setter方法
}

Skill.java

public class Skill {

    private Integer skillId;
    private String skillName;
    private Integer skillNumber;

    //关联对象
    private Teacher teacher;
}
  • 映射文件代码
    <insert id="add04" 
    parameterType="com.shxt.model.Skill">
    INSERT INTO skill  (skill_name,num,fk_teacher_id) 
        VALUES 
     (#{skillName},#{skillNumber},#{teacher.id})
    </insert>

#{teacher.id}关联对象使用"."运算符

  • Java测试代码
public class 动态数据之保存技能同时需要保存老师ID {
    public static void main( String[] args ) {
        SqlSession sqlSession = null;
        try {
            //1.读取核心配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //2.创建SqlSession工厂(SqlSessionFactory) 相当于 Connection
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //3.获取SqlSession 相当于 执行SQL语句对象PreparedStament预处理对象
            //****** SqlSession完成所有的持久化操作CRUD
            sqlSession = sqlSessionFactory.openSession();
            //4.关键步骤: 定位执行SQL语句
            //****如何定位  (namespace+"."+id)


            Skill s = new Skill();
            s.setSkillName("MyBatis");
            s.setSkillNumber(100);
            //假设建立一个老师
            Teacher t = new Teacher();
            t.setId(-999);
            t.setName("胖先森");
            //建立联系
            s.setTeacher(t);


            int row = sqlSession.insert("shxt.cy42.mss.add04",s);
            //5.针对于CUD操作需要手动提交事务
            sqlSession.commit();
            System.out.println("影响的行数:"+row);
        } catch (IOException ex) {
            ex.printStackTrace();
        }finally {
            //6.关闭资源
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }

}
  • 图解说明
    关联对象

4.返回自增长主键设置

  • 映射文件
    <!-- 添加返回主键设置 -->
    <insert id="add05" 
    parameterType="com.shxt.model.Skill" 
    useGeneratedKeys="true" 
    keyProperty="skillId">
    
    INSERT INTO skill  (skill_name,num) 
        VALUES 
     (#{skillName},#{skillNumber})
    </insert>

keyProperty 将自增长的主键值赋值给skillId属性


pangsir8983
162 声望21 粉丝