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里面会重复生成