MyBatis的問題:There is no getter for property named '資料表中的欄位名' in '實體類'!
阿新 • • 發佈:2019-02-08
在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配置;測試類;