您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘PMyBatis中出現(xiàn)列名與屬性名不匹配如何解決,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
mybatis配置文件:
<?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"> <!-- 完成一個mybatis-config.xml的文件 -> 作用:配置連接數(shù)據(jù)庫的所有需要的環(huán)境 必須連接到所有要使用的映射文件(ProductMapper.xml) --> <!--configuration 根目錄 --> <configuration> <!-- 引入(關聯(lián))db.properties文件 --> <properties resource="db.properties"></properties> <!-- 配置別名:在MyBatis中為一個類取別名 配置別名是為了在對象映射文件中接收參數(shù)類型和返回參數(shù)類型時使用--> <typeAliases> <!-- 設置這個包下面的所有類的別名 <package name="cn.itsource.domain"/> --> <!-- 設置單個類的別名 alias:取的別名 type:這個別名所對應的Java類 別名使用的時候與大小寫無關 --> <typeAlias alias="Product" type="cn.itsource.domain.Product"/> </typeAliases> <!-- 環(huán)境們:很多環(huán)境 default:表示默認使用哪一個環(huán)境--> <environments default="development"> <!-- 單個環(huán)境:一個環(huán)境 id:表示這個環(huán)境的名稱--> <environment id="development"> <!-- transactionManager:事務管理器 (使用的JDBC事務管理器)--> <transactionManager type="JDBC"></transactionManager> <!-- MyBatis自帶POOLED連接池(數(shù)據(jù)源) --> <dataSource type="POOLED"> <property name="driver" value="${db_driverClassname}" /> <property name="url" value="${db_url}" /> <property name="username" value="${db_username}" /> <property name="password" value="${db_password}" /> </dataSource> </environment> </environments> <!-- resource:表示 核心配置文件(mybatis-config.xml)必須與所有的對象映射文件(ProductMapper.xml)關聯(lián)?。。?! --> <mappers> <mapper resource="cn/itsource/domain/ProductMapper.xml" /> </mappers> </configuration>
上面配置了別名,那么對象與映射文件中就可以直接使用別名,而不需要使用全限定名稱
<?xml version="1.0" encoding="UTF-8"?> <!-- 完成一個對象關系映射文件 -> 作用:一個對象的所有SQL都應該寫在這個映射文件中 這個文件一般和我們的domain寫在同一個包里面,取名為 -> domain的名稱+Mapper.xml --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空間(每個Mapper必須有命名空間) --> <mapper namespace="cn.itsource.domain.ProductMapper"> <!-- select:它里面寫查詢語句 id:查詢語句的唯一標識(名稱不能重復) 如何在 java代碼中找到sql語句? 命名空間+id 例子:cn.itsource.domain.ProductMapper.select parameterType:傳入的參數(shù)類型。 除了MyBatis支持的類型,其它的類型都通通使用全限定名 resultType:返回的每一條數(shù)據(jù)的結果類型(結果類型寫權限定名稱 ) 查詢功能使用 --> <select id="selectOne" parameterType="Long" resultType="Product"> select * from product where id = #{id} </select> <!-- resultType:表示返回的數(shù)據(jù)類型 --> <select id="selectAll" resultType="Product"> select * from Product </select> <!--parameterType :表示傳入?yún)?shù)(Product)。 useGeneratedKeys:是否需要獲取主鍵 keyColumn:主鍵在數(shù)據(jù)庫中的名稱(不寫的話默認名稱和keyProperty一致) keyProperty:對象中的屬性(代表主鍵的那個屬性) --> <insert id="save" parameterType="Product" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> insert into product (productName,dir_id,salePrice,supplier,brand,cutoff,costPrice) values(#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice}) </insert> <!-- parameterType:接收參數(shù)沒有寫權限頂名稱,使用的別名(簡寫) --> <delete id="delete" parameterType="long"> delete from product where id = #{id} </delete> <update id="update" parameterType="Product"> update product set productName=#{productName},dir_id=#{dir_id}, salePrice=#{salePrice},supplier=#{supplier},brand=#{brand},cutoff=#{cutoff},costPrice=#{costPrice} where id = #{id} </update> </mapper>
列名與屬性名不對應的解決方案(截圖不完整)
做映射文件的時候,只做了表與對象之間的聯(lián)系。并沒有做列與字段之間的聯(lián)系。那么它們之間是怎么聯(lián)系上的呢?
由于之前咱們的列名與屬性名是一樣的,因此框架進行了自動的識別。
那么,如果咱們的列名與屬性名不一致了(對應不上),這時候應該怎么辦呢?這時候需要把哪些列名與屬性名對應上。
在MyBatis中,提供了一個resultMap的標簽,就是讓咱們來完成返回結果的關系對應的,使用方式如下:
注意:主鍵設置需要單獨配置 如: <id column="id" property="id" />
<!-- 返回的數(shù)據(jù)映射 type:代表是要映射的對象 id:代表唯一(過會我們要拿到它) --> <resultMap type="cn.itsource.domain.Product" id="productMap"> <!-- column:對應的列名 property:對應的屬性名 --> <id column="id" property="id" /> <result column="productName" property="name" /> </resultMap> <select id="queryOne" parameterType="long" resultMap="productMap"> select * from product where id = #{id} </select>
補充知識:MyBatis - 實體類的屬性名和數(shù)據(jù)庫列名不一致時的兩種解決辦法!
問題:兩者不一致時 , 查詢結果無法封裝到實體!(也就無法查詢出來)
① 查詢的sql語句中使用別名進行查詢.
但要注意: 字段名的別名 要和 實體類的屬性名一致!
UserMapper.xml
<!-- namespace:接口的全路徑名. --> <mapper namespace="com.xxx.dao.UserMapper"> <!-- 使用別名 --> <select id="queryAll" resultType="com.xxx.domain.User"> select id as userId, username as userName, address as userAddress, sex as userSex, birthday as userBirthday from user; </select> </mapper>
注: 如果使用別名 , 每一個sql語句都需要加別名 (很麻煩)
故: 一般都使用第二種.
② 使用resultMap ★
UserMapper.xml
<mapper namespace="com.jxj.dao.UserDao"> <resultMap id="userResultMap" type="User"> <!-- 主鍵字段 property: 實體類屬性名. column: 庫中表的列名 javaType: 數(shù)據(jù)類型. --> <id property="userId" column="id" javaType="int"></id> <!-- 非主鍵字段 --> <result property="userSex" column="sex" javaType="string"></result> <result property="userAddress" column="address" javaType="string"></result> <result property="userBirthday" column="birthday" javaType="date"></result> <result property="username" column="username" javaType="string"></result> </resultMap> <select id="queryAll" resultMap="userResultMap"> select * from user </select>
注: select中resultMap的屬性值 要和 resultMap中id的屬性值一樣.
測試類: UserMapper.java
@Test public void queryAll() throws IOException { // 1.創(chuàng)建工廠類. InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 2.創(chuàng)建sql對象. SqlSession sqlSession = sqlSessionFactory.openSession(); // 3.創(chuàng)建接口的實現(xiàn)類對象. UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 4.調(diào)用接口中的方法 (代理) List<User> users = mapper.queryAll(); for (User user : users) { System.out.println(user); } sqlSession.close(); in.close(); }
上述就是小編為大家分享的MyBatis中出現(xiàn)列名與屬性名不匹配如何解決了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。