公司決定新項目用mybatis,雖然這個以前學過但是一直沒用過都忘得差不多了,而且項目比較緊,也沒時間去系統點的學一學,只好很粗略的百度達到能用的程度就行了。
其中涉及到插入實體要求返回主鍵id的問題,以前用ssh配合oracle很容易實現,因為有sequence,而且mysql也基本沒用過,所以只好去百度了。
這個內容還是比較好查的,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserDao">
<insert id="insertUser" parameterType="com.entity.User"> insert into sys_User(username,classes) values(#{username},#{classes}) </insert>
</mapper>
本來我們一般配置一個不需要返回主鍵的,並且id是自增的,只需要上述配置即可,values中的大括號內的字段和parameterType指向的實體類的字段大小寫記得對應起來,然后namespace的路徑與接口方法路徑對應起來,然后調用這個sql的接口方法就只需如下:
public interface UserDao{ /** * 新增學生 * @param User */ public void insertUser(User user); }
如果需要返回插入時自增主鍵的值的話,上述方法就需要稍微更改下了,其中存放數據庫語句的xml文件里需要相應更改配置,而接口方法的返回值類型也需要更改,如下:
xml方法:記得加上useGeneratedKeys和keyProperty配置即可,前者是指設置是否使用jdbc的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設置的屬性中,后者即實體類主鍵字段
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userid" parameterType="com.entity.User">
insert into sys_User(username,classes)
values(#{username},#{classes})
</insert>
接口方法返回值改為int即可,因為mysql也只有int類型值支持自增,但是沒試過返回值為string是不是能夠成功返回,我猜想應該是可以的
/** * 新增學生 * @param User */ public int insertUser(User user);
到這一步為止其實都沒有什么問題,很容易就能百度到,具體是在調用時候,我不小心進了一個坑,我程序代碼片段類似於這樣的:
User user=new User(); user.setUsername("acfun");
user.setClasses("注孤生一班");
int id=userDao.insertUser(user);
system.out.println(id)
結果我發現不管怎么樣返回來的都是1,即便數據庫中主鍵已經自增到10了。。。
后來才知道是姿勢不對,應該如下:
User user=new User(); user.setUsername("acfun"); user.setClasses("注孤生一班"); userDao.insertUser(user); system.out.println(user.getUserid);
這樣才是返回的自增的id。
只怪自己沒理解意思,其實人家插入以后取回來的主鍵直接給賦值到你當做參數的實體的id里面去了,至於方法返回值返回的應該是受影響行數,那個useGeneratedKeys說的很清楚了,使用jdbc的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設置的屬性中,但是由於比較緊急就草草的根據百度看人家怎么配置就怎么配置,想當然的去用了。
話說這么初級的一個問題我也水了這么多字也真不好意思,因為知道自己水平有限,就寫的詳細一點,也沒關乎什么原理性的東西,因為有些東西在熟悉的人看來實在簡單不過,根本無需一提,但是實際上看你的博文的可能會是一個初入java的小白,就像我在找minasocket方面的使用方法時候就感覺深受其害,淚流滿面,找到的基本都是說的各種原理源碼啥的,我想看到的結果博主一句:此類代碼實在簡單,無需贅述。。。看的我當時就。。。也不怪人家,確實不同的位置不同的看法。
現在項目太緊,都沒時間去好好系統的學一下,基本都是需要用到什么趕緊去查使用方法,也不去管原理什么的,今天難得稍微閑下來一點發個毫無深度的博文,希望有些和我一樣的小白別掉同樣的坑里。
已經連續一個多月加班到晚上9點半並且周末無休的初級程序猿留。。。
可能代碼會有些許錯誤,因為是直接從公司項目代碼拷過來,然后改成User這種的,可能有些路徑方面沒改正確。以后等項目稍微告一段落,閑下來了,再去自己搭個ssm的框架,去稍微具體點的學習學習。