MyBatis入门五:MyBatis基本使用三:MyBatisUtils工具类;以查询为例,演示mybatis的一个工作流程;

本篇博客的主要内容是:

(1)MyBatisUtils工具类:初始化SqlSessionFactory这个对象;获得SqlSession对象的方法;关闭SqlSession对象的方法;

(2)以查询为例,演示mybatis的一个工作流程;

目录

一:MyBatisUtils工具类(提供SqlSessionFactory和SqlSession的工具方法)

二:MyBatis数据查询(以数据查询为例,演示Mybatis的一个工作流程)

1.创建实体类(Entity)

2.创建Mapper XML    &    3.编写select的标签

5.新增:为了让mybatis认识这个goods.xml,需要在mybatis-config.xml中对其进行声明

6.SqlSession执行select语句

4.开启驼峰命名


一:MyBatisUtils工具类(提供SqlSessionFactory和SqlSession的工具方法)

初始化工具类MyBatisUtils:

(1)MyBatisUtils主要职责是:● 帮助我们初始化SqlSessionFactory这个对象;同时让SqlSessionFactory全局唯一;● 获得SqlSession对象的方法;● 关闭SqlSession对象的方法;

(2)在实际开发中,会经常使用MyBatisUtils工具类;

MyBatisUtils内容:

package com.imooc.mybatis.utils;

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 sun.misc.ExtensionInstallationException;

import java.io.IOException;
import java.io.Reader;

/**
 * MyBatis工具类
 * (1)创建全局唯一的SqlSessionFactory对象;(2)获取SqlSession的方法;(3)关闭SqlSession的方法;
 */
public class MyBatisUtils {
    //sqlSessionFactory对象设置成静态的,这个对象属于类的;
    private static SqlSessionFactory sqlSessionFactory = null;
    static{
        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config1.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            // 如果出现了异常,除了上面打印异常,还需要将这个异常向上抛,让使用这个类的程序也知道这儿报错了;
            // 这儿主动抛了ExceptionInInitializerError,即在类的初始化过程中产生了错误;即调用者捕获了这个异常,就能够明白,
            // mybatis在初始化的时候产生了错误,
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * 获得SqlSession对象的方法;;;;
     * 在其他地方调用这个方法获得SqlSession对象后,后续就可以利用SqlSession完成数据表的增删改查了;
     * 说明:工具类中的方法,一般使用static进行描述,这样以后通过类名就能直接调用了;
     * @return
     */
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }

    /**
     * 关闭SqlSession的方法;
     * @param sqlSession
     */
    public static void closeSession(SqlSession sqlSession){
        if (sqlSession != null){
            sqlSession.close();
        }
    }
}

说明:

(1)SqlSessionFactory对象设置成了static;然后,SqlSessionFactory的实例化代码也放在了静态代码快中;这保证SqlSessionFactory全局唯一;

(2)初始化出问题后,主动【throw new ExceptionInInitializerError(e);

(3)为了测试MyBatisUtils:在MybatisTestor类中编写测试方法:

(4)测试成功的运行结果

(5)当初始代码出问题时候,看下throw new ExceptionInInitializerError(e);】效果

说明:当在静态初始化块中出现了异常的时候,JVM会抛出 java.lang.ExceptionInInitializerError异常。。具体关于ExceptionInInitializerError的详细内容,后续了解……


二:MyBatis数据查询(以数据查询为例,演示Mybatis的一个工作流程)

(1)实体类和数据表对应;

(2)创建Mapper XML 来说明当前SQL语句是什么;

(3)在Mapper XML中,增加<select>标签,书写SQL语句;

(4)在核心的mybatis-config.xml配置文件中,开启驼峰命名映射;

(5)在mybatis-config.xml配置文件中,增加<mapper>标签(是2步骤中的Mapper XML文件的声明啦);

(6)所有的配置工作完成后,在SQLSession对象中调用select方法,执行SQL语句;

以查询t_goods表中的数据为例。

 

1.创建实体类(Entity)

Goods实体类:

package com.imooc.mybatis.entity;

