zoukankan      html  css  js  c++  java
  • mybatis

    1.不能多条语句一起操作,即使加了BEGIN...END也一样。在逻辑中将其循环

    2.批量操作时,mybatis返回的不是影响的行数(注意)

    3.spring的注释要加在实现类上

    4.sping是要实例化bean的,所以用注解将bean放入容器实例化

    5.线程里不能实例化bean,因为spring的实例化是在主线程里的,需要手动获取主线程

    public class DeleteHisJob {
    @Autowired
    private RadarDataHisService radarDataHisService;
    //历史数据同步
    private static DeleteHisJob singleton = new DeleteHisJob();
    private DeleteHisJob(){}
    public static DeleteHisJob getSingleton(){return singleton; }
    private static Logger logger = Logger.getLogger(DeleteHisJob.class);
    public void init(){
    Thread thread = new Thread(new Runnable()
    {
    public void run()
    {
    service();
    }
    });
    thread.start();
    }
    public void service() {}}
    6.
    <result column="DEVICENUM" property="deviceNo" jdbcType="VARCHAR"></result>
    <result column="LANECOUNT" property="LaneNum" jdbcType="DECIMAL"></result>
    jdbcType:Varchar2和Number类型,记得转成上图所示
    7.
    <result column="DATATIME" property="dateTime" jdbcType="DATE" javaType="java.util.Date"></result>
    <delete id="deleteHis" parameterType="java.util.Date">
    DELETE FROM
    T_RADAR_HURYS_HIS
    where DATATIME &lt; #{date,jdbcType=DATE}
    </delete>
    date值得处理方式
    8.时间的插入需要时分秒,使用java.sql.Timestamp,在mybtis的javatype中也要写全(注意不是jdbctype),要不然报错
    9.关联查询,集合
    http://chenyunhong.iteye.com/blog/2152225

     最近一个项目用到mybatis,花了一点时间看了官方文档,后面就搭建起了框架,着手进行开发,mybatis上手很容易,但是有一些小的细节的注意(下文说明),否则错误很难查找,对于用惯了Hibernate的开发人员来说,使用mybatis可能可能需要加强SQL。大概说一下mybatis优缺点,欢迎补充。

    mybatis优点:

        1. 易于上手和掌握。

        2. sql写在xml里,便于统一管理和优化。

        3. 解除sql与程序代码的耦合。

        4. 提供映射标签,支持对象与数据库的orm字段关系映射

        5. 提供对象关系映射标签,支持对象关系组建维护

        6. 提供xml标签,支持编写动态sql。

    mybatis缺点:

        1. sql工作量很大,尤其是字段多、关联表多时,更是如此。

         2. sql依赖于数据库,导致数据库移植性差。

         3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。

         4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)

         5. DAO层过于简单,对象组装的工作量较大。

         6.  不支持级联更新、级联删除。

         7. 编写动态sql时,不方便调试,尤其逻辑复杂时。

         8. 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。

         9. 使用不当,容易导致N+1的sql性能问题。

         10. 使用不当,关联查询时容易产生分页bug。

         11. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。

         12. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)

         13. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)

    查询结果说明:

    mybatis可以通过配置返回Java对象,例如查询一个用户对象,下面为mapper配置,select查询可以指定返回resultType或者resultMap。

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    3. <mapper namespace="com.sclead.dao.mapper.UserMapper">  
    4.   
    5.     <resultMap type="com.sclead.dao.entity.User" id="userMap">  
    6.         <id property="userId" column="user_id" />  
    7.         <result property="depId" column="dep_id" />  
    8.         <result property="userName" column="user_name" />  
    9.         <result property="realName" column="real_name" />  
    10.         <result property="password" column="user_pw" />  
    11.         <result property="createTime" column="user_create_time" />  
    12.         <result property="state" column="user_state" />  
    13.         <result property="note" column="user_note" />  
    14.           
    15.         <!-- 关联查询单位信息 -->  
    16.         <association property="department" resultMap="com.sclead.dao.mapper.DepartmentMapper.depMap"/>  
    17.           
    18.         <!-- 关联查询角色信息 -->  
    19.         <collection property="roles" resultMap="com.sclead.dao.mapper.RoleMapper.roleMap"/>    
    20.     </resultMap>  
    21.       
    22.     <!-- 公用sql -->  
    23.     <sql id="baseSql">  
    24.             select u.*,d.*,r.*   
    25.             from ly_user u   
    26.             left join ly_department d on u.dep_id = d.dep_id  
    27.             left join ly_user_role ur on uur.user_id = u.user_id  
    28.             left join ly_role r on r.role_id = ur.role_id  
    29.     </sql>  
    30.       
    31.     <!-- 查询一个用户 -->  
    32.     <select id="getUserById" parameterType="int" resultMap="userMap">  
    33.         <include refid="baseSql"/> where user_id=#{userId}  
    34.     </select>  
    35.       
    36.     <!-- 查询所有记录 -->  
    37.     <select id="getAllUser" resultMap="userMap">  
    38.         <include refid="baseSql"/>  
    39.     </select>  
    40. </mapper>  

    如果实体类属性和数据库中字段名一样,则可以直接指定resultType,值为定义的实体类,mybatis会默认创建resultMap指定对应关系,resultType=“User”,User需在配置中定义,如下段代码,查询成功后返回User对象。

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8" ?>    
    2. <!DOCTYPE configuration PUBLIC    
    3.     "-//mybatis.org//DTD Config 3.0//EN"    
    4.     "http://mybatis.org/dtd/mybatis-3-config.dtd">    
    5. <configuration>    
    6.     <typeAliases>  
    7.         <typeAlias type="com.sclead.dao.entity.User" alias="User"/>  
    8.     <!--    
    9.     <mappers>    
    10.         <mapper resource="com/sclead/dao/mapper/xml/user-mapper.xml"/>    
    11.     </mappers>   
    12.     -->   
    13. </configuration>   

    如果实体类属性和数据库中字段名称不相同,必须在配置中声明resultMap映射,指定字段和属性对应关系,查询时指定resultMap,查询成功后会返回User对象,或者是User集合。

    三张表关联查询,这里定义三张表,A、B、C,B关联A,C关联B,在查询A的时候同时查询B和C,在A实体类中定义B对象集合,在B实体类中定义C对象集合。

    A表{a_id,......},B表{b_id,b_a_id,......},C表{c_id,c_b_id,......}

    Java代码  收藏代码
    1. public class A {  
    2.     private int aId;  
    3.     private List<B> bs;  
    4.     public int getaId() {  
    5.         return aId;  
    6.     }  
    7.     public void setaId(int aId) {  
    8.         this.aId = aId;  
    9.     }  
    10.     public List<B> getBs() {  
    11.         return bs;  
    12.     }  
    13.     public void setBs(List<B> bs) {  
    14.         this.bs = bs;  
    15.     }  
    16. }  
    17.   
    18. public class B {  
    19.     private int bId;  
    20.     private int baId;  
    21.     private List<C> cs;  
    22.     public int getBId() {  
    23.         return bId;  
    24.     }  
    25.     public void setBId(int bid) {  
    26.         this.bId = bid;  
    27.     }  
    28.     public int getBaId() {  
    29.         return baId;  
    30.     }  
    31.     public void setBaId(int baId) {  
    32.         this.baId = baId;  
    33.     }  
    34.     public List<C> getCs() {  
    35.         return cs;  
    36.     }  
    37.     public void setCs(List<C> cs) {  
    38.         this.cs = cs;  
    39.     }  
    40. }  
    41.   
    42. public class C {  
    43.     private int cId;  
    44.     private int cbId;  
    45.     public int getcId() {  
    46.         return cId;  
    47.     }  
    48.     public void setcId(int cId) {  
    49.         this.cId = cId;  
    50.     }  
    51.     public int getCbId() {  
    52.         return cbId;  
    53.     }  
    54.     public void setCbId(int cbId) {  
    55.         this.cbId = cbId;  
    56.     }  
    57. }  
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    3. <mapper namespace="com.abc.AMapper">  
    4.   
    5.     <resultMap type="com.abc.A" id="aMap">  
    6.         <id property="a_Id" column="a_id" />  
    7.         <!-- 其它字段略 -->  
    8.           
    9.         <!-- 关联查询B数据 -->  
    10.         <collection property="bs" resultMap="com.sbc.BMapper.bMap"/>  
    11.     </resultMap>  
    12.       
    13.     <!-- 公用sql -->  
    14.     <sql id="baseSql">  
    15.         select * from ly_a a  
    16.         left join ly_b b on a.a_id = b.b_a_id  
    17.         left join ly_c c on b.b_id = c.c_b_id  
    18.     </sql>  
    19.   
    20.     <!-- 查询所有记录 -->  
    21.     <select id="getAllA" resultMap="aMap">  
    22.         <include refid="baseSql"/>  
    23.     </select>  
    24.       
    25.     <!-- 查询一个 -->  
    26.     <select id="getAById" parameterType="int" resultMap="aMap">  
    27.         <include refid="baseSql"/> where a.a_id=#{a_id}  
    28.     </select>  
    29.   
    30. </mapper>  
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    3. <mapper namespace="com.abc.BMapper">  
    4.   
    5.     <resultMap type="com.abc.B" id="aMap">  
    6.         <id property="bId" column="b_id" />  
    7.         <id property="baId" column="b_a_id" />  
    8.         <!-- 其它字段略 -->  
    9.        
    10.         <!-- 关联查询C数据 -->  
    11.         <collection property="cs" resultMap="com.sbc.CMapper.cMap"/>  
    12.     </resultMap>  
    13. </mapper>  
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    3. <mapper namespace="com.abc.CMapper">  
    4.   
    5.     <resultMap type="com.abc.C" id="cMap">  
    6.         <id property="cId" column="c_id" />  
    7.         <id property="cbId" column="c_b_id" />  
    8.         <!-- 其它字段略 -->  
    9.     </resultMap>  
    10.   
    11. </mapper>  

    在调用getAById或者getAllA,返回A对象或者A集合,A对象中已经封装了关联的B对象,B对象中已经封装了关联的C对象。

     mybatis的关联查询还有其他集中配置方式,这里只介绍多级关联查询,

  • 相关阅读:
    前端发展态势 && 前端工作流程个人浅析
    Mac在Django安装mysqlclient时报错
    rabbitMQ简单配置及OSError: [Errno 9] Bad file descriptor问题
    MacOS 出现command not found
    Celery简单说明以及在Django中的配置
    Celery目录结构配置
    shell脚本之安装docker
    阿里云按需购买设置
    Java中的关键字 transient
    jvm常用参数
  • 原文地址:https://www.cnblogs.com/zyzg/p/7792106.html
Copyright © 2011-2022 走看看