A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2018-4-6 13:47 编辑

【郑州校区】MyBatis的第二天框架课程(下)

1 关联查询
1.1 商品订单数据模型



1.2 一对一查询
案例:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
1.2.1 方法一:
使用与resultType,但定义订单信息PO类,此PO类中包括了订单信息和用户信息:
1.2.1.1 S ql语句:
选择
  命令。*
  user.username,
  用户SS。地址
  命令,
  用户
WHERE orders.user_id = user.id
1.2.1.2 定义婆类
P o类中应该包括上边的sql查询出来的所有字段,如下:
公共 OrdersCustom 扩展订单{
        私人字符串用户名; //用户名称
        私人字符串地址; //用户地址
获取/设置....
OrdersCustom类继承订单类后OrdersCustom类包括了订单类的所有字段,只需要定义用户的信息字段即可。
1.2.1.3 M apper.xml
<! - 查询所有订单信息 - >
        <select id = “findOrdersList” resultType = “cn.itcast.mybatis.po.Order sCustom >
        选择
        命令。*,
        user.username,
        user.address
        从
        订单,用户
        WHERE orders.user_id = user.id
        </选择>
1.2.1.4 M apper接口:
public List < Order sCustom > findOrdersList()throws Exception;
1.2.1.5 测试:
公共无效 testfindOrdersList()抛出异常{
                //获取会话
                SqlSession session = sqlSessionFactory.openSession();
                //获限映射接口实例
                UserMapper userMapper = session.getMapper(UserMapper。);
                //查询订单信息
                List < Order sCustom > list = userMapper.findOrdersList();
                系统。out .println(list);
                //关闭会话
                session.close();
        }
1.2.1.6 结:
        定义专门的PO类作为输出类型,其中定义了SQL查询结果集所有的字段。此方法较为简单,企业中使用普遍。
1.2.2 方法二:
使用结果映射,定义专门的结果映射用于映射一对一查询结果。
1.2.2.1 S ql语句:
选择
  命令。*,
  user.username,
  user.address
  命令,
  用户
WHERE orders.user_id = user.id
1.2.2.2 定义婆类
        在订单类中加入用户属性,用户属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个用户对象存储关联查询的用户信息。
1.2.2.3 M apper.xml
<! - 查询订单关联用户信息使用resultmap - >
        < resultMap type = “Orders” id = “orderUserResultMap” >
                < id column = “id” property = “id” />
                < result column = “user_id” property = “userId” />
                < result column = “number” property = “number” />
                < result column = “createtime” property = “createtime” />
                < result column = “note” property = “note” />
                <! - 一对一关联映射 - >
                <! -  
                属性:订单对象的用户属性
                javaType:用户属性对应的类型
                  - >
                < association property = “user” javaType = “cn.itcast.po.User” >
                        <! -  column:user表的主键对应的列属性:user对象中的id属性 - >
                        < id column = “user_id” property = “id” />
                        < result column = “username” property = “username” />
                        < 结果= “地址”属性= “地址” />
                </ association >
        </ resultMap >
        <select id = “findOrdersWithUserResultMap” resultMap = orderUserResultMap >
                选择
                        o.id,
                        o.user_id,
                        o.number,
                        o.createtime,
                        o.note,
                        u.username,
                        u.address
                从
                        订单o
                在u.id = o.user_id上加入`用户'
        </选择>
这里resultMap指定orderUserResultMap
一个ssociation 表示进行关联查询单条记录
property 表示关联查询的结果存储在cn.itcast.mybatis.po.Orders 的用户属性中
javaType 表示关联查询的结果类型
< id property = “id” column = “user_id” /> 查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。
< result property = “username” column = “username” /> 查询结果的用户名列对应关联对象的用户名属性。
1.2.2.4 M apper接口:
public List <Orders> findOrdersListResultMap()throws Exception;
1.2.2.5 测试:
公共无效 testfindOrdersListResultMap()抛出异常{
                //获取会话
                SqlSession session = sqlSessionFactory.openSession();
                //获限映射接口实例
                UserMapper userMapper = session.getMapper(UserMapper。);
                //查询订单信息
                List <Orders> list = userMapper.findOrdersList2();
                系统。out .println(list);
                //关闭会话
                session.close();
        }
1.2.2.6 小结:
使用一个ssociation完成关联查询,将关联查询信息映射到POJO对象中。
1.3 一对多查询
案例:所有查询用户信息及用户关联的订单信息
信息用户状语从句:订单信息为一对多关系。
使用结果映射实现如下:
1.3.1 S ql语句:
选择
        u。*,o.id oid,
        o.number,
        o.createtime,
        o.note
        `用户`你
LEFT JOIN订单o开启u.id = o.user_id
1.3.2 定义婆类
用户类中加入列表<Order s > orders 属性
1.3.3 M apper.xml
< resultMap type = “user” id = “userOrderResultMap” >
                <! - 用户信息映射 - >
                < id property = “id” column = “id” />
                < result property = “username” column = “username” />
                < result property = “birthday” column = “birthday” />
                < result property = “sex” column = “sex” />
                < result property = “address” column = “address” />
                <! - 一对多关联映射 - >
                < collection property = “orders” ofType = “orders” >
                        < id property = “id” column = “oid” />         
                      <! - 用户ID已经在用户对象中存在,此处可以不设置 - >
                        <! -  <result property =“userId”column =“id”/>  - >
                        < result property = “number” column = “number” />
                        < result property = “createtime” column = “createtime” />
                        < result property = “note” column = “note” />
                </ collection >
        </ resultMap >
        < select id = “getUserOrderList” resultMap = “userOrderResultMap” >
                选择
                u。*,o.id oid
                o.number,
                o.createtime,
                o.note
                
                `用户`你
                LEFT JOIN订单o开启u.id = o.user_id
        </ select >
        
Ç ollection部分定义了用户关联的订单信息。表示关联查询结果集
property = “orders” 关联查询的结果集存储在用户对象的上哪个属性中。
ofType = orders 指定关联查询的结果集中的对象类型即列出中的对象类型。此处可以使用别名,也可以使用全限定名。
<id />及<result />的意义同一对一查询。
1.3.4 M apper接口:
List <User> getUserOrderList();
1.3.5 测试
@测试
        public void getUserOrderList (){
                SqlSession session = sqlSessionFactory .openSession();
                UserMapper userMapper = 会话.getMapper(UserMapper。);
                列表<User> result = userMapper .getUserOrderList();
                for(User user result ){
                        系统。out .println(user );
                }
                session .close();
        }
2 Mybatis整合弹簧 2.1 整合思路
1,SqlSessionFactory对象应该放到spring容器中作为单例存在。
2,传统刀的开发方式中,应该从弹簧容器中获得的SqlSession对象。
3,Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
如图4所示,数据库的连接以及数据库连接池事务管理都交给弹簧容器来完成。
2.2 整合需要的JAR包
1,春天的jar包
2,Mybatis的jar包
3,Spring + mybatis的整合包。
4,Mysql的数据库驱动jar包。
5,数据库连接池的罐子包。
2.3 整合的步骤
第一步:创建一个Java的工程。
第二步:导入罐包(上面提到的罐包)
第三步:MyBatis的的配置文件sqlmapConfig.xml
第四步:编写春天的配置文件
如图1所示,数据库连接及连接池
2,事务管理(暂时可以不配置)
3,SqlSessionFactory中对象,配置到弹簧容器中
4,mapeer代理对象或者是DAO实现类配置到弹簧容器中。
第五步:编写DAO或者映射文件
第六步:测试。
2.3.1 SqlMapConfig.xml
<?xml version = “1.0” encoding = “UTF-8”?>
<!DOCTYPE 配置
PUBLIC “ -  // mybatis.org //DTD Config 3.0 // EN”
< 配置>
        < typeAliases >
                < package name = “cn.itcast.mybatis.pojo” />
        </ typeAliases >
        < mappers >
                < mapper resource = “sqlmap / User.xml” />
        </ mappers >
</ configuration >
2.3.2 applicationContext.xml
<?xml version = “1.0” encoding = “UTF-8”?>
        xmlns:context = http://www.springframework.org/schema/context xmlns:p = http://www.springframework.org/schema/p
        xmlns:aop = http://www.springframework.org/schema/aop xmlns:tx = http://www.springframework.org/schema/tx
        xmlns:xsi = http://www.w3.org/2001/XMLSchema-instance
        http://www.springframework.org/schema/context http://www.springframework.org/s ... ing-context-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd >
        <! - 加载配置文件 - >
        < context:property-placeholder location = “classpath:db.properties” />
        <! - 数据库连接池 - >
        < bean id = “dataSource” class = “org.apache.commons.dbcp.BasicDataSource”
                destroy-method = “close” >
                < property name = “driverClassName” value = “$ {jdbc.driver}” />
                < property name = “url” value = “$ {jdbc.url}” />
                < property name = “username” value = “$ {jdbc.username}” />
                < property name = “password” value = “$ {jdbc.password}” />
                < property name = “maxActive” value = “10” />
                < property name = “maxIdle” value = “5” />
        </ bean >
        <! - mapper配置 - >
        <! -让弹簧管理SqlSessionFactory中使用的MyBatis和弹簧整合包中的- >
        < bean id = “sqlSessionFactory” class = “org.mybatis.spring.SqlSessionFactoryBean” >
                <! - 数据库连接池 - >
                < property name = “dataSource” ref = “dataSource” />
                <! -加载的MyBatis的全局配置文件- >
                < property name = “configLocation” value = “classpath:mybatis / SqlMapConfig.xml” />
        </ bean >
</ beans >
2.3.3 db.properties
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:// localhost:3306 / mybatis?characterEncoding = utf-8
jdbc.username = root
jdbc.password = root
2.4 Dao的开发
三种DAO的实现方式:
如图1所示,传统刀的开发方式
2,使用映射器代理形式开发方式
3,使用扫描包配置映射器代理。
2.4.1 传统DAO的开发方式
接口+实现类来完成。需要DAO实现类需要继承SqlsessionDaoSupport类
2.4.1.1 Dao实现类
公共 UserDaoImpl 扩展 SqlSessionDaoSupport 实现 UserDao {
        @覆盖
        公共用户findUserById(int id)抛出异常{
                SqlSession session = getSqlSession();
                User user = session.selectOne(“test.findUserById” ,id);
                //不能关闭的SqlSession,让弹簧容器来完成
                //session.close();
                返回用户;
        }
        @覆盖
        公共无效 insertUser(用户用户)抛出异常{
                SqlSession session = getSqlSession();
                session.insert(“test.insertUser” ,用户);
                session.commit();
                //session.close();
        }
}
2.4.1.2 配置道
把DAO实现类配置到春天的容器中
<! - 配置UserDao实现类 - >
        < bean id = “userDao” class = “cn.itcast.dao.UserDaoImpl” >
                < property name = “sqlSessionFactory” ref = “sqlSessionFactory” />
        </ bean >
2.4.1.3 测试方法
@测试
        公共无效 testFindUserById()抛出异常{
                UserDao userDao =(UserDao)applicationContext .getBean(“userDao” );
                User user = userDao.findUserById(1);
                系统。out .println(user);
        }
2.4.2 Mapper代理形式开发dao 2.4.2.1 开发mapper接口
开发映射文件
2.4.2.2 配置映射代理
<! - 配置mapper代理对象 - >
        < bean class = “org.mybatis.spring.mapper.MapperFactoryBean” >
                < property name = “mapperInterface” value = “cn.itcast.mybatis.mapper.UserMapper” />
                < property name = “sqlSessionFactory” ref = “sqlSessionFactory” > </ property >
        </ bean >
2.4.2.3 测试方法
公共 UserMapperTest {
        私人 ApplicationContext applicationContext ;
        @之前
        公共无效 setUp()抛出异常{
                applicationContext = new ClassPathXmlApplicationContext(“classpath:spring / applicationContext.xml” );
        }
        @测试
        public void testGetUserById(){
                UserMapper userMapper = 的applicationContext .getBean(UserMapper。);
                User user = userMapper .getUserById(1);
                系统。out .println(user );
        }
}
2.4.3 扫描包形式配置映射器
<! - 使用扫描包的形式来创建mapper代理对象 - >
        < bean class = “org.mybatis.spring.mapper.MapperScannerConfigurer” >
                < property name = “basePackage” value = “cn.itcast.mybatis.mapper” > </ property >
        </ bean >
每个映射代理对象的ID就是类名,首字母小写
传智播客·黑马程序员郑州校区地址
河南省郑州市高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话0371-56061160 / 61/62
来校路线地铁一号线梧桐街站一个口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马