我是靠谱客的博主 健壮网络,这篇文章主要介绍MyBatis入门五:MyBatis基本使用三:MyBatisUtils工具类;以查询为例,演示mybatis的一个工作流程;一:MyBatisUtils工具类(提供SqlSessionFactory和SqlSession的工具方法)二:MyBatis数据查询(以数据查询为例,演示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内容:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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实体类:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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:

复制代码
1
2
3
4
5
6
7
8
9
<?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语句

测试类中编写代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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内容:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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>

 

最后

以上就是健壮网络最近收集整理的关于MyBatis入门五:MyBatis基本使用三:MyBatisUtils工具类;以查询为例,演示mybatis的一个工作流程;一:MyBatisUtils工具类(提供SqlSessionFactory和SqlSession的工具方法)二:MyBatis数据查询(以数据查询为例,演示Mybatis的一个工作流程)的全部内容,更多相关MyBatis入门五:MyBatis基本使用三:MyBatisUtils工具类;以查询为例,演示mybatis内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部