Mybatis

1.Mybatis简介

持久层框架,使用xml将sql与程序解耦,便于维护,是jdbc的延伸。

2.开发流程

  • 引入Mybatis依赖

  • 创建核心配置文件
    在resources下面创建mybatis-config.xml文件,配置数据库环境信息

      
      
          
      
              
      
                  
      
                  
                      
                      
                      
                      
                  
              
              
                  
                  
                      
                      
                      
                      
                  
              
          
      
      
      
          
            
    
      ------goods.xml内容------
      
      
      
      
          
           
          
          
          
          
          
          
      
      ---------对应实体类---------
      //查询所有
      List list = session.selectList("goods.selectAll");
      //单参数传值
      Goods goods = session.selectOne("goods.selectById",1602);
      //多个参数传值
      //可以不加namespace,确保id是唯一即可
      List list = session.selectList("selectByPriceRange",param);
      //多表关联
      List list = session.selectList("goods.selectGoodsMap");
    
  • 创建实体(Entity)类

  • 创建Mapper映射文件

  • 初始化SessionFactory

SessionFactory是Mybatis的核心对象,用于初始化Mybatis,创建SqlSession对象,是全局唯一的

  • 利用SqlSession对象操作数据

SqlSession是Mybatis操作数据库的核心对象,使用JDBC方式与数据库交互,提供了CRUD对应的方法

2.1.MyBatis数据查询步骤

  • 创建实体类(Entity)
  • 创建Mapper XML
  • 编写 select g.*, c.*,'1' as test from t_goods g,t_category c where g.category_id = c.category_id limit 10 ---------------------------------- public class GoodsDTO { private Goods goods; private Category category; ----------------------------------- List list = session.selectList("goods.selectGoodsDTO"); for (int i = 0; i < list.size(); i++) { GoodsDTO goodsDTO = list.get(i); System.out.print(goodsDTO.getGoods().getTitle() + "------"); System.out.println(goodsDTO.getCategory().getCategoryName()); }

    4.数据插入

    4.1.数据库事务

    是保证数据库操作完整性的基础

    • commit
    • rollback

    4.2.数据库写操作

    4.2.1.插入-insert

    使用标签,如果想要获得插入的id,可以使用

    • 标签查询插入后的主键id

        --goods.xml
      
        
        
            INSERT INTO t_goods(title, sub_title, original_cost, current_price, discount, is_free_delivery, category_id)
            VALUES (#{title}, #{subTitle}, #{originalCost}, #{currentPrice}, #{discount}, #{isFreeDelivery}, #{categoryId})
            --         插入数据库后取最新插入的id复制给goodsId
            
                select last_insert_id()
            
        
      
        --调用
      
        @Test
        public void testInsert() {
            SqlSession session = null;
            try {
                session = MyBatisUtils.openSession();
                Goods goods = new Goods();
                goods.setTitle("测试商品");
                goods.setSubTitle("测试子标题");
                goods.setOriginalCost(200f);
                goods.setCurrentPrice(100f);
                goods.setDiscount(0.5f);
                goods.setIsFreeDelivery(1);
                goods.setCategoryId(43);
                //insert方法返回值代表本次成功插入的记录数
                int num = session.insert("goods.insert", goods);
                //提交事务
                session.commit();
                System.out.println(goods.getGoodsId());
            }catch (Exception e) {
                if (session != null){
                    session.rollback();//回滚事务
                }
                throw e;
            }
            MyBatisUtils.closeSession(session);
        }
      
    • useGeneratedKeys属性

        --goods.xml
      
        
            INSERT INTO t_goods(title, sub_title, original_cost, current_price, discount, is_free_delivery, category_id)
            VALUES (#{title}, #{subTitle}, #{originalCost}, #{currentPrice}, #{discount}, #{isFreeDelivery}, #{categoryId})
        
      
        --调用
      
        @Test
        public void testInsert() {
            SqlSession session = null;
            try {
                session = MyBatisUtils.openSession();
                Goods goods = new Goods();
                goods.setTitle("测试商品");
                goods.setSubTitle("测试子标题");
                goods.setOriginalCost(200f);
                goods.setCurrentPrice(100f);
                goods.setDiscount(0.5f);
                goods.setIsFreeDelivery(1);
                goods.setCategoryId(43);
                //insert方法返回值代表本次成功插入的记录数
                int num = session.insert("goods.insert", goods);
                //提交事务
                session.commit();
                System.out.println(goods.getGoodsId());
            }catch (Exception e) {
                if (session != null){
                    session.rollback();//回滚事务
                }
                throw e;
            }
            MyBatisUtils.closeSession(session);
        }
      

    对比:

    • selectKey标签是通用方案,适用于所有数据库,但是编写麻烦
    • useGeneratedKeys属性只支持“自增主键”数据库,使用简单(Oracle不支持自增主键)

    4.2.2.更新-update

    • goods.xml



      UPDATE t_goods
      SET
      title = #{title},
      sub_title = #{subTitle},
      original_cost = #{originalCost},
      current_price = #{currentPrice},
      discount = #{discount},
      is_free_delivery = #{isFreeDelivery},
      category_id = #{categoryId}
      WHERE
      goods_id = #{goodsId}

    • 测试方法

        @Test
        public void testUpdate() {
            SqlSession session = null;
            try {
                session = MyBatisUtils.openSession();
                Goods goods = session.selectOne("goods.selectById", 739);
                goods.setTitle("更新测试商品");
                //insert方法返回值代表本次成功插入的记录数
                int num = session.update("goods.update", goods);
                //提交事务
                session.commit();
                System.out.println(goods.getGoodsId());
            }catch (Exception e) {
                if (session != null){
                    session.rollback();//回滚事务
                }
                throw e;
            }
            MyBatisUtils.closeSession(session);
        }
      

    4.2.3.删除-delete

    • goods.xml

        
        
            DELETE FROM t_goods WHERE goods_id = #{value}
        
      
    • 测试类

        @Test
        public void testDelete() {
            SqlSession session = null;
            try {
                session = MyBatisUtils.openSession();
                //insert方法返回值代表本次成功插入的记录数
                int num = session.delete("goods.delete", 739);
                //提交事务
                session.commit();
            }catch (Exception e) {
                if (session != null){
                    session.rollback();//回滚事务
                }
                throw e;
            }
            MyBatisUtils.closeSession(session);
        }
      

    5.SQL注入

    SQL注入是指攻击者利用SQL漏洞,绕过系统约束,越权获取数据的攻击方式

    SQL代码:

    "select * from a where name = '" + name + "'";
    正常情况:
    name:张三 -》 select * from a where name = '张三';
    SQL注入攻击:
    name:' or 1=1 or 1= '
    select * from a where name = ' '' or 1=1 or name='' ';
    

    则可查询所有数据。

    原因:
    ${}是文本替换,未经过任何处理对SQL文本替换,我们需要使用#{}预编译传值,使用预编译传值可以预防SQL注入

    6.MyBatis工作流程

    应用pom导入mybatis,mysql-connector-java依赖创建mybatis-config.xml,全局设置项,环境配置,mapper声明,通过SqlSessionFactoryBuilder创建全局唯一的SqlSessionFactory,通过SqlSessionFactory创建SqlSession,解析mapper.xml,执行对应的sql语句,数据修改时候需要调用commit方法,最后需要close对应的session。

    1-1.jpg

你可能感兴趣的:(Mybatis)