关于ORM
ORM(对象关系映射,为了解决面向对象与关系数据库存在的互不匹配的现象的技术).
JPA就是一个ORM的规范,hibernate就是他的实现。
完成ORM,在市面上的框架:
hibernate(完整的ORM框架)、mybatis(半完整的ORM实现框架)
MyBatis也是一个ORM的框架,所以很多设计上和JPA是一样的。
hibernate和MyBatis都是ORM的关系映射
为什么不用原生的JDBC?
1、开发效率低,运行效率不高
2、不好修改
hibernate和Mybatis的区别:
hibernate的最大优点:开发速度快,是所有ORM里面最快的。但是它的运行速度比较慢,因为SQL我们无法控制,是它自己生成的,它为了能够兼容各种数据库,各种情况,无法选择最优方案。上手麻烦,学完之后就快了。
MyBatis:开发速度慢,但是比原生JDBC高,比hibernate慢,运行速度快,和原生JDBC差不多,因为是自己写的SQL。另外,MyBatis上手简单,学起来快。Mybatis有一个专门的代码生成器。
另外,Mybatis不能像JPA一样自动创建表。
使用Mybatis
创建一个普通的java项目
导入MyBatis需要的包:
新建一个lib文件夹,将核心包放进去,然后再导入资料里面的lib文件夹里面的依赖包。导入数据库驱动包,这里我们导入的是MySQL数据库驱动包。
所有操作数据库的框架,底层都是JDBC(java操作数据库的唯一技术,它只是一个规范,它的实现是由各大数据库厂商来实现),所以都必须要导入数据库驱动包。
创建一张表
新建一个包cn.itsource.domain
然后通过数据库来生成domain
domain
private Long id;
private String productName;
private Double salePrice;
private String supplier;
private String brand;
private Double cutoff;
private Double costPrice;
private Long dir_id;
建一个resources文件夹,改为资源文件夹类型,创建mybatis-config.xml文件
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<!--这里不能用<transactionManager type="JDBC"/>这种方法,会报错,以后都不要用的好,以防万一-->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/cxm/domain/ProductMapper.xml"/>
</mappers>
</configuration>
我们以后开发肯定要用数据库:生产环境、测试环境。
environment:一个环境就代表我们一个数据库的连接信息
transactionManager 的type为JDBC
下面的配置连接池:type:POOLED
然后创建一个jdbc.properties 文件
里面配置驱动器、路径、数据库用户名,密码:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=123456
写好了以后记得在mybatis-config.xml里面引入:
<properties resource="jdbc.properties"/>
...
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
映射SQL文件
SQL写在xml里面
创建一个ProductMapper.xml
意思是针对于Product.java这个文件的数据库映射文件。
namespace:命名空间
命名空间是什么?有什么作用?
以后我们会写很多的SQL,java代码需要精确的找到某一条SQL,怎么找到呢?就是通过命名空间,加上select的id,这个id很有可能就是一个方法名。
怎样才能保证命名空间绝对不重复呢?通过全限定名来给命名空间命名。
以后针对不同的增删改查操作,选择不同的标签
关于里面的参数类型(parameterType),可以写全限定名,也可以简写,long:映射关系表示Long;_long:表示long。
resultType:返回的每一条数据的结果类型。
写的是domain的全限定名。
在mybatis-config.xml里面读入,写在环境配置下面,mapper resource里面写的是映射SQL文件的路径
ProductMapper.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="cn.cxm.domain.ProductMapper">
<!--下面的id是这条SQL语句的唯一名称-->
<select id="findOne" parameterType="long" resultType="cn.cxm.domain.Product">
select * from Product where id = #{id}
</select>
</mapper>
在mybatis-config.xml里面引用
<mappers>
<mapper resource="cn/cxm/domain/ProductMapper.xml"/>
</mappers>
</configuration>
创建一个test包
测试代码步骤:
1、读取核心配置文件
2、创建SQLSessionFactory对象
3、创建SQLSession对象(可以做CRUD的对象)
4、完成相应的查询
public class TestMybatis {
@Test
public void myTest() throws Exception{
// 第一步读取核心配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
// 创建核心对象
SqlSession sqlSession = factory.openSession();
Product product = sqlSession.selectOne("cn.cxm.domain.ProductMapper.findOne", 1L);
System.out.println(product);
sqlSession.close();
}
}