2013-08-29 34 views
24

làm cách nào tôi có thể lấy khóa được tạo bằng cách chèn bằng MyBatis? Tôi đã đọc nhiều trang về câu hỏi này nhưng tôi vẫn bị chặn, bất kỳ ai cũng có thể giúp tôi không? Đây là mã của tôi:MyBatis, làm thế nào để có được chìa khóa tự động tạo ra của một chèn? [MySql]

Bảng:

ID_ERROR long primary key 
DATE timestamp 
TYPE varchar 
MESSAGE varchar 
SOURCE varchar 

Các dao:

Long returnedId = 0L; 
MyMapper myMapper = this.sqlSession.getMapper(MyMapper.class); 
myMapper.insertRecord(returnedId, Utils.now(), t.getClass().getName(), t.getMessage(), c.getName()); 
return returnedId; 

Các mapper.java:

public void insertRecord(@Param("returnedId") Long returnedId, @Param("timestamp")Timestamp timestamp,@Param("type") String type,@Param("message") String message,@Param("source") String source); 

Các mapper.xml

<insert id="insertRecord" parameterType="map" useGeneratedKeys="true" keyProperty="ID_ERROR"> 
    INSERT INTO errors (
     DATE, 
     TYPE, 
     MESSAGE, 
     SOURCE 
    ) 
    VALUES (
     #{timestamp}, 
     #{type}, 
     #{message}, 
     #{source} 
    ) 
    <selectKey resultType="long" order="AFTER" keyProperty="returnedId"> 
     SELECT LAST_INSERT_ID() as returnedId 
    </selectKey> 
</insert> 

Điều gì là sai? Làm cách nào tôi có thể lấy khóa được tạo của phần chèn này? Cảm ơn!

Trả lời

-1

Nếu bạn muốn nhận được các khóa chính tạo ra, bạn phải vượt qua các đối số của Map hoặc POJO Object

public void insertRecord(Map<String, Object> map); 

Khi gọi phương thức lập bản đồ, đặt giá trị để lập bản đồ.

Map<String, Object> map = new HashMap<String, Object>(); 
map.put("returnedId", 0); 
map.put("message", message); 
// other paramters 
mapper.insertRecord(map); 
return map.get("returnedId"); 
-1

Hãy làm theo các bước dưới đây:

  1. Tạo Lỗi POJO với id như thuộc tính

  2. Thay returnId lỗi như dưới đây,

public void insertRecord (@Param ("lỗi") Lỗi lỗi, @Param ("dấu thời gian") Dấu thời gian dấu thời gian, @ Param ("loại") Chuỗi loại, @ Param ("message") Chuỗi tin nhắn, @ Param ("source") String source);

  1. Thay đổi khóaProperty = "ID_ERROR" thành keyProperty = "error.id"

  2. Di

    <selectKey resultType="long" order="AFTER" keyProperty="returnedId"> 
        SELECT LAST_INSERT_ID() as returnedId 
    </selectKey> 
    

Bạn sẽ được chèn id trong error.id

+1

Một không bao giờ nên sử dụng error.id cho bất cứ điều gì nhưng ID lỗi. Hacks như vậy làm cho mã bẩn và không thể đọc được – Bostone

11

Bạn có thể đạt được điều này bằng hai cách,

  1. Bằng cách sử dụng useGeneratedKeys="true", keyProperty="id", keyColumn="id"

    keyProperty đề cập đến tên biến POJO và keyColumn đề cập đến tên cột được tạo ra trong cơ sở dữ liệu

  2. Bằng cách sử dụng <selectKey/> bên chèn thẻ

33

Đối với tôi nó đang làm việc như thế này (mybatis 3.x) .. id phải được thiết lập tự động tăng trong bảng mysql

<insert id="createEmpty" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID"> 
    INSERT INTO PROJECT (TITLE,DESCRIPTION) 
    VALUES 
    (#{title},#{description}) 
</insert> 

NOTEkeyProperty="project.projectId"useGeneratedKeys="true"

giao diện của tôi là:

public int createEmpty(@Param("project") Project project, @Param("title") String title, 
    @Param("description") String description); 

cuối cùng để có được giá trị (mà sẽ được tự động gán cho thuộc tính id của POJO) tôi sử dụng:

projectRepository.createEmpty(p, "one", "two"); 
System.err.print(p.getProjectId() + "\n"); 
+0

Điều này rất hữu ích. –

+0

bạn nên loại bỏ tên đối tượng, ở đây dự án, từ keyProperty = "project.projectId" – Humoyun

3

Giải pháp dễ dàng:

Sử dụng thuộc tính KeyProperty làm objectName.AutoincrementId Giống như bên dưới ...

useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"

0

Dưới Xml Mapper, sử dụng truy vấn:

<insert id="saveDemo" parameterType="com.abc.demo" 
     useGeneratedKeys="true" keyProperty="demoId" keyColumn="DEMOID"> 
     INSERT INTO TBL_DEMO (DEMONAME,DEMODESCRIPTION) 
     VALUE (#{demoName},#{demoDescription}) 
     <selectKey keyProperty="demoId" resultType="int" order="AFTER"> 
     SELECT LAST_INSERT_ID(); 
     </selectKey> 
    </insert> 

Java Side

@Override 
public boolean saveDemo(Demo demo) { 
    boolean status = false; 
    SqlSession session = this.sqlSessionFactory.openSession(); 
    try { 
     DemoMapper mapper = session.getMapper(DemoMapper.class); 
     mapper.saveDemo(demo); 
     session.commit(); 
     status = true; 
    } catch(PersistenceException e) { 
     System.out.println(e); 
    } finally { 
     session.close(); 
    } 
    return status; 
} 
Các vấn đề liên quan