# MyBatis数据查询

## MyBatis 数据查询步骤：

1. 创建实体类,开启驼峰命名映射
2. 创建 Mapper.xml，编写 \<select> SQL 标签
3. mybatis-config.xml 中新增 \<mapper>
4. SqlSession 执行 select 语句

### 创建 实体类，开启驼峰命名映射

在MyBatis\src\main\java\indi\chester\mybatis\entity 目录下创建 Goods.java文件

Goods 类里面的成员属性于 t\_goods 里面的字段名相同，只是将下划线命名改为了驼峰命名，为此需要在 mybatis-config.xml 中开启驼峰命名映射(接下来会讲到）

```java
package indi.chester.mybatis.entity;


public class Goods {
    private Integer goodsId;
    private String title;
    private String subTitle;
    private Float originalCost;
    private Float currentPrice;
    private Float discount;
    private Integer isFreeDelivery;
    private Integer categoryId;

    public Integer getGoodsId() {
        return goodsId;
    }

    public void setGoodsId(Integer goodsId) {
        this.goodsId = goodsId;
    }

    public String getTitle() {
        return title;
    }

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

    public String getSubTitle() {
        return subTitle;
    }

    public void setSubTitle(String subTitle) {
        this.subTitle = subTitle;
    }

    public Float getOriginalCost() {
        return originalCost;
    }

    public void setOriginalCost(Float originalCost) {
        this.originalCost = originalCost;
    }

    public Float getCurrentPrice() {
        return currentPrice;
    }

    public void setCurrentPrice(Float currentPrice) {
        this.currentPrice = currentPrice;
    }

    public Float getDiscount() {
        return discount;
    }

    public void setDiscount(Float discount) {
        this.discount = discount;
    }

    public Integer getIsFreeDelivery() {
        return isFreeDelivery;
    }

    public void setIsFreeDelivery(Integer osFreeDelivery) {
        this.isFreeDelivery = osFreeDelivery;
    }

    public Integer getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(Integer categoryId) {
        this.categoryId = categoryId;
    }

}

```

&#x20;在 MyBatis/src/main/resources/mybatis-config.xml  的 configuration标签下添加这个标签:&#x20;

```xml
    <!-- 驼峰命名自动转换, 数据库字段与Java 成员变量之间, 下划线与驼峰分隔-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
```

### 创建 Mapper.xml，编写 \<select> SQL 标签

在 MyBatis\src\main\resources\mappers 目录下创建 goods.xml文件

```xml
<?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="goods"> 

    <!-- 如果不用LIMIT, 对于查询结果的数量比较大, 返回的是一个list的, 一般不用二级缓存, 因为这样命中率不高-->
    <select id="selectAll" resultType="indi.chester.mybatis.entity.Goods" useCache="false">
        select * from  t_goods ORDER BY  goods_id DESC LIMIT 10
    </select>

  
</mapper>
​​
xm
```

resultType 里面的 Goods 类 表示会将返回的每一条数据 包装成 Goods 类型的格式。mapper 的作用就是将 SQL 数据与 Java 对象关联起来。为此我们还需要在mybatis-config.xml 中新增 \<mapper>。这里用到了一个 useCache=false, 代表不使用缓存，会在后面章节详细说明。

### mybatis-config.xml 中新增 \<mapper>

在 configuration 标签下添加 mappers -> mapper 标签， 这样 mybatis 才认得 SQL数据和 Java 对象之间的转换关系

```xml
    <mappers>
        <mapper resource="mappers/goods.xml" />
    </mappers>
```

### SqlSession 执行 select 语句

在 D:\intro\_Java\MyBatis\src\test\java\MyBatisTest.java 中添加 testAll() 方法用于测试一下刚刚写的 slect 语句。特别的是这里用到了 上一节 写到的 MyBatisUtils 工具类 帮助我们打开和关闭 sqlSession。d通过调用sql.Session.selectList("goods.selectAll")进行查询，goods.selectAll就是我们在mappers.xml 下 username=goods 命名空间下 selectAll 标签下写的 select 语句， 最后返回值是一个 List\<Goods> 类型。

```java
   @Test
    public void testSelectAll() throws Exception{
        SqlSession sqlSession=null;
        try {
            sqlSession=MyBatisUtils.openSession();
            List<Goods> GoodsList =sqlSession.selectList("goods.selectAll");
            for(Goods g: GoodsList){
                System.out.println(g.getTitle());
            }
        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }finally {
            MyBatisUtils.closeSession(sqlSession);
        }
    }
```

运行结果如下:

```xml
美赞臣蓝臻Enfinitas 2段婴儿奶粉900g单罐(6-12月龄) 荷兰进口
美赞臣蓝臻Enfinitas 1段婴儿奶粉900g单罐(0-12月龄) 荷兰进口
美赞臣蓝臻Enfinitas 1段婴儿奶粉400g单罐(0-12月龄) 荷兰进口
美赞臣蓝臻Enfinitas 3段婴儿奶粉900g单罐(12-36月龄) 荷兰进口
飞利浦新安怡羊毛脂乳头保护霜/膏 孕妇羊脂护理霜 乳头皲裂滋润保湿 SCF504/88
飞利浦新安怡英国进口原生单边电动吸奶器吸乳器吸力大SCF332/01
飞利浦AVENT/新安怡VIA储奶杯母乳储存杯组240毫升*5只 SCF639/05
飞利浦新安怡 防溢乳垫 一次性干爽 舒适透气抛弃型SCF254/11
飞利浦新安怡 婴儿温奶器 宝宝暖奶器热奶器 SCF355/01
飞利浦新安怡 经典宽口PES手动吸奶器花瓣按摩垫吸乳器SCF300/88
```
