列名与类中成员变量名称不一致
USE ssm;DROP TABLE IF EXISTS `book`;CREATE TABLE `book`(`bookid` INT NOT NULL AUTO_INCREMENT,`bookname` VARCHAR(255) NOT NULL COMMENT '图书名称',PRIMARY KEY (`bookid`))ENGINE=INNODB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;INSERT INTO `book` VALUES(1,'java基础');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>
