1. 程式人生 > >MyBatis的問題:There is no getter for property named '資料表中的欄位名' in '實體類'!

MyBatis的問題:There is no getter for property named '資料表中的欄位名' in '實體類'!

在MyBaits中的配置檔案中:mybaits-config.xml中有這樣一句話:在程式碼中用紅色標註:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        
        <setting name="cacheEnabled" value="true"/>
       
        <setting name="defaultStatementTimeout" value="3000"/>
        
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        
        <setting name="useGeneratedKeys" value="true"/>
</settings> <!-- Continue going here --> </configuration>

它的作用是:設定是否使用JDBC的getgenereatedkeys方法獲取主鍵並賦值到keyproperty設定的領域模型中;

說到這裡,可能會有很多人不明白什麼意思:

舉個例子就明白了:例如:

  String INSERT_FIELDS = " title , content , created_date , user_id , comment_count  ";
 @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{title},#{content},#{createdDate},#{userId},#{commentCount})"})

用紅色標註的部分:user_id 是在資料庫中的欄位,但在例項中使用時將其變為userId

created_date是在資料庫中的欄位,但在例項中使用時將其變為createdDate,

comment_count是在資料庫中的欄位,但在例項中使用時將其變為commentCount;

相信到這裡聰明的你已經明白了到底是怎麼回事:將_後面的部分將第一個小寫字母轉換為大寫字母,其他的不變。

下面是整個的程式碼:

package com.nowcoder.dao;

import com.nowcoder.model.Question;
import com.nowcoder.model.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface QuestionDAO {

    //空格, 防止出現字串出現連線,引起錯誤
    String TABLE_NAME = " question ";
    String INSERT_FIELDS = " title , content , created_date , user_id , comment_count  ";
String SELECT_FIELDS = " id " + INSERT_FIELDS; @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS, ") values (#{title},#{content},#{createdDate},#{userId},#{commentCount})"}) int addQuestion(Question question); //@Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where id=#{id}"}) //.xml的寫法 List<Question> selectLatestQuestions(@Param("userId") int userId , @Param("offest") int offest , @Param("limit") int limit); }

有需要的朋友可以用以下程式碼測試以下:

package com.nowcoder.dao;

import com.nowcoder.model.Question;
import com.nowcoder.model.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface QuestionDAO {

    //空格, 防止出現字串出現連線,引起錯誤
    String TABLE_NAME = " question ";
    String INSERT_FIELDS = " title , content , created_date , user_id , comment_count  ";
    String SELECT_FIELDS = " id " + INSERT_FIELDS;

    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{title},#{content},#{createdDate},#{userId},#{commentCount})"})
    int addQuestion(Question question);

    //@Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where id=#{id}"})
    //.xml的寫法
    List<Question> selectLatestQuestions(@Param("userId") int userId ,
                               @Param("offest") int offest ,
                               @Param("limit") int limit);
}
<?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.nowcoder.dao.QuestionDAO">
    <sql id="table">question</sql>
    <sql id="selectFields">id, title, content, comment_count,created_date,user_id
    </sql>
    <select id="selectLatestQuestions" resultType="com.nowcoder.model.Question">
        SELECT
        <include refid="selectFields"/>
        FROM
        <include refid="table"/>

        <if test="userId != 0">
            WHERE user_id = #{userId}
        </if>
        ORDER BY id DESC
        LIMIT #{offset},#{limit}
    </select>
</mapper>
package com.nowcoder.model;

import java.util.Date;

public class Question {
    private  int id;
    private String title;
    private String content;
    private Date createdDate;
    private int  userId;
    private int commentCount;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDated(Date createdDate) {
        this.createdDate = createdDate;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getCommentCount() {
        return commentCount;
    }

    public void setCommentCount(int commentCount) {
        this.commentCount = commentCount;
    }
}
package com.nowcoder;



import com.nowcoder.dao.QuestionDAO;
import com.nowcoder.dao.UserDAO;
import com.nowcoder.model.Question;
import com.nowcoder.model.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.Date;
import java.util.Random;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = WendaApplication.class)
@Sql("/init-schema.sql")
public class InitDatebaseTests {
    @Autowired
    UserDAO userDAO;
    @Autowired
    QuestionDAO questionDAO;
    @Test
    public void InitDatebaseTests() {
        Random random = new Random();
        for(int i = 0; i < 10; i++){
            User user = new User();
            user.setHeadUrl(String.format("http://images.nowcoder.com/head/%dt.png",
                    random.nextInt(1000)));
            user.setName(String.format("USER%d",i));
            user.setPassword("");
            user.setSalt("");
            userDAO.addUser(user);

            Question question = new Question();
            question.setCommentCount(i);
            Date date = new Date();
            date.setTime(date.getTime()+1000*3600*i);
            question.setCreatedDated(date);
            question.setId(i+1);
            question.setTitle(String.format("title{%d}",i));
            question.setContent(String.format("春江潮水連海平,海上明月共潮生;" +
                    "                       灩灩隨波千萬裡,何處春江無月明。",i));
            questionDAO.addQuestion(question);


        }
    }

}
從上往下分別是:dao層實現類;model層類;xml配置;測試類;