首页笔记列表Mybatisday02

Mybatisday02

chk1184288047chk1184288047 2018-08-28 阅读 (568)

一:映射的输入输出 作用: Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

二:resultType(输出的简单类型)

  1. resultType的值是一个类型:

    参考getnow输出日期类型,看下边的例子输出整型: Mapper.xml文件: <!-- 获取用户列表总数 --> <select id="findUserCount" parameterType="user" resultType="int"> select count(1) from user </select>

Mapper接口: public int findUserCount(User user) throws Exception;

调用: Public void testFindUserCount() throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获取mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setUsername("管理员"); //传递Hashmap对象查询用户列表 int count = userMapper.findUserCount(user);
//关闭session session.close(); }

输出简单类型必须查询出来的结果集有一条记录,最终将第一个字段的值转换为输出类型。 使用session的selectOne可查询单条记录。

2.resultMap(输出的非简单类型-----》输出pojo列表) resultMap:手动指定查询结果的列和对象的属性进行对应。值是<resultMap>标签的ID
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射 到 pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

  

三:sql的动态

if: 根据参数,我们生成的sql语句可能会变化 if语法结构: <if test="boolean表达式"> sql语句片断 </if> 案例:
<!-- 传递pojo综合查询用户信息 --> <select id="findUserList" parameterType="user" resultType="user"> select * from user where 1=1 <if test="id!=null"> and id=#{id} </if> <if test="username!=null and username!=''"> and username like '%${username}%' </if> </select> 注意:if中空格的非空判断必须要做(!=“”)

where 语法结构: <where></where>保存sql语句中where关键字后的语法正确。 案例:
<select id="findUserList" parameterType="user" resultType="user"> select * from user <where> <if test="id!=null and id!=''"> and id=#{id} </if> <if test="username!=null and username!=''"> and username like '%${username}%' </if> </where> </select <where />可以自动处理第一个and。

foreach 语法结构: <foreach collection="list" item="obj" open=" and id in ( " close=" ) " separator=",">

{obj}

    </foreach>
   案例:

           

                 

               

               

sql的片段 sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,

                

                

将where条件抽取出来

              
              使用include引用

              

注意:如果引用其他mapper.xml的sql片段,则在引用时需加上namespace: <inciude refid="namespace.sql片段"/>

四:表与表之间的关联

   

1.使用resultType,定义订单信息po,此po类中包括了订单信息和用户信息 案例: sql语句:

       

              
            定义po类
       po类中应该包括上边sql查询出来发的所有字段,

     
    加上get/set方法
     OrdersCustom类继承Order类后OrdersCustom类包括了Orders类的所有的字段,值需要定义用户信息字段即可

Mapper.xml文件的配置

    

Mapper接口 Test类: 方法1 定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用的较多

2.定义po类,在Orders类中加入User属性,user属性中用于储存关联查询的用户信息,因为订单关联查询用户是一对一的关系,所以这里使用单个User对象存储关联查询的用户信息 Mapper.xml

 

这里resultMap指定orderUserResultMap

association:表示进行关联查询的单条记录 property:表示进行关联查询的结果储存在cn.itcast.mybatis.po.Orders的user属性中 javaType:表示关联查询的结果类型
<id property="id" column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id/>表示user_id是关联查询对象的唯一表示 <result property="username" column="username"/>:查询结果的username列对应关联对象的username属性

Mapper接口 public List<Orders> findOrdersListResultMap()throw Exception;

test:

方法2使用association完成关联查询,将关联查询信息映射到pojo对象中

一对多 定义po类,在User类中加入List<Orders> Orders;属性

  

加上get/set方法

Mapper.xml

   

collection部分定义了用户关联的订单信息。表示关联查询结果集 property="orders":关联查询的结果集存储在User对象的上哪个属性。 ofType="orders":指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。 <id />及<result/>的意义同一对一查询。

Mapper接口 List<User>getUserOrderLlist();

