mybatis常见问题

1、 mapper.xml中的resultMap中的<result column="ROLE_ID" property="roleId" jdbcType="INTEGER" /> INTEGER要大写。
<select id="selectUsers" parameterType="int" resultType="hashmap">
中的 parameterType="int"不是 parameterType="Integer"


查询时数据库字段值如果为空,返回的结果集会有默认值


如果是Integer和String类型在实体类中,通过generator自动生成实体中已经处理了Null的情况
public String getName() {
return name;
}
public void setName(String name) {
    this.name = name == null ? null : name.trim();
}
所有,最好不用int类型,换成Integer对象
2、执行存储过程


(1)、#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by "id",这当然会报错。
(2)、$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了。


<select id="execProc"  statementType="CALLABLE"  parameterType="map" >
<![CDATA[    {call list_update_pro(#{mysql})}    ]]>
  </select>


 


3、返回map


.在mybatis中,无论你指定还是不指定返回类型,mybatis都会默认的先将查询回的值放入一个hashMap中(如果返回的值不止一条就是一个包含hashMap的list)。这其中的区别在于,如果你指定了返回类型,mybatis将会根据返回类型的实体类来从hashMap中获取值并set到这个实体类中。如果不指定就默认返回一个HashMap<String,Object>(List<HashMap<String,Object>>)




4、一般报错的原因是 xml没有扫描,或者 接口没有注入


<!-- myBatis文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
<property name="mapperLocations">
<array>
<value>classpath:com/zfy/mapper/portal/*.xml</value>
<value>classpath:com/zfy/mapper/permission/*.xml</value>
<value>classpath:com/zfy/mapper/list/*.xml</value>
<value>classpath:com/zfy/mapper/form/*.xml</value>
<value>classpath:com/zfy/mapper/report/*.xml</value>
</array>
</property>
</bean>




5、mapper.xml中的 # 与 $ 的区别


1.#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by "id",这当然会报错.. 
2.$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了. 
3.#方式能够很大程度防止sql注入. 
4.$方式无法方式sql注入. 
5.$方式一般用于传入数据库对象.例如传入表名. 
6.一般能用#的就别用$. 




6、foreach 的使用


注意 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。
<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>


Java 调用 
List<Integer> list   = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
这里的list 是  xml里面 collection="list"  的key






7、返回刚插入记录的主键ID


Oracle自增必须得配一个sequence。
xml 配置
<insert id="insert" parameterType="com.zfy.db.model.Book" >
   <selectKey   order="BEFORE" resultType="java.lang.Integer" keyProperty="bookId" >
    select SEQ_BOOK.nextval from dual
 </selectKey>
    insert into BOOK (BOOK_ID, BOOK_PRICE, BOOK_NAME
      )
    values (#{bookId}, #{bookPrice,jdbcType=INTEGER}, #{bookName,jdbcType=VARCHAR}
      )
  </insert>


JUNIT测试
BookMapper mapper = session.getMapper(BookMapper.class);//接口
Book book = new Book();
book.setBookName("aaa");
book.setBookPrice(123);
mapper.insert(book);
   System.out.println("返回主键ID:   "+book.getBookId());




8、启动web服务器时一直扫描mapper.xml?
原因:mapper.xml里面写错了,比如resultType="",或者字母写错了(大小写)等等。


9、mybatis 处理 Oracle xmltype类型


(1)查询一条记录的SQL
select  t.book_id, t.book_name.getClobVal() as bookName,t.book_price from  book t  where  t.book_id = #{bookId,jdbcType=INTEGER}


(2)JavaBean 
Private  String  bookName;
Get();
Set();




(3)BookMapper.xml
  <resultMap id="BaseResultMap" type="com.zfy.db.model.Book" >
    <result column="BOOK_ID" property="bookId" jdbcType="INTEGER" />
    <result column="BOOK_PRICE" property="bookPrice"  jdbcType="INTEGER" />
  </resultMap>
  <!--  book_name为 CLOB类型时   -->
  <resultMap id="ResultMapWithBLOBs" type="com.zfy.db.model.Book" extends="BaseResultMap" >
    <result column="BOOK_NAME" property="bookName" jdbcType="CLOB" />
  </resultMap>
  
  <select id="selectById" resultMap="ResultMapWithBLOBs">
select  t.book_id, t.book_name.getClobVal() as bookName,t.book_price from  book t  where  t.book_id = #{bookId,jdbcType=INTEGER}
  </select>


通过oracle将xmltype转成clob ,然后由mybatis 处理clob 类型。t.book_name.getClobVal() 一直要指定别名 对应 属性。


10、动态SQL传参
如果直接传一个String sql ;  在接口方法用   @Param("sql")String sql;来传参。在xml中直接  ${sql} 就可以了




11、generator自动生成一些问题
1、number没有指定长度默认是38,自动生成所对应的实体类属性的类型也是BigDecimal。所以指定nmber类型时最好指定number(4--8)的长度。
2、javaBean 是 INTEGER类型,mapper.xml对应的还是Decimal
3、<selectKey resultType="java.lang.String" keyProperty="userCode" order="BEFORE" >
      select s_sequence.nextval from dual
    </selectKey>
4、Existing file f:\keke\com\zfy\db\model\list\ListCfgExample.java was overwritten       mapper.xml里面会重复生成

你可能感兴趣的:(mybatis)