什么是框架
- 框架:软件的半成品.未解决问题制定的一套约束,在提供功能基础上进行扩充.
- 框架中一些不能被封装的代码(变量),需要使用框架者新建一个xml 文件,在文件中添加变量内容.
- 需要建立特定位置和特定名称的配置文件.
- 需要使用 xml 解析技术和反射技术.
- 常用概念
- 类库:提供的类没有封装一定逻辑.
举例:类库就是名言警句,写作文时引入名言警句 - 框架:区别与类库,里面有一些约束.
举例:框架是填空题
- 类库:提供的类没有封装一定逻辑.
MyBatis 简介
- Mybatis 开源免费框架.原名叫iBatis,2010在googlecode,2013年迁移到 github
作用: 数据访问层框架
+ 底层是对 JDBC 的封装
mybatis 优点之一
+ 使用mybatis时不需要编写实现类,只需要写需要执行的sql命令
环境搭建
-
导入 jar
-
在 src下新建全局配置文件(编写 JDBC 四个变量) 建立在src下边是因为会转为classes文件,这样可以轻松通过classpath:找到它
- 没有名称和地址要求
- 在全局配置文件中引入 DTD 或 schema
- 如果导入dtd后没有提示,Window–>preference–>XML–>XMlcatalog–>add 按钮
- 全局配置文件内容
<?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>
<!-- default 引用 environment 的 id,当前所使用的环境 -->
<!-- 和spring整合后 environments配置将废除 -->
<environments default="default">
<!-- 声明可以使用的环境 -->
<!-- environments下边又有多个environment,可以有多个环境(测试,开发...),如需更改,直接更改default 的值即可 -->
<environment id="default">
<!-- 使用原生 JDBC 事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/buendia/mapper/FlowerMapper.xml"/>
</mappers>
</configuration>
- 新建以 mapper 结尾的包,在包下新建:实体类名+Mapper.xml
- 文件作用:编写需要执行的 SQL 命令
- 把 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">
<!-- namesapce:理解成实现类的全路径(包名+类名) -->
<mapper namespace="a.b" >
<!-- id:方法名
parameterType:定义参数类型
resultType:返回值类型
如果方法返回值是 list,在 resultType 中写 List 的泛型
因为 mybatis 对 jdbc 封装,一行一行读取数据 -->
<select id="selAll" resultType="com.bjsxt.pojo.Flower">
select * from flower
</select>
</mapper>
- 测试结果(只有在单独使用 mybatis 时使用,最后 ssm 整合时下面代码不需要编写)
main...
InputStream is = null;
SqlSession session = null;
try {
// 加载配置文件
is = Resources.getResourceAsStream("mybatis.xml");
// 使用了工厂设计模式(拿到工厂类),build设计模式
SqlSessionFactory factory =
new SqlSessionFactoryBuilder().build(is);
// 生产出Session
session = factory.openSession();
// 拿到查询结果,注意,参数为FlowerMapper.xml文件中的类全路径名
// +方法名(因为此方法就是用来执行查询的)
List<Flower> flowers =
session.selectList
("com.buendia.dao.impl.FlowerDaoImpl.selAll");
flowers.forEach(System.out::println);
....
环境搭建详解
- 全局配置文件中内容
- type 属性可取的值
- JDBC,事务管理使用 JDBC 原生事务管理方式(因为mybatis底层就是JDBC封装),不用spring时值为JDBC即可
- MANAGED 把事务管理转交给其他容器.原生 JDBC 事务setAutoMapping(false);如果type是这个值,我们就可以把事务管理交给spring处理
- 的type 属性(3个值)
- POOLED 使用数据库连接池
- UNPOOLED 不使用数据库连接池,和直接使用 JDBC 一样
- JNDI:java 命名目录接口技术(用java去调用其它技术)
- type 属性可取的值
数据库连接池
- 在内存中开辟一块空间,存放多个数据库连接对象
- JDBC Tomcat Pool:直接由 tomcat 产生数据库连接池(context文件)
- 图示
- active 状态:当前连接对象被应用程序使用中
- Idle 空闲状态:等待应用程序使用
- 使用数据库连接池的目的
- 在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率
- 小型项目不适用数据库连接池
- 实现 JDBCtomcatPool 的步骤
- 在 web 项目的 META-INF 中存放 context.xml,在 context.xml 编写数据库连接池相关属性
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ssm"
username="root"
password="smallming"
maxActive="50"
maxIdle="20"
name="test"
auth="Container"
maxWait="10000"
type="javax.sql.DataSource"
/>
</Context>
- 把项目发布到tomcat中,数据库连接池产生了
- 可以在 java 中使用 jndi 获取数据库连接池中对象
- Context:上下文接口.context.xml 文件对象类型
- 代码(主要):
...
//以下是JNDI代码
Context cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup("java:comp/env/test");
Connection conn = ds.getConnection();
...
- 当关闭连接对象时,把连接对象__归还__给数据库连接池,把状态改变成 Idle
三种查询方式
- selectList() 返回值为 List<resultType 属性控制>
- 适用于查询结果都需要遍历的需求
List<Flower> list = session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
- selectOne() 返回值 Object
- 适用于返回结果只是变量或一行数据时
int count = session.selectOne("a.b.selById");
System.out.println(count);
- selectMap() 返回值 Map
- 适用于需要在查询结果中通过某列的值取到这行数据的需求
- Map<key,resultType 控制>
Map<Object, Object> map = session.selectMap("a.b.c", "name123");
System.out.println(map);
要点
-
mybatis的autoMapping特性,查询时mybatis是怎么知道每一列怎么对应的?通过自动映射机制,根据setXxx(),自动找到数据库中对应的列(3.2之前版本),现在不写set,get方法也能找到(直接通过反射找属性)
因为是反射,所以实体属性名必须要和数据库列名相同(不同也可以,在mapper.xml中写查询语句时给不同的列加上别名) -
mybatis.xml全局配置文件中的mappers标签的mapper子标签中的resource属性值为路径,用"/“分割而不是”."
-
在上边的环境搭建部分-5中,通过Resource.getResourceAsStream(“mybatis.xml”);来加载全局配置文件(mybatis默认不自动加载配置文件), 其中默认从src下找
-
在数据访问层处理异常和在控制器中处理异常,而service中只抛出异常(spring原因),并且service实现类的异常还是要和实现的接口抛出的异常保持一致
不是"."
-
在上边的环境搭建部分-5中,通过Resource.getResourceAsStream(“mybatis.xml”);来加载全局配置文件(mybatis默认不自动加载配置文件), 其中默认从src下找
-
在数据访问层处理异常和在控制器中处理异常,而service中只抛出异常(spring原因),并且service实现类的异常还是要和实现的接口抛出的异常保持一致