test: public void getUserOrderLlist(){ SqlSession session=sqlSessionFactory.openSession(); UserMapper userMapper=session.getMapper(UserMapper.class); List<User> result=userMapper.getUserOrderLlist(); for(User user : result ){ System.out.println(user); } session.close(); }

五:Mybatis整合Spring 1 SqlSessionFactory对象应该放到spring容器中作为单例存在。 2 SqlSessionFactory对象应该放到spring容器中作为单例存在。 3 Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。 4 数据库的连接以及数据库连接池事务管理都交给spring容器来完成。

第一步:创建一个java工程。 第二步:导入jar包。(上面提到的jar包) 第三步:mybatis的配置文件sqlmapConfig.xml 第四步:编写Spring的配置文件 1、数据库连接及连接池 2、事务管理(暂时可以不配置) 3、sqlsessionFactory对象,配置到spring容器中 4、mapeer代理对象或者是dao实现类配置到spring容器中。 spring.xml <!-- 加载配置文件 --> <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>


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 数据库连接池 -->
    <property name="dataSource" ref="dataSource" />
    <!-- 加载mybatis的全局配置文件 -->
    <property name="configLocation" value="mybatis.xml" />
</bean>


<!-- mybatisr的代理开发 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="cn.itcast.simple.dao"></property>
</bean>

第五步:编写dao或者mapper文件

第六步:测试。


spring整合mybatis只要配置两个bean:   sqlSessionFactory, MapperScannerConfigurer

Spring整合mybatis简单的登录案例流程图

1 开发环境 jdk,Eclipse,Tomcat,Springmvc 2 需求 使用springmvc实现商品展示 3 需求分析 请求的url:/itemList.action 参数:无 数据:静态 4 开发步骤 1 创建一个javaweb工程 2 导入jar

   
3 创建itemList.jsp(前端展示页面)

       
4 创建itemsController(添加商品信息的类,也叫做商品信息展示页面)
    itemController是一个普通的java类,不需要任何接口,只需要在类上添加@Controller注解即可。@requestMapping注解指定请求的url,其中“.action”可加可不加。在ModeAndView对象中,将视图设置为“/WEB/INF/jsp/itemList.jsp”。

      

@Controller public class ItemController {

@RequestMapping("/itemList") public ModelAndView itemList() throws Exception {

      
       List<Items> itemList = new ArrayList<>();

      
       //商品列表
       Items items_1 = new Items();
       items_1.setName("联想笔记本_3");
       items_1.setPrice(6000f);
       items_1.setDetail("ThinkPad T430 联想笔记本电脑!");

      
       Items items_2 = new Items();
       items_2.setName("苹果手机");
       items_2.setPrice(5000f);
       items_2.setDetail("iphone6苹果手机!");

      
       itemList.add(items_1);
       itemList.add(items_2);
       //创建modelandView对象
       ModelAndView modelAndView = new ModelAndView();
       //添加model
       modelAndView.addObject("itemList", itemList);
       //添加视图
       modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");

// modelAndView.setViewName("itemsList"); return modelAndView; }

}

      
商品数据使用Items类描述,可以使用参考资料中提供的pojo类,

5 创建springmvc.xml

@Controller public class ItemController {

@RequestMapping("/itemList") public ModelAndView itemList() throws Exception {

      
       List<Items> itemList = new ArrayList<>();

      
       //商品列表
       Items items_1 = new Items();
       items_1.setName("联想笔记本_3");
       items_1.setPrice(6000f);
       items_1.setDetail("ThinkPad T430 联想笔记本电脑!");

      
       Items items_2 = new Items();
       items_2.setName("苹果手机");
       items_2.setPrice(5000f);
       items_2.setDetail("iphone6苹果手机!");

      
       itemList.add(items_1);
       itemList.add(items_2);
       //创建modelandView对象
       ModelAndView modelAndView = new ModelAndView();
       //添加model
       modelAndView.addObject("itemList", itemList);
       //添加视图
       modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");

// modelAndView.setViewName("itemsList"); return modelAndView; }

} 6 配置前端控制器(在web.xml中添加DispatcherService 的配置)

   

<!-- 前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>