源码位置:https://gitee.com/fenglifengli/mybatisDemo.git
一、什么是MyBatis
ORM(Object/Relational Mapping ,即对象关系映射),描述的是Java对象和数据库表之间映射关系。
当前的ORM框架很多,如Mybatis,Hibernate。他们的区别如下:
- Hibernate是全表映射,只有定义好类和表之间的映射关系之后,开发人员就可以放心使用了,并不需要开发人员熟练掌握Sql语句的编写。缺点就是多表关联时,比较麻烦,不支持存储过程。
- Mybatis是半自动映射的框架。需要手动匹配提供 POJO SOL 和映射关系,灵活。可以通过配置决定 SOL
的映射规则,它还支持存储过程等,还支持优化SQL。
二、MyBatis的工作原理
三、入门程序
项目目录结构:
mybatis-config.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>
<!--1.配置环境,默认的环境的id为mysql -->
<environments default="mysql">
<environment id="mysql">
<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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 2. 配置mapper的位置-->
<mappers>
<mapper resource="mapper/CustomerMapper.xml"/>
</mappers>
</configuration>
映射文件,注意namespace
。
<?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="mapper.CustomerMapper">
<!--根据客户编号获取客户信息-->
<select id="findCustomerById" parameterType="Integer"
resultType="com.fengli.po.Customer">
select *
from t_customer
where id = #{id}
</select>
</mapper>
测试代码:
private SqlSession getSession (){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
return session;
}
@Test
public void findCustomerByldTest(){
SqlSession session=getSession();
Customer customer= session.selectOne("mapper.CustomerMapper.findCustomerById", 1);//注意这里的第一个参数要和你在mapper文件中定义的namespace一样。
System.out.println(customer);
}
对于命名空间的说明:
命名空间形式和使用完全限定名调用 Java 对象的方法是相似的。因为这样命名可以直接映射到在命名空间中同名的 Mapper 类,并将已映射的 select 语句中的名字、参数和返回类型匹配成方法
至于增、删、改、查,原理都一样。