问:插入一条记录后如何返回主键id?数据库
id设为主键自增,加入<selectKey>标签,以下。mybatis
<insert id="insert" parameterType="entity.Order"> <selectKey keyProperty="id" resultType="long" order="AFTER"> SELECT max(id) AS value from tb_order </selectKey> INSERT INTO tb_order (id,member_id,order_no) VALUES (#{id},#{memberId},#{orderNo}) </insert>
令insert语句返回值为主键id,加上keyProperty和useGeneratedKeys属性。调试
<!--此处keyProperty="id"中的id是Java实体类中的属性名--> <insert id="insert" parameterType="entity.Order" useGeneratedKeys="true" keyProperty="id"> INSERT INTO tb_order (id,member_id,order_no) VALUES (#{id},#{memberId},#{orderNo}) </insert>
经过配置能够使插入记录成功后自动将生成的主键封装到实体类中。code
数据库中为某个浮点数字段设置默认值0.00,使用mybatis添加一条数据该字段并非默认值,而是null。xml
mybatis中的增改的SQL中的字段不该该随意写,数据库默认值会被覆盖。对象
记一次开发中的问题:在使用mybatis插入一条记录时,要让一个字段初始的值为null,对应实体类中的属性是int类型,数据库默认值是null,可是新插入的记录该字段的值始终是0接口
解决的办法是将实体类中该字段的类型改成int的包装类型,int类型是没法用null赋值的,开发
因此若是数据库中的字段容许为空,对应实体类属性就要用包装类字符串
问:#{} 和${}传参的区别get
#{}:将参数传到数据库再替换
${}:在编译的时候替换,容易被SQL注入,要检查字符串参数是否合法
limit ${page*(page-1)},${pageSize}
${page*(page-1)}:参数使用表达式时,必须使用${},#{page*(page-1)}是不对的
,并且page必须是数值类型,不能是String类型
问:
mybatis中一条查询语句的resultType设为hashmap
可是对应的接口方法的返回类型是实体类的List集合 List<Recommend>
以下调用该方法
List<Recommend> dataList = recommendDao.getRecommendList(map);
编译和运行都没有出错,可是调试时dataList的实际类型是List<HashMap>
不报错的缘由是,List<Recommend>和List<HashMap>都是List
若是想遍历dataList,遍历的类型不管使用Recommend类型和HashMap类型都会报错
System.out.println(dataList instanceof List);// 提示表达式老是true
System.out.println(dataList instanceof ArrayList);//输出true
此问题说明,1:ArrayList类型对象的引用能够指向泛型不一样的ArrayList对象
2:mybatis默认返回ArrayList类型的List集合