1. MyBatis简介
极大的简化SQL操作、仅通过配置即可以获取数据库数据 — 持久层框架
作用:将实体Bean类、SQL语句建立映射关系、半自动化的ORM实现
数据持久层框架(ORM - Object Relation Mapping)
- Bean类名 ← 表名
- Bean对象 ← 表的行记录
- Bean的属性 ← 表的列名
2. 简单代码示例
Dao层执行映射文件的SQL语句的方式:
- SqlSession.select/insert/update/delete(“mapper.namespace + SQL.id”, 参数 )
步骤
- 导入MyBatis、数据库驱动jar包
- 编写配置文件:主配置文件以及映射文件
- 代码使用
- SqlSessionFactoryBuilder – 读取配置文件
- SqlSessionFactory – 类似连接池
- SqlSession – 类似Connection、但不是Connection
1. jdbc.properties - 数据库连接文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
2. MyBatis主配置文件、以及SQL映射文件
mybatis.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>
<!-- 加载数据库连接配置文件 -->
<properties resource="jdbc.properties"></properties>
<!-- MyBatis读取数据库配置文件、进行数据库连接的管理 -->
<environments default="development">
<environment id="development">
<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>
<!-- SQL映射文件 -->
<mappers>
<mapper resource="empMapper.xml" />
<mapper resource="deptMapper.xml" />
</mappers>
</configuration>
empMapper.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="top.linruchang.dao.EmpMapper">
<select id="queryById" parameterType="Integer" resultType="top.linruchang.domain.Emp" >
select * from Emp where empno = #{id}
</select>
<select id="queryAll" resultType="top.linruchang.domain.Emp" >
select * from Emp
</select>
<update id="updateEname" parameterType="top.linruchang.domain.Emp" >
update emp set ename=#{ename} where empno=#{empno};
</update>
<delete id="deleteEmp" parameterType="top.linruchang.domain.Emp">
delete from emp where empno=#{empno}
</delete>
<insert id="addEmp" parameterType="top.linruchang.domain.Emp">
insert into emp(empno, ename, salary) values(#{empno}, #{ename}, #{salary});
</insert>
</mapper>
3. Emp - Bean类
package top.linruchang.domain;
public class Emp {
Integer empno;
String ename;
Integer salary;
public Emp(Integer empno, String ename, Integer salary) {
super();
this.empno = empno;
this.ename = ename;
this.salary = salary;
}
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Integer getSalary() {
return salary;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", salary=" + salary + "]";
}
}
4. EmpDao - 数据访问层
package top.linruchang.dao;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import top.linruchang.domain.Emp;
public class EmpDao {
@Test
public void test() {
EmpDao empDao = new EmpDao();
Emp emp = empDao.query(1);
System.out.println(emp);
// ---------------------------------
// List<Emp> emps = empDao.queryAll();
//
// System.out.println(emps);
// ------------------------------------
// Emp emp = new Emp(1, "lrc5", 3000);
//
// Integer result = empDao.updateName(emp);
//
// System.out.println(result);
// -------------------------------
// Emp emp = new Emp(2, "", 0);
//
// Integer result = empDao.delete(emp);
//
// System.out.println(result);
// ---------------------------------
// Emp emp = new Emp(3, "lcj", 3000);
//
// Integer result = empDao.add(emp);
//
// System.out.println(result);
}
private static SqlSessionFactory ssf;
static {
InputStream is = EmpDao.class.getClassLoader().getResourceAsStream("mybatis.xml");
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
ssf = ssfb.build(is);
}
public Emp query(Integer empno) {
SqlSession ss = ssf.openSession();
Object emp = ss.selectOne("top.linruchang.dao.EmpMapper.queryById", 1);
return (Emp) emp;
}
public List<Emp> queryAll() {
SqlSession ss = ssf.openSession();
List<Emp> selectList = ss.selectList("top.linruchang.dao.EmpMapper.queryAll");
return selectList;
}
public Integer updateName(Emp emp) {
SqlSession ss = ssf.openSession(true);
Integer result = ss.update("top.linruchang.dao.EmpMapper.updateEname", emp);
return result;
}
public Integer delete(Emp emp) {
SqlSession ss = ssf.openSession(true);
Integer result = ss.delete("top.linruchang.dao.EmpMapper.deleteEmp", emp);
return result;
}
public Integer add(Emp emp) {
SqlSession ss = ssf.openSession(true);
Integer result = ss.insert("top.linruchang.dao.EmpMapper.addEmp", emp);
return result;
}
}
3. MyBatis架构图
MyBatis三层图
MyBatis执行流程
恰恰MyBatis帮我们完成了最烦人的3、4、5步骤,所以这个框架很强大
4. MyBatis的配置文件
4.1 主配置文件
重点:内的子节点有顺序要求
4.2 映射文件
4.3 #{} 与 ${}的区别