Mybatis框架
是一个半自动化的ORM框架,是一个持久层框架,用于Dao层的编写。 ORM框架:对象关系映射框架,将数据表中的记录和对象形成映射,表的结构和类形成映射,通过配置文件形成的映射关系(ORM映射文件) 全自动化的ORM框架(Hibernate),不写SQL语句,执行SQL语句都是有框架自动生成的。 当数据库操作比较简单(项目设计的SQL语句少量的复杂语句) 半自动化的ORM框架(Mybatis),需要程序员写SQL语句,查询语句的结果和对象形成映射 当项目有大量的复杂SQL语句,需要程序员对SQL调整优化Mybatis框架的使用
1.搭建框架
(1)mybatis的jar包导入工程的类库中
(2)在src下创建mybatis的主配置文件
将XML的验证文件(.dtd文件)和使用DTD验证URL绑定
1.主配置文件的验证
2.映射文件的验证
在eclipse中设置绑定关系:XML Catalog中配置
步骤:window->preference->搜索XML Catlog->User Specified Entries->add->Location从File System选取文件->Key type选择URI->Key粘贴.XML文件里面的mybatis的路径,主配置文件和映射文件需要分别进行绑定。
2.创建实体类和Mapper文件(映射文件)
1.创建Employee的映射类,暂且要求Employee类的属性名和Employee表的列名一致
2.创建Employee的映射文件(EmployeeMapper.xml)
3.每创建一个映射文件,一定要在主配置文件中声明该映射文件的位置,因为Java程序在读取主配置文件的同时就要把所有的映射文件读到内容中。
主配置文件:
<?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>
<!-- 配置数据库连接信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 映射文件定位 -->
<mappers>
<mapper resource="com/oracle/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
映射文件:
<?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="Employee">
<insert id = "insert" parameterType = "com.oracle.po.Employee">
insert into employee (employee_id,first_name,last_name,email,
phone_number,hire_date,job_id,salary,commission_pct,
manager_id,department_id)
values(default,#{first_name},#{last_name},#{email},
#{phone_number},#{hire_date},#{job_id},#{salary},
#{commission_pct},#{manager_id},#{dept.department_id})
</insert>
<update id = "update" parameterType = "com.oracle.po.Employee">
update employee set first_name=#{first_name},last_name=#{last_name},
email=#{email},phone_number=#{phone_number},hire_date=#{hire_date},
job_id=#{job_id},salary=#{salary},commission_pct=#{commission_pct},
manager_id=#{manager_id},department_id=#{dept.department_id}
where employee_id = #{employee_id}
</update>
<delete id = "delete" parameterType="int">
delete from employee where employee_id = #{id}
</delete>
<select id = "select" resultType = "com.oracle.po.Employee">
select employee_id,first_name,last_name,email,
phone_number,hire_date,job_id,salary,commission_pct,
manager_id,department_id
from employee
</select>
<select id = selectById resultType = "com.oracle.po.Employee" parameterType="int">
select employee_id,first_name,last_name,email,
phone_number,hire_date,job_id,salary,commission_pct,
manager_id,department_id
from employee
where employee_id = #{employee_id}
</select>
</mapper>
namespace是mapper元素的属性,意味命名空间,目的是找到当前mapper中配置的内容,通过命名空间+id查找
insert元素:文本部分编写insert语句
必写属性:
id属性:为这个SQL语句定义的id
parameterType属性:执行SQL语句时传入对象的类型
#{}表达式:
1.代表了预编译的 ’ ? ’
2.是一个取值的语句,如果传入的对象是一个Map,代表获得指定key的value值;如果传入的对象是一个实体对象,代表获得指定属性值;因此#{}中写的是对象的属性名或key名,#{}中还可以写对象名.属性名,代表后的对象的属性值,例子如下:
测试:
1.select元素
resultType:指定结果集数据填充到哪个类型的对象中,按照结果集列名和对象的属性名相同形成的自动映射调用API
public class Test {
public static void main(String [] args){
Employee e = new Employee();
e.setFirst_name("mybatis");
e.setPhone_number("15945687451 ");
e.setSalary(18000);
Departments d = new Departments();
d.setDepartment_id(5001);
e.setDept(d);
try {
//将主配置文件的内容读到一个io.reader中
Reader reader = Resources.getResourceAsReader("configuration.xml");
//使用mybatis的一个核心接口 SqlSessionFactory是SqlSession的工厂,生产SqlSession对象(封装了一个连接)
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
//创建SqlSession对象,使用mybatis的SqlSession核心接口
SqlSession sqlSession = factory.openSession();
//调用SqlSession的insert方法执行SQL语句
// sqlSession.insert("Employee.insert",e);
// e.setEmployee_id(3);
// e.setFirst_name("tom");
// sqlSession.update("Employee.update",e);
// sqlSession.delete("Employee.delete",3);
List<Employee> list = sqlSession.selectList("Employee.select");
for(Employee emp:list){
System.out.println(emp.getFirst_name());
}
sqlSession.commit();
//jdbc 和 mybatis区别
//insert插入语句
/*
* jdbc
* 1.加载驱动创建连接
* 2.编写SQL语句(预编译)
* 3.执行SQL语句
* 4.处理结果集
* 5.关闭连接
*/
/*
*mybatis
* 1.编写mapaer.xml(sql)
* 2.创建SqlSession对象
* 3.调用SqlSession对象的insert方法
* 4.关闭
*/
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
test步骤:
//将主配置文件的内容读到一个io.reader中
Reader reader = Resources.getResourceAsReader("configuration.xml");
//使用mybatis的一个核心接口 SqlSessionFactory是SqlSession的工厂,生产SqlSession对象(封装了一个连接)
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
//创建SqlSession对象,使用mybatis的SqlSession核心接口
SqlSession sqlSession = factory.openSession();
//调用SqlSession的insert方法执行SQL语句
sqlSession.insert("Employee.insert",e);
思考:在update元素中写insert语句可以吗?用sqlSession的update方法执行insert语句可以吗?
可以执行,但不标准
<insert><update>等XML的元素为了区分它们有什么属性
sqlSession中的insert()update()为了区分有什么参数和结果
Configuration配置
1.配置别名:typeAlias
<!-- 定义全类名的别名 -->
<typeAliases>
<typeAlias type= "com.oracle.po.Employee" alias="Employee"/>
</typeAliases>
配置别名后,在xxxMapper.XML文件中,
之前使用“com.oracle.po.Employee”这种全类名的地方都可以替换为Employee