1、第一章MyBatis入门
1.1框架
框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。对于程序员来说,框架是一套资源,其中包含Jar包、文档。
1.2Mybatis概述
1.3Mybatis体系结构
1.4Mybatis工作原理
1.5 第一个Mybatis程序
/01-primary-mybatis
实现将Student信息导入dao中
定义学生类
private String name成员变量 不叫属性 成员变量是私有的,而属性是对外公开的,二者不一定相等 get、set方法中的去掉类型并小写如name这是属性 成员变量是私有的,属性是可以通过set、get方法操作的
private Integer id;//定义成包装类型 以后可以作if(id == null)的判断,不是必须但是更方便
public class Student {
//成员变量 不叫属性 成员变量是私有的,而属性是对外公开的,二者不一定相等 get、set方法中的去掉类型并小写如
//name这是属性 成员变量是私有的,属性是可以通过set、get方法操作的
private Integer id;//定义成包装类型 以后可以作if(id == null)的判断,不是必须但是更方便
private String name;
private int age;
private double score;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age, double score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setScore(double score) {
this.score = score;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + "]";
}
}
定义Dao接口
public interface IStudentDao {
void insertStu(Student student);
}
定义Dao实现类
1、加载主配置文件
2、创建sqlSessionFactory对象
3、创建sqlSession对象
4、相关操作
5、sqlSession提交
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
//1、加载主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//2、创建sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3、创建sqlSession对象
sqlSession = sqlSessionFactory.openSession();
//4、相关操作
sqlSession.insert("insertStudent", student);
//5、sqlSession提交
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(sqlSession != null) {
sqlSession.close();//sqlSession 关闭了就不用回滚
}
}
}
}
定义映射文件
映射文件,简称为mapper,主要完成Dao层中SQL语句映射。名称随意,一般放在dao包中。
<?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="test">
<insert id="insertStudent" parameterType="com.bjpowernode.beans.Student">
insert into student(name,age,score) values(#{name}, #{age}, #{score})
<!-- 也放在dao包下,表示映射 -->
</insert>
</mapper>
定义主配置文件
<configuration>
<!-- 配置运行环境 -->
<environments default="mysqlEm">
<environment id="mysqlEm">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="333"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/bjpowernode/dao/mapper.xml"/>
</mappers>
</configuration>
1.6 多个映射文件
/02-primary-2
1)新添加一个映射文件
将原来的映射文件直接复制一份,粘贴到相同目录中,并重命名,然后,在主配置文件中对齐进行注册。
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/bjpowernode/dao/mapper.xml"/>
<mapper resource="com/bjpowernode/dao/mapper2.xml"/>
</mappers>
此时,再运行相同的测试,会报错。因为可以匹配上的相同的SQL映射id出现了两个,系统不知应该执行哪一个。
2)修改任意一个映射文件
可以修改任意一个映射文件标签的namespace属性,将两个不同映射文件中的SQL映射,归为不同的命名空间。
命名空间的作用是用于区分不同命名空间中的同名SQL映射的id。例如修改第二个mapper文件的命名空间为reyco。
<?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="reyco">
<insert id="inserts" parameterType="com.bjpowernode.beans.Student">
insert into student(name,age,score) values(#{name}, #{age}, #{score})
<!-- 也放在dao包下,表示映射 -->
</insert>
</mapper>
3)修改Dao实现类
或者是reyco.insert
一般所使用的SQL映射在这些命名空间中的id都是唯一的,可以直接使用id如insert或insertStudent,但还是建议用命名空间作为前缀这样使用。
1.7 使用工具类和属性文件
/03-primary-3
1)使用工具类
优于每次一执行SqlSession的方法,均需要先获取到该对象。而SqlSession对象的获取又比较繁琐,所以将获取SqlSession对象定义为一个工具类方法。
SqlSession对象是通过SqlSessionFactory对象创建的。由于SqlSessionFactory类为重量级对象,且为线程安全的,所以可以将SqlSessionFactory对象定义为单例的。
其他类不变
创建工具类
package com.bjpowernode.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
public static SqlSession getSqlSession() {
try {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
return sqlSessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
修改Dao接口的实现类
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
sqlSession = MyBatisUtils.getSqlSession();
sqlSession.insert("insertStudent", student);
sqlSession.commit();
} finally {
if(sqlSession != null) {
sqlSession.close();//sqlSession 关闭了就不用回滚
}
}
}
}
2)从属性文件中读取DB连接四要素
为了方便对数据库连接的管理,DB连接四要素数据一般都是存放在一个专门的属性文件中的。MyBatis主配置文件需要从这个属性文件中读取这些数据。
定义属性文件
/03-primary-3/src/jdbc_mysql.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.user=root
jdbc.password=333
修改主配置文件
第一,需要注册属性文件。
第二,需要从属性文件中通过key,将其value读取出来。
1.8主配置文件详解
1)注册DB连接四要素属性文件
2)指定实体类全限定性类名的别名
将指定包中所有类的简单类名当作其别名
<typeAliases>
<!-- <typeAlias type="com.bjpowernode.beans.Student" alias="Student"/> -->
<!-- 将指定包中所有类的简单类名当作其别名 -->
一般用这个<package name="com.bjpowernode.beans"/>
</typeAliases>
mapper映射文件可以修改为
parameterType="Studen"属性可以省略
<mapper namespace="test">
<!-- parameterType属性可以省略 -->
<insert id="insertStudent" parameterType="Student">
insert into student(name,age,score) values(#{name}, #{age}, #{score})
</insert>
</mapper>
3)配置MyBatis运行环境
A、标签
在中可以包含多个运行环境,但·其default属性指定了当前MyBatis运行时所选择使用的环境。
B、标签
指定了MyBatis所使用的事务管理器。
JDBC:使用JDBC的事务管理机制。通过Connection的commit()方法提交,通过rollback()方法回滚。但默认情况下,MyBatis将自动提交功能关闭了,改为手动提交。
C、标签
用于配置MyBatis使用的数据源类型与数据库连接基本属性。
POOLED:使用数据库连接池来维护连接。
从属性文件读取。
4)指定映射文件
API详解
见文档。