栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis基础(六)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis基础(六)

文章目录
  • Mybatis基础(六)
    • 数据库多环境切换
    • 注解方式的增删改查
      • 增加数据
      • 删除数据
      • 修改数据
      • 查询数据
    • 增删改的返回值问题
    • 事务的提交方式
      • 手动提交
      • 自动提交(慎用)
    • 不同数据库的自增问题
      • MySQL(支持自增)
      • Oracle(不支持自增)
        • oracle不支持自增 :通过序列模拟实现
    • 多个输入参数的问题
      • 输入参数为多个且有对象和基本类型(常用于修改)

Mybatis基础(六) 数据库多环境切换
  1. 切换 environment (指定实际使用的数据库)

    • db.properties

      #oracle
      oracle.driver=oracle.jdbc.OracleDriver
      oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
      oracle.username=scott
      oracle.password=tiger
      
      #mysql
      mysql.driver=com.mysql.jdbc.Driver
      mysql.url=jdbc:mysql://localhost:3306/mydb?allowMultiQueries=true
      mysql.username=root
      mysql.password=root
      
    • conf.xml

      
          
          
          
          
              
              
                  
                  
                  
                      
                      
                      
                      
                  
              
      
              
              
                  
                  
                  
                      
                      
                      
                      
                  
              
          
      
      
      • 注意事项

         

    如果mapper.xml的 sql标签 仅有 一个 不带databaseId的标签,则改标签 会自动适应当前数据库。
    如果 既有不带databaseId的标签,又有带databaseId的标签,则程序会优先使用带databaseId的标签。
    ~~~

  2. 配置 Provider别名(数据库环境的别名)

    • 在conf.xml中配置

      
          
          
              
              
          
      
      
  3. 在studentMapper.xml写不同数据库的SQL语句

    
    
        select * from student where stuNo=#{stuNo}
    
    
    
    
        select * from student where stuNo=#{stuNo}
    
    
  4. 在xxxMappe.xml增删改标签中配置databaseId = “Provider别名”,来进行使用(如上所示)


注解方式的增删改查
  • 适用场景

    注解方式只适用于简单的增删改查,复杂的增删改查,还是得使用配置文件的方式。
    
  • 本质

    注解的核心是反射机制,底层通过动态代理的方式,根据注解来找到对应的东西(类或SQL等),
    把一些配置信息、属性注入到对应的对象中。
    
  • 注解开发的优点和缺点

    • 优点

      方便、快捷,提高开发效率。
      
    • 缺点

      可读性低,不利于后期维护;
      不适合做复杂的增删改查(复杂的表和类的映射关系等)。
      
增加数据
  1. 将sql语句写在接口的方法上@Insert("") ;

    public interface StudentMapper {
        @Insert("insert into student(stuNo,sname,sage) values(1,'zs',18) where stuNo = #{stuNo}")
        Student queryStudentByNo (int stuNo);
    }
    
  2. 将接口的全类名写入conf.xml核心配置文件的标签中,让MyBatis知道sql语句此时是存储在接口中

    
        
        
            
        
    
    
删除数据
  1. 将sql语句写在接口的方法上@Delete("") ;
  2. 将接口的全类名写入conf.xml核心配置文件的标签中,让MyBatis知道sql语句此时是存储在接口中
修改数据
  1. 将sql语句写在接口的方法上@Update("") ;
  2. 将接口的全类名写入conf.xml核心配置文件的标签中,让MyBatis知道sql语句此时是存储在接口中
查询数据
  1. 将sql语句写在接口的方法上@Select("") ;

    public interface StudentMapper {
        @Select("select * from student where stuNo = #{stuNo}")
        Student queryStudentByNo (int stuNo);
    }
    
  2. 将接口的全类名写入conf.xml核心配置文件的标签中,让MyBatis知道sql语句此时是存储在接口中

    
        
        
            
            
            
        
    
    

增删改的返回值问题
  1. 返回值可以是 void、Integer、Long、Boolean。

  2. 如何操作:只需在接口中,修改方法的返回值即可。

    Integer addStudent (Student students);
    

