zoukankan      html  css  js  c++  java
  • java学习day35-三大框架-MyBatis(三)-CURD

    mybatis中增删改查

    增删改一般使用对应的标签来实现, 比如新增用<insert>标签, 删除用<delete>标签, 更新使用<update>标签, 查询使用<select>标签,当然前三个标签也可以混着用,但是不建议.

    标签使用

    • id属性在增删改查的标签中一定会出现, 意义为这个sql的唯一标志, 使用mapper接口开发的使用这个id一般为mapper接口中的方法名, 不用mapper接口这个id名字可以任意, 最好见名知意.
    • resultType 属性出现在<select>标签中, 用来指定查询结果的返回类型, 一般为map或者bean(报名+类名)
    • parameterType属性在增删改查中都有可能出现, 用来指定传入参数的类型, 如果为基本类型或包装类型, 可以省略

    示例代码

    例如新增, mapper.xml可以这样写

    <insert id="insert06" parameterType="com.tedu.pojo.Emp">
        insert into emp value(null, #{name}, #{job}, #{salary});
    </insert>
    

    根据id删除指定员工

    <delete id="deleteById">
        delete from emp where id=#{id};
    </delete>
    

    根据名字修改指定员工信息

    <update id="update07">
        update emp set job = #{job}, salary = #{salary}
        where name = #{name};
    </update>
    

    查询指定id员工

    <select id="findById" resultType="com.tedu.pojo.Emp">
        select * from emp where id = #{id};
    </select>
    

    java代码中进行调用

    // 静态代码块用来获取SqlSession
    static SqlSession session = null;
    static {
        // 为session进行初始化
        try {
            // 1. 读取mybatis的核心配置文件[mybatis-config.xml]
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            // 2. 通过获取SqlSessionFactory工厂对象
            SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
            // 3. 后去SqlSession对象(打开与数据库的连接) true: 表示自动提交, 默认是false即手动提交
            session = fac.openSession(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    // 新增
    @Test
    public void testInsert02() {
        Map<String, Object> map = new HashMap();
        map.put("name", "张飞");
        map.put("job", "Java开发工程师");
        map.put("salary", 15000D);
        int rows = session.insert("EmpMapper.insert06", map);
        System.out.println("影响行数: " + rows);
    }
    
    // 删除
    @Test
    public void testdeleteById() {
        int id = 13;
        int rows = session.delete("EmpMapper.deleteById", id);
        System.out.println("影响行数: " + rows);
    }
    
    // 修改
    @Test
    public void testUpdate02() {
        // 将SQL语句中的参数封装到Emp对象中
        Emp emp = new Emp(null, "张飞", "架构师", 25000D);
        int rows = session.update("EmpMapper.update07", emp);
        System.out.println("影响行数: " + rows);
    }
    
    // 查询
    @Test
    public void testFindById() {
        Integer id = 1;
        // 根据namespace+id找到并执行SQL语句, 返回执行结果
        Emp emp = session.selectOne("EmpMapper.findById", id);
        System.out.println(emp);
    }
    

    mybatis中的占位符

    #{}:表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

    ${}:表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

    #{}占位符

    练习:查询emp表中指定id的员工信息

    在mapper文件中编写SQL语句:

    <!-- 练习: 查询emp表中指定id的员工信息 -->
    <select id="findById" resultType="com.tedu.pojo.Emp">
    	select * from emp where id=#{id}
    </select>
    

    Java代码实现:

    /** 练习: 查询emp表中指定id的员工信息 */
    @Test
    public void testFindById() {
      //执行sql语句, 返回执行结果
      Emp emp = session.selectOne( "EmpMapper.findById", 1 );
      System.out.println( emp );
    }
    

    练习:新增员工信息: 张飞 Java开发工程师 15000

    在mapper文件中编写SQL语句:

    <!-- 练习: 新增员工信息: 张飞 Java开发工程师 15000
      如果通过map集合传输参数, 需要保证占位符中的变量名
      和map集合中的key保持一致
      如果通过pojo对象传输参数, 需要保证占位符中的变量名
      和对象中的属性名保持一致, 或者在pojo中有对应的
      getXxx方法
    -->
    <update id="insert2">
    	insert into emp values (null, #{name}, #{job}, #{salary})
    </update>
    

    Java代码实现:

    /** 练习: 新增员工信息: 张飞 Java开发工程师 15000 */
    @Test
    public void testInsert2() {
      //将要传输的参数封装到map集合中
      //Map map = new HashMap();
      //map.put("name", "张飞");
      //map.put("job", "Java开发工程师");
      //map.put("salary", 15000);
      //也可以将要传输的参数封装到Emp对象中
      Emp emp = new Emp();
      emp.setName("关羽123");
      emp.setJob("保安");
      emp.setSalary(8000.0);
      //执行sql语句
      intsession rows = session.update("EmpMapper.insert2", emp);
      //提交事务
      session.commit();
      System.out.println( "影响的行数: "+rows );
    }
    

    练习:修改员工信息: 张飞 架构师 25000

    在mapper文件中编写SQL语句:

    <!-- 练习: 修改员工信息: 张飞 架构师 25000 -->
    <update id="update2">
      update emp set job=#{job}, salary=#{salary}
      where name=#{name}
    </update>
    

    Java代码实现:

    /** 练习: 修改员工信息: 张飞 架构师 25000 */
    @Test
    public void testUpdate2() {
      //将参数封装到Emp对象中
      Emp emp = new Emp();
      emp.setName("张飞");
      emp.setJob("架构师");
      emp.setSalary(25000.0);
      //执行sql语句
      intsession rows = session.update("EmpMapper.update2", emp);
      //提交事务
      session.commit();
      System.out.println("影响的行数: "+rows);
    }
    

    练习:删除emp表中指定id的员工信息

    mapper文件配置:

    <!-- 练习:删除emp表中指定id的员工信息 -->
    <insert id="delete2" parameterType="String">
    	delete from emp where id=#{id}
    </insert>
    

    java代码示例:

    /*  练习:删除emp表中指定id的员工信息 */
    public void testDelete2() throws IOException{
      ......
      //执行SQL语句
      int rows = session.delete("EmpMapper.delete2", 1);
      //提交事务
      session.commit();
      System.out.println("影响行数:"+rows);
    }
    

    在上面的增删改查练习中,当SQL语句中包含的参数值是传递过来的,在SQL语句中我们会通过#{}占位符进行占位,在SQL语句真正执行时,再将传递过来的值替换SQL语句中的占位符。

    其实,#{}就是JDBC中的问号(?)占位符,因此为了安全考虑,在执行时会对传递过来的字符串和日期类型高的值进行转译处理。

    例如:查询指定name的员工信息,SQL语句为:

    select * from emp where name=#{name}
    

    其实就等价于JDBC中: select * from emp where name=?

    如果传过来的参数值为:王海涛,那么最终执行的SQL语句为:

    -- 在参数替换占位符的同时进行了转义处理(在值的两边加上了单引号)
    select * from emp where name='王海涛' 
    

    ${}占位符

    那么如果我们在传递的时候不是一个参数值,而是一个SQL片段呢?

    例如:在查询时,我们想动态的传递查询的列:

    select #{columns} from emp
    

    此时传递过来的应该是一个SQL片段,不同于上面的参数值,如果此时还用#{},也会像上面一样被转译处理:select 'id,name,job' from emp,这不是我们希望看到的!

    如果不想让传过来的SQL片段被转译处理,而是直接拼接在SQL语句中,那么这里可以使用${},例如:

    select ${columns} from emp
    

    拼接之后:select id,name,job from emp

    练习:动态指定要查询的列

    在mapper文件中编写SQL语句:

    <!-- 练习: 动态指定要显示的列 -->
    <select id="findAll2" resultType="com.tedu.pojo.Emp">
    	select ${cols} from emp
    </select>
    

    java代码示例:

    /** 练习: 动态指定要查询的列 */
    @Test
    public void testFindAll2() {
      Map map = new HashMap();
      //map.put("cols", "id, name");
      //map.put("cols", "id, name, salary");
      map.put("cols", "id,name,job,salary");
      //执行sql语句, 返回结果
      List<Emp> list = session.selectList("EmpMapper.findAll2", map);
      //输出结果
      for ( Emp e : list ) {
      	System.out.println( e );
      }
    }
    

    示例: 根据name模糊查询emp表

    在mapper文件中编写SQL语句:

    <!-- 练习: 根据name模糊查询emp表 -->
    <select id="findAll3" resultType="com.tedu.pojo.Emp">
      select * from emp
      where name like '%${name}%'
    </select>
    
    <!-- 练习: 根据name模糊查询emp表 -->
    <select id="findAll4" resultType="com.tedu.pojo.Emp">
      select * from emp
      where name like #{name}
    </select>
    

    Java代码实现:

    /**
     * 练习: 根据name模糊查询emp表
     * '%王%' '%刘%'
     */
    @Test
    public void testFindAll3() {
      //将参数封装到map集合中
      Map map = new HashMap();
      map.put("name", "涛");
      //执行sql, 返回结果
      List<Emp> list = session.selectList("EmpMapper.findAll3", map);
      //输出结果
      for (Emp emp : list) {
      	System.out.println( emp );
      }
    }
    
    /**
     * 练习: 根据name模糊查询emp表
     * '%王%' '%刘%'
     */
    @Test
    public void testFindAll4() {
      //将参数封装到map集合中
      Map map = new HashMap();
      map.put("name", "%刘%");
      //执行sql, 返回结果
      List<Emp> list = session.selectList("EmpMapper.findAll4", map);
      //输出结果
      for (Emp emp : list) {
      	System.out.println( emp );
      }
    }
    

    需要注意的是,在传递 ${} 对应的值时,即使只有一个参数,也需要将值存入map集合中!!

    总结:在大多数情况下还是使用#{}占位符,而${}多用于为SQL片段进行占位!

  • 相关阅读:
    sqlserver,获取调用存储过程返回数据的方法。
    手动为弹窗添加一个阴影背景。
    bootstrap资料链接
    进入Linux救援(rescue)模式的四大法门
    virtual box 5.2.12 扩展包安装
    pypi配置国内开源镜像
    vs2015利用python加载dll调试配置
    ubuntu18安装ubuntu kylin软件中心
    firefox快捷键窗口和标签类
    设置双网卡路由
  • 原文地址:https://www.cnblogs.com/liqbk/p/13172536.html
Copyright © 2011-2022 走看看