列名与类中成员变量名称不一致

  1. USE ssm;
  2. DROP TABLE IF EXISTS `book`;
  3. CREATE TABLE `book`(`bookid` INT NOT NULL AUTO_INCREMENT,
  4. `bookname` VARCHAR(255) NOT NULL COMMENT '图书名称',
  5. PRIMARY KEY (`bookid`)
  6. )ENGINE=INNODB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;
  7. INSERT INTO `book` VALUES(1,'java基础');
  8. INSERT INTO `book` VALUES(2,'sql基础');

访问一个新的表,先写实体类(所有封装数据的容器)
package com.chentianyu.pojo;

public class Book {
    private Integer id;//故意与sql数据库的bookid不一致
    private String name;

    public Book() {
    }

    public Book(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
package com.chentianyu.mapper;

import com.chentianyu.pojo.Book;

import java.util.List;

public interface BookMapper {
    //查询全部图书
    List<Book> getAllBooks();
}

同一个目录上创建BookMapper.xml(同名)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//3.0 Mapper//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chentianyu.mapper.BookMapper">
    <!--
    //查询全部图书
    List<Book> getAllBooks();

    private Integer id;
    private String name;
    -->
    <select id="getAllBooks" resultType="book">
        select bookid,bookname from book
    </select>
</mapper>

这里说明了实体类中的成员变量(拿id去接bookid接不住)

测试
package com.chentianyu.test;

import com.chentianyu.mapper.BookMapper;
import com.chentianyu.pojo.Book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 *
 */
public class MyTest {
    SqlSession sqlSession;
    //动态代理对象
    UsersMapper uMapper;
    //日期的格式化刷子
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
    @Before
    public void test01() throws IOException {
        InputStream in = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        sqlSession = factory.openSession();
        uMapper = sqlSession.getMapper(UsersMapper.class);
    }

    @Test
    public void testBieMing1(){
        BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
        List<Book> allBooks = bookMapper.getAllBooks();
        allBooks.forEach(book -> System.out.println(book));
    }
    @After
    public void test03(){
        sqlSession.close();
    }
}

但是没有拿到数据,原因是接不住,返回的没错,就是你的**bookid****bookname**塞不到**id****name**

Opening JDBC Connection
Created connection 1951963537.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@74589991]
==>  Preparing: select bookid,bookname from book
==> Parameters: 
<==    Columns: bookid, bookname
<==        Row: 1, java基础
<==        Row: 2, sql基础
<==      Total: 2
null
null

解决办法
  • 1.别名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//3.0 Mapper//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chentianyu.mapper.BookMapper">
    <!--
    //查询全部图书
    List<Book> getAllBooks();

    private Integer id;
    private String name;
    -->
    <select id="getAllBooks" resultType="book">
        select bookid id,bookname name from book
    </select>
</mapper>
  • 2.更好更通用的解决方案: resultMap
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//3.0 Mapper//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chentianyu.mapper.BookMapper">
    <!--
    //查询全部图书
    List<Book> getAllBooks();

    private Integer id;
    private String name;
    -->
    <!--
    使用resultMap手工完成映射
    id:select...中的resultMap名称一致
    type:返回的类型
    -->
    <resultMap id="bookmap" type="book">
        <!--主键绑定(固定)-->
        <id property="id" column="bookid"></id>
        <!--非主键绑定-->
        <result property="name" column="bookname"></result>
    </resultMap>
    <select id="getAllBooks" resultMap="bookmap">
        select bookid,bookname from book
    </select>
</mapper>

主配置文件信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybaits.org//Configuration 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--读取jdbc.properties属性-->
    <properties resource="jdbc.properties"></properties>
    <!--设置日志输出-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--注册实体类的别名-->
    <typeAliases>
        <package name="com.chentianyu.pojo"/>
    </typeAliases>
    <!--配置环境变量-->
    <environments default="one">
        <environment id="one">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册mapper.xml文件-->
    <mappers>
<!--        <mapper class="com.chentianyu.mapper.UsersMapper"></mapper>-->
    <!--批量注册-->
        <package name="com.chentianyu.mapper"/><!--这个包下所有的mapper都注册进来-->
    </mappers>
</configuration>