mybatis大体流程
一、各路径存放内容
lib文件夹下放jar包
config下放核心配置文件,核心配置文件加载数据来源配置和映射mapper文件,typeAliases用来定义别名(可用package批量定义)
mappers标签内可配置批量扫描mapper映射文件
使用批量扫描,需要满足两个条件
1:mapper文件必须和mapper接口的文件名一致
2:mapper文件必须和mapper接口在同一个包路径下
model层 写具体的类,如用户的类,内部写私有属性+getset方法
until内放置工具类,mybatis中放置构建会话工厂(作用是把重复的操作拿出来)返回factory
dao层放 用于构建基础类对象的mapper接口和相应的mapper映射的xml文件(内部为具体sql)
注意:如在核心配置文件中使用mapper标签批量扫描,则保持
1:mapper文件必须和mapper接口的文件名一致
2:mapper文件必须和mapper接口在同一个包路径下
service层定义包含于dao层mapper接口内同名的抽象方法,如findUserById这种。
impl 内放置包含实现service层定义接口方法的类。内部
SqlSession session = MybatisUtil.getFactory().openSession();
UserDao daili = session.getMapper(UserDao.class);
return daili.findUserByUsernameAndPassword(user);
使用util下的类的静态方法取得factory,然后得到session,再使用代理模式构建dao层类的对象
最后调用构建的dao层类对象的抽象方法。
**此处mybatis底层还是使用原始的方法如下
session.selectOne("dao.UserDao.findUserById", id)
(具体应该是通过mapper映射xml文件内的sql语句的id(名字)构建出方法?)
test 下用来测试
可用@Test进行单元测试
二、执行流程
1.当在test中测试时,创建serviceImpl对象,创建完成后调用内部实现具体功能的方法(增删改查),
2.此方法内部
SqlSession session=MybatisUtil.getFactory().openSession();
通过在util下的MybatisUtil工具类运行其内部的静态方法(即获取输入流的核心配置文件,核心配置文件内配置加载数据源、mapper映射xml文件及采用别名的操作)
接着构建factory对象,提供getFactory()方法
util主要就是获取配置并将重复操作分离出来(创建会话连接)
3。实现方法通过代理模式构建,然后返回在dao层构建的同名方法
UserDao daili = session.getMapper(UserDao.class);
return daili.findUserByUsernameAndPassword(user);
主要是将代码分层,降耦合
三、关于mapper映射文件的配置
1。普通pojo类的映射配置
一个类可以对应数据库中的一张表,比如用户表,订单表。
如 <select id="findUserByUsernameAndPassword" parameterType="user" resultMap="userMap">
select * from user where username =#{username} and password =#{password}
</select>
<resultMap type="user" id="userMap">
<id property="userId" column="user_id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
<result property="password" column="password"/>
</resultMap>
*基本pojo类及对应的映射配置文件及同名的dao层接口可以使用逆向工程自动生成
用该project : generatorSqlmapCustom 生成,简单配置数据源及要生成的表
2。一对一关系映射
一对一指的是表中一一对应的数据,比如一个用户对应一个订单号,用association标签,可以新建pojo类,放置包含所有要查的字段的属性
<select id="findOrdersAndUser" resultMap="ordersMap">
select * from orders,user
where orders.user_id=user.user_id
</select>
<resultMap type="orders" id="ordersMap">
<id property="ordersId" column="orders_id"/>
<result property="count" column="count"/>
<result property="status" column="status"/>
<!-- 使用association 标签将查询结果集剩余字段封装映射到关联的pojo中 -->
<association property="user" javaType="user">
<id property="userId" column="user_id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
<result property="password" column="password"/>
</association>
</resultMap>
3.一对多映射
比如查一个用户对应多个订单,用collection标签,在pojo类中声明一个list,放置查询出来的订单,list内部类型为order类
<select id="findUserAndOrders" resultMap="userOrdersMap">
select * from user left join orders on user.user_id=orders.user_id
</select>
<resultMap type="user" id="userOrdersMap">
<id property="userId" column="user_id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
<result property="password" column="password"/>
<!-- collection 标签用于进行一对多的高级映射,将关联的多条记录映射到pojo的list中 -->
<collection property="orderList" ofType="orders">
<id property="ordersId" column="orders_id"/>
<result property="count" column="count"/>
<result property="status" column="status"/>
</collection>
</resultMap>