事务的提交方式 手动提交
 sessionFactory.openSession();
 session.commit(); //手动提交
自动提交(慎用)
//自动提交:每个DML(增删改)语句,事务自动提交
sessionFactory.openSession(true);

不同数据库的自增问题 MySQL(支持自增)
  1. 只需要配置两个属性即可:useGeneratedKeys=“true” keyProperty=“stuNo”

    
        insert into student(stuName,stuAge,graName)
        values(#{stuName},#{stuAge},#{graName})
    
    
  2. 小结

    keyProperty对应的是Java对象的属性名,
    useGeneratedKeys(主键生成策略)的作用是允许 JDBC 支持自动生成主键,需要驱动支持。
    useGeneratedKeys如果设置为 true 则这个设置强制使用自动生成主键,
    尽管一些驱动不能支持但仍可正常工作(比如 Derby)。
    
Oracle(不支持自增) oracle不支持自增 :通过序列模拟实现
  1. 方式一:before(推荐)

    • 在数据库中创建一个用于模拟自增的序列

      create sequence myseq
      		increment by 1 -- 步长为 1
      		start with 1; -- 从 1 开始自增
      
    • 通过 的子标签 实现

      
      
          
          
              
              select myseq.nextval from dual
          
      
          insert into student(stuno,stuName,stuAge,graName)
          values(#{stuNo} , #{stuName},#{stuAge},#{graName})
      
      
    • 在执行SQL语句之前,先在 中查询下一个序列(自增后的值),

    • 然后再将此值传入keyProperty="stuNo"属性(对象的属性,也就是将数据回写到对象的属性中),最后在真正执行时 使用该属性值。

  2. 方式二:after

    • 在数据库中创建一个用于模拟自增的序列(若已创建,则无需再建)

      create sequence myseq
      		increment by 1 -- 步长为 1
      		start with 1; -- 从 1 开始自增
      
    • 通过 的字标签 和序列自带的两个属性:nextval:序列中下一个值
      currval: 当前值实现

      
          
              select myseq.currval from dual
          
      
          insert into student(stuno,stuName,stuAge,graName)
          values(myseq.nextval , #{stuName},#{stuAge},#{graName})
      
      
    • 先执行插入的SQL语句,自增的值从nextval(下一个序列、自增后的值)中去取,

    • 然后在 中查询数据库中当前的序列值,再将此值传入keyProperty="stuNo"属性,将数据回写到对象的属性中。


多个输入参数的问题

输入参数为多个时,不用写 parameterType

  1. 处理方式一:将多个参数封装为一个对象(前面基础部分知识点)

  2. 处理方式二:在xxxMapper.xml的SQL中,用 [ arg0, arg1, arg2, arg3 或 param1, param2, param3, param4 ]

    
    
        insert into student(stuno,stuName,stuAge,graName)
        values(#{arg0},#{arg1},#{arg2},#{arg3})
    
    
  3. 处理方式三:在变量前面使用@Param(“SQL中参数的名字”) 指定sql中参数的名字(推荐,也叫命名参数)

    • 接口方法
    //接口
    //可以在接口中通过@Param("sNo") 指定sql中参数的名字
    public abstract Integer addStudent(@Param("sNo") Integer stuNo, @Param("sName")String stuName, @Param("sAge")Integer stuAge, @Param("gName")String graName);
    
    • xxxMapper.xml
    
        insert into student(stuno,...)
        values(#{sNo}, ...)
    
    
输入参数为多个且有对象和基本类型(常用于修改)
  • 接口方法

    //输入参数为多个,既有简单类型,又有复杂类型(对象)
    Integer addStudent(@Param("sNo")Integer stuNo, @Param("stu")Student student);
    
  • xxxMapper.xml

    
        insert into student(stuno,stuName,stuAge,graName)
        values(#{sNo}, #{stu.stuName}, #{stu.stuAge}, #{stu.graName})
    
    
    • 小结

      用 @Param("SQL中参数的名字") 来指定SQL中参数的名字,
      即:SQL中参数的名字要和 @Param("xxx") 中的名字保持一致。
      一般建议所有参数都加上这个。
      
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/881465.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号