Mybatis框架入门
1.什么是MyBatis框架
- MyBatis是一个ORM的数据库持久化框架;
- Mybatis底层还是原生的JDBC代码,对JDBC代码的封装;
关于ORM的实现思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
2.Mybatis的配置文件
mybatis-config.xml放到resources文件夹下
<?xml version="1.0" encoding="UTF-8" ?>
<!-- dtd约束 -->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 配置(根标签) -->
<configuration>
<!-- 获取到jdbc.properties中的数据(四大金刚) -->
<properties resource="jdbc.properties" />
<!--
environments:环境们(一般来说只连一个数据库)
default:默认使用哪一个环境(因为环境有可能有很多,所以需要一个默认的)
-->
<environments default="development">
<!--
environment:环境(每一个环境都可以连接一个数据库)
id:这个环境的唯一名称
-->
<environment id="development">
<!--
transaction(事务)Manager(管理):事务管理器
type="JDBC":事务管理器的类型
-->
<transactionManager type="JDBC" />
<!--
dataSource:数据源(连接池) mybatis自带连接池
连接池必配四大金刚(驱动,路径,用户名,密码)
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.dirver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 找到写sql的xml的位置 -->
<mapper resource="cn/itsource/domain/ProductMapper.xml" />
</mappers>
</configuration>
3.关于写SQL语句的mapper.xml文件的存放位置
这个xml文件的存放位置取决于在mybatis-config.xml【mybatis的核心配置文件】文件中,我们配置的位置:比如我们配置为
<!-- 找到写sql的xml的位置 -->
<mapper resource="cn/itsource/domain/ProductMapper.xml" />`
那么我们就要把这个xml文件放在对应的包cn/itsource/domain中(也就是和实体类放在一起) 为了测试,我把配置文件修改为
<!-- 找到写sql的xml的位置 -->
<mapper resource="ProductMapper.xml" />`
那么我们就必须把mapper,xml配置文件放在和mybatis-config.xml配置文件相同的目录下面。测试也是可以正常运行。
4.mapper.xml文件`
这个文件主要是完成sql语句的编写,然后通过命名空间和id被调用执行。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- dtd约束 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
mapper:映射(根标签)
namespace:命名空间(单独看是没有意义的)
-->
<mapper namespace="cn.itsource.domain.ProductMapper">
<!--
select:查询的sql写在这里面
id:这条sql在当前命名空间中的唯一名称
通过namespace+id找到这条sql : cn.itsource.domain.ProductMapper.findOne
parameterType:传过来的参数类型(这个参数可以不写)
resultType:返回值类型
返回类型必需写全限定名(才能确定唯一的类型)
-->
<select id="findOne" parameterType="long" resultType="cn.itsource.domain.Product">
select * from product where id = #{www}
</select>
</mapper>
5.执行sql语句
没用使用mapper映射器,只对dao层实现类的中的一个查询方法进行测试
@Override
public Product get(Long id) {
try {
/**
* 1.读取配置文件
* 在mybatis中已经为我们准备好了一个读取配置文件的工具类:Resources
* 它会默认到classpath下面的根目录去获取相应的配置文件
*/
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
/**
* mybatis使用了构造者模式和工厂模式
* SqlSessionFactory(工厂)Builder(构造者)
* 2.获取到SqlSessionFactory对象:就是用于创建/获取SqlSession
* 现在可以先把它看成是一个连接池
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
/**
* 3.获取SqlSession对象(当前连接对象)
*/
SqlSession session = factory.openSession();
/**
* 4.操作数据库
* 第一个参数(查询sql的路径):命名空间+id
* 第二个参数:传的参数
*/
Product product = session.selectOne("cn.itsource.domain.ProductMapper.findOne",id);
return product;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
上面这种方式操作比较繁琐,写完接口还要写实现类。MyBatis基于动态代理机制,让我们无需再编写Dao的实现:
1.传统Dao接口,现在名称统一以Mapper结尾:例如:IUserDao --> UserMapper
2.还有我们映射器配置文件要和映射器在同一个包: (1)包:cn.itsource.mapper中(ProductMapper接口 和 ProductMapper.xml) ProductMapper.xml中namespace直接写ProductMapper接口的的完全限定名,sql语句的id对应ProductMapper接口中的方法名(如下图所示)
工具类
public enum MyBatisUtil {
INSTANCE;
private static SqlSessionFactory build;
static{
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
build = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public SqlSession openSession() {
return build.openSession();
}
}
mapper映射器完成sql使用
public void get() {//查询不需要提交事务,删除添加修改需要提交事务session.commit();
SqlSession session = null;
try {
session = MyBatiesUtil.INSTANCE.opensqlSession();
ProductMapper mapper = session.getMapper(ProductMapper.class);
Product selectOne = mapper.selectOne(2L);
System.err.println(selectOne);
} catch (Exception e) {
e.printStackTrace();
}finally {
session.close();
}
}