概述
本篇博客的主要内容是:
(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&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&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>
最后
以上就是健壮网络为你收集整理的MyBatis入门五:MyBatis基本使用三:MyBatisUtils工具类;以查询为例,演示mybatis的一个工作流程;一:MyBatisUtils工具类(提供SqlSessionFactory和SqlSession的工具方法)二:MyBatis数据查询(以数据查询为例,演示Mybatis的一个工作流程)的全部内容,希望文章能够帮你解决MyBatis入门五:MyBatis基本使用三:MyBatisUtils工具类;以查询为例,演示mybatis的一个工作流程;一:MyBatisUtils工具类(提供SqlSessionFactory和SqlSession的工具方法)二:MyBatis数据查询(以数据查询为例,演示Mybatis的一个工作流程)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复