/**
 * 商品实体类,与数据库中的goods表对应;
 */
public class Goods {
    private Integer goodsId; // 商品ID
    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 isFreeDelivery) {
        this.isFreeDelivery = isFreeDelivery;
    }

    public Integer getCategoryId() {
        return categoryId;
    }

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

说明:

(1)啰嗦一下,变量驼峰命名;

(2)PS:在mybatis中,并没有直接指明说,Goods类就和t_goods表对应;;;;;只是在编写Goods类的时候,故意按照t_goods表的字段来设计Goods类的属性,因而可以用Goods类对象去承载t_goods表的查询结果而已。。。,,,,能懂?

 

2.创建Mapper XML    &    3.编写select的标签

 

goods.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">
    <select id="selectAll" resultType="com.imooc.mybatis.entity.Goods">
        select * from t_goods order by goods_id desc limit 10;
    </select>
</mapper>

说明:

(1)

(2)

● namespace命名空间类似于java中的包,java的包是对类进行区分的,比如在java中工具类放在utils包下,实体类放在entity包下。     与此同理,对应于不同表或者不同功能的SQL语句,可以指定不同的namespace。     在实际查询的时候,必须附带namespace命名空间;通过附带namespace,就可以区分不同的SQL语句了。     比如上例中的<select>标签的id=“selectAll”,但其实id=“selectAll”查询所有可能是每个数据表都会存在的id,即可能有多个<select>标签的id都等于“selectAll”,在调用的时候如果没有附带namespace的话,mybatis就不知道改调用哪个id=“selectAll”<select>标签了,,,但是如果附带上namespace=“goods”前缀,mybatis就会知道,我们要执行的是goods命名空间下的id=“selectAll”的<select>标签中的SQL语句了,,,,由此,mybatis就不会出现混乱不清的情况了。     所以在同一个namespace下,不同的标签的id必须是唯一的。     自然,不同的namespace下无此要求。

● resultType:代表返回的结果。在标签中的SQL语句执行完以后,会自动的将得到的每一条记录给包装成对应的Goods对象。

(3)特地说明:

PS:在mybatis中,并没有直接指明说,Goods类就和t_goods表对应;;;;;只是可以用Goods类对象去承载t_goods表的查询结果而已。。。即如上所所示,查询结果的可以使用Goods类对象去承载。其背后的支撑是:对于查询结果的字段,在Goods类的对象中都有对应的属性与其对应。

 

5.新增<mapper>:为了让mybatis认识这个goods.xml,需要在mybatis-config.xml中对其进行声明

这样以后,mybatis在初始化的时候,才知道goods.xml的存在。mybatis启动的时候,就会自动的加载goods.xml文件了。

 

6.SqlSession执行select语句

测试类中编写代码:

package com.imooc.mybatis;

import com.imooc.mybatis.entity.Goods;
import com.imooc.mybatis.utils.MyBatisUtils;
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.Test;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.util.List;

/**
 * JUnit单元测试类
 */
public class MyBatisTestor {

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

说明:

(1)SqlSession对象的select*方法简单说明

(2)select*方法的参数说明

执行结果:

 

4.开启驼峰命名

这是因为,在Goods实体类的属性和t_goods表的字段中,只有title是完全相同的。

为了解决这个问题,只需要在mybatis-config.xml配置文件的最上方位置上增加一个设置项:开启驼峰命名和表字段名的转换。

然后,数据表字段和实体类属性就都能对应上了。

注:经过多次实测,发现,开启驼峰命名转换后,实体类的字段名稍微写错一点后,其还是能与数据表的字段对应(这背后的具体还不甚清楚)。。。。但是,建议严谨为妙,即实体类的属性的命名还是要参考数据表中的字段来写,不要随意写。


 附加:此时mybatis-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="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/babytun?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="12345"/>
            </dataSource>
        </environment>

        <environment id="prd">
            <!-- 采用JDBC方式对数据库事务进行commit/rollback -->
            <transactionManager type="JDBC"></transactionManager>
            <!--采用连接池方式管理数据库连接-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.1.155:3306/babytun?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

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

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值