一、Mybatis框架入门
1.1 SSM开发框架
软件架构: Spring -> Spring MVC -> Mybatis
- Mybatis是优秀的持久层框架
- Mybatis使用XML将SQL与程序解耦、便于维护
- Mybatis学习简单,执行高效,是JDBC的延伸
1.1.1 部分知识点
-
一个项目有两个包构成:main +resource
-
main(代码包) -> java -> com.名字 ->entity / mapper /service /controller
-
书写顺序:entity - > mapper -> service ->controller
-
main -> java -> entity:用来放实体类的包(mybatisX自动生成)
-
main -> java -> mapper:用来放mapper接口 定义方法 命名格式:*Mapper 接口格式:返回值类型 方法名(需要值类型 需要值名);
-
main -> java -> service:逻辑层
-
resource(配置包)->com.名字.mapper(尽量与java包中的格式对上) -> *Mapper.xml
-
resource是用来放xml的 xml是用来与数据库进行交流的 也就意味着里里面会有sql语句
-
*Mapper.xml里有namespace 和 sql语句 (一般还会有数据库中的下划线转驼峰命名)
-
xml里的namespace是用来映射mapper全路径的(这个mapper是指的Java包的mapper) (一般mabitis也会一键完成)
-
例如:UserMapper.xml
-
xml里的sql语句包括
<mapper namespace = "com.名字.mapper.UserMapper"></mapper>
(1)resultMap标签
-
作用:该标签的作用是将查询到的结果,存入到指定的实体类中
-
属性:
- id (用来唯一标识该 resultMap 的 一般是BaseResultMap)
- type (标识要存入的实体类的绝对路径,也就是其所在包的全路径)
-
resultMap 标签内部可以使用 result 标签来指定将查询结果中某一列的值存入到对应实体中的指定变量中
-
column 属性表示数据库表中的字段名
-
property 属性表示对应实体中的变量名
-
jdbcType 属性表示该字段在数据库表中的数据类型
-
<resultMap id="BaseResultMap" type="com.duanxingyu.entity.Article">
<id property="AId" column="a_id" jdbcType="INTEGER"/>
<result property="CId" column="c_id" jdbcType="INTEGER"/>
<result property="ATitle" column="a_title" jdbcType="VARCHAR"/>
<result property="ADesc" column="a_desc" jdbcType="VARCHAR"/>
<result property="APublishtime" column="a_publishtime" jdbcType="TIMESTAMP"/>
<result property="UId" column="u_id" jdbcType="INTEGER"/>
</resultMap>
(2)select标签
-
作用:在sql语句中用来查询
-
属性:
- id (在java包里的mapper写的接口名字 表示该xml被哪个mapper里的哪个接口方法调用)
- resultType (语句返回值类型的整类名 就是写与那么实体类相关 会调用哪个实体类的数据类型)
- resultMap属性来指定通过
<resultMap>
标签定义的返回值类型
<select id="selectUserByUsername" resultType="com.duanxingyu.entity.User">
select * from t_user where username = #{username}
</select>
(3)insert标签
-
作用:在sql语句中用来查询
-
属性:
-
id (在java包里的mapper写的接口名字 表示该xml被哪个mapper里的哪个接口方法调用)
-
parameterType (传给此语句的参数的完整类名或别名) 增删改只有parameterType
注意:resultType和parameterType的区别
1.使用resultType :主要针对于从数据库中提取相应的数据出来
2、使用parameterType :主要针对于将信息存入到数据库中 如:insert 增加数据到数据库
-
<insert id="insertStudentAutoKey" parameterType="StudentEntity">
INSERT INTO STUDENT_TBL (STUDENT_ID,
STUDENT_NAME,
STUDENT_SEX,
STUDENT_BIRTHDAY,
CLASS_ID)
VALUES (#{studentID},
#{studentName},
#{studentSex},
#{studentBirthday},
#{classEntity.classID})
</insert>
(4)update标签
-
作用:在sql语句中表示修改
-
属性
-
id (在java包里的mapper写的接口名字 表示该xml被哪个mapper里的哪个接口方法调用)
-
parameterType (传给此语句的参数的完整类名或别名) 增删改只有parameterType
-
-
update sql语句:update (修改的表名称) set (修改字段名称)= (修改值),… where (修改条件)
<update id="updateStudent" parameterType="StudentEntity">
UPDATE STUDENT_TBL
SET STUDENT_TBL.STUDENT_NAME = #{studentName},
STUDENT_TBL.STUDENT_SEX = #{studentSex},
STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},
STUDENT_TBL.CLASS_ID = #{classEntity.classID}
WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
</update>
(5)delete标签
-
作用:在sql语句中表示删除
-
属性
- id (在java包里的mapper写的接口名字 表示该xml被哪个mapper里的哪个接口方法调用)
- parameterType (传给此语句的参数的完整类名或别名) 增删改只有parameterType
<delete id="deleteStudent" parameterType="StudentEntity">
DELETE FROM STUDENT_TBL WHERE STUDENT_ID = #{studentID}
</delete>
1.2 Mybatis开发流程
- 引入Mybatis依赖
- 创建核心配置文件(基于XML)
- 创建实体类(entity)
- 创建mapper映射文件
- 初始化SessionFactory(读取配置文件、加载mapper映射)
- 利用Sqlsession对象操作数据
1.3 Mybatis环境配置
1.3.1 mybatis-config.xml
- 采用XML格式配置数据库环境信息
- 环境配置标签
- environment包括数据库驱动、url、用户名和密码
<?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是设置默认指向数据库 即在多个数据库的情况下 可依据default来切换数据库-->
<environments default="development">
<!-- id表示独特名称 便于default识别多个具体的数据库-->
<environment id="development">
<!-- 采用JDBC方式对数据库事务进行管理-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
1.3.2 sqlSessionFactory
- Mybatis的核心对象
- 用于初始化Mybatis,创建Sqlsession对象
- 保证SqlSessionFactory在应用中全局唯一
1.3.2.1 sqlsession
- Mybatis操作数据库的核心对象
- 使用JDBC方式与数据库交互
- SqlSession对象提供了数据库CRUD对应方法
test.java
public class MybatisTester {
@Test
public void testSqlSessionFactory() throws IOException {
// 利用Reader加载classpath下的mybatis—config.xml核心配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
// 初始化SqlSessionFactory对象,同时解析mybatis-config.xml文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
System.out.println("SqlSession加载成功");
SqlSession sqlSession = null;
try {
// 创建一个sqlsession对象,sqlsession是JDBC的扩展类 用于与数据库交互
sqlSession = sqlSessionFactory.openSession();
// 创建数据库连接(测试使用)
Connection connection = sqlSession.getConnection();
System.out.println(connection);
}catch (Exception e){
e.printStackTrace();
}finally {
if (sqlSession != null){
// 如果type="POOLED",代表使用连接池,close则是将连接回收到连接池中
// 如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关闭连接
sqlSession.close();
}
}
}
1.3.3 初始化工具类MybatisUtils
mybatisUtils.java:
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 java.io.IOException;
import java.io.Reader;
/**
* MybatisUtils工具类 创建全局唯一的SqlSessionFactory对象
*/
public class MybatisUtils {
// 利用static(静态)属于类不属于对象 且全局唯一
private static SqlSessionFactory sqlSessionFactory = null;
// 利用静态块在初始化类时实例化sqlSessionFactory
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
// 初始化错误时,通过抛出异常ExceptionInInitializerError通知调用者
throw new ExceptionInInitializerError(e);
}
}
/**
* openSession 创建一个新的Sqlsession对象
* @return SqlSession对象
*/
public static SqlSession openSession(){
// 默认SqlSession对自动提交事务数据(commit)
// 设置faluse代表关闭自动提交,改为手动提交事务数据
return sqlSessionFactory.openSession(false);
}
/**
* 释放一个有效的SqlSession对象
* @param session 准备释放一个SqlSession对象
*/
public static void closeSession(SqlSession session){
if (session != null){
session.close();
}
}
}
test方法
// 利用工具类MybatisUtils
@Test
public void testMybatisUtils() throws Exception{
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtils.openSession();
Connection connection = sqlSession.getConnection();
System.out.println(connection);
}catch (Exception e){
throw e;
}finally {
MybatisUtils.closeSession(sqlSession);
}
}
}