zoukankan      html  css  js  c++  java
  • Mybatis学习记录(3)

    1.输出映射和输入映射

       Mapper.xml映射文件定义了操作数据库的sql,每个sql就是一个statement,映射文件是mybatis的核心。

    (1)parameterType(输入类型)

       1.传递简单类型

         使用占位符#{},或者${}进行sql拼接。

       2.传递pojo对象

         使用ognl表达式解析对象字段的值,#{}或者${}括号中的值 为pojo属性名称。

       3.传递pojo包装对象

         开发中可以通过使用pojo传递查询条件,查询的条件可能是综合的查询条件,这时可以使用包装对象传递输入参数。

         包装对象:Pojo类中的一个属性是另一个pojo

    即新建一个queryInfo类将所需要的查询条件全部声明到此类中,并生成get,set方法。

    编写QueryInfo类 UserQueryInfo.java

    package com.javaweb.mybatis.model.queryInfo;
    
    import java.io.Serializable;
    
    import com.javaweb.mybatis.model.User;
    
    public class UserQueryInfo implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
        
        
    
    }

     Mapper.xml配置文件

    <!-- 根据用户名模糊查询 -->
        <select id="findUserByQueryInfo" parameterType="com.javaweb.mybatis.model.queryInfo.UserQueryInfo" resultType="com.javaweb.mybatis.model.User">
            select * from mybatis_user where username like "%${user.userName}%"
        </select>

     Mapper接口

    public interface UserMapper {
        /**
         * 遵循四个原则
         * 1.接口方法名 ==User.xml中的id名
         * 2.返回值类型与Mapper.xml的返回值类型一致
         * 3.方法的入参类型与Mapper.xml中的入参类型一致
         * 4.命名空间绑定此接口,即Mapper.xml的namespace是此接口的路径
         */
        
        public List<User> findUserByQueryInfo(UserQueryInfo queryInfo);

    Jubit单元测试类:

        @Test
        public void testMapperQueryInfo() throws Exception{
            //加载核心配置文件
            String resource="sqlMapConfig.xml";
            InputStream in=Resources.getResourceAsStream(resource);
            //创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            //创建SqlSession
            SqlSession sqlSession=sqlSessionFactory.openSession();
            
            //SqlSession帮我生成一个实现类
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
            
            UserQueryInfo queryInfo =new UserQueryInfo();
            User user=new User();
            user.setUserName("王");
            queryInfo.setUser(user);
            
            List<User> userList=userMapper.findUserByQueryInfo(queryInfo);
            for(User u:userList){
                System.out.println(u);
            }
        }

    2.resultType(输出类型)

      (1)输出简单类型

       需求查询用户表的数据总条数

       Mapper接口:

       

    public interface UserMapper {
        /**
         * 遵循四个原则
         * 1.接口方法名 ==User.xml中的id名
         * 2.返回值类型与Mapper.xml的返回值类型一致
         * 3.方法的入参类型与Mapper.xml中的入参类型一致
         * 4.命名空间绑定此接口,即Mapper.xml的namespace是此接口的路径
         */
        
        //查询数据条数
        public Integer countUser();

     Mapper.xml配置文件

        <!-- 查询数据条数 -->
        <select id="countUser" resultType="Integer">
            select count(1) from mybatis_user  where 1=1 and id=2
        </select>

    Junit单元测试类:

    @Test
        public void testMapperCountUserQueryInfo() throws Exception{
            //加载核心配置文件
            String resource="sqlMapConfig.xml";
            InputStream in=Resources.getResourceAsStream(resource);
            //创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            //创建SqlSession
            SqlSession sqlSession=sqlSessionFactory.openSession();
            
            //SqlSession帮我生成一个实现类
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
            
            Integer countUser = userMapper.countUser();
            System.out.println(countUser);
        }

    (2)输出pojo对象

    见上一章

    (3)输出pojo列表

    见上一章

    3.resultMap(输出类型)

      resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致才能映射成功。

      但是如果是sql查询字段名和pojo的属性名不一致,就可以通过resultMap将字段名和属性名手动做一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中。

      resultMap可以实现将映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

    示例:查询订单表order中的所有数据

    数据库表构造如下:

    Order对象order.java

    public class Order implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        private String id;
        private String userId;
        private Integer number;
        private String note;
        private Date createTime;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getUserId() {
            return userId;
        }
        public void setUserId(String userId) {
            this.userId = userId;
        }
        public Integer getNumber() {
            return number;
        }
        public void setNumber(Integer number) {
            this.number = number;
        }
        public String getNote() {
            return note;
        }
        public void setNote(String note) {
            this.note = note;
        }
        public Date getCreateTime() {
            return createTime;
        }
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
        @Override
        public String toString() {
            return "Order [id=" + id + ", userId=" + userId + ", number=" + number + ", note=" + note + ", createTime="
                    + createTime + "]";
        }
        
        

      OrderMapper.java接口

      

    /**
     * 订单接口
     * @author fanyukai
     *
     */
    public interface OrderMapper {
        
        public List<Order> orderList();
    }

    Mapper.xml配置文件

    
    
    <mapper namespace="com.javaweb.mybatis.mapper.OrderMapper">
        <!-- id:设置resultMap的id -->
        <resultMap type="com.javaweb.mybatis.model.Order" id="orders">
            <!-- 定义主键 -->
            <!-- property:主键在pojo的属性名 -->
            <!-- colunm:主键在数据库中的列名 -->
            <id property="id" column="id" />
            
            <!-- 定义普通属性 -->
            <result column="user_id" property="userId"/>
        </resultMap>
        
        <!-- 查询所有订单 -->
        <select id="orderList" resultMap="orders">
            select id,user_id,number,note,createtime from mybatis_orders
        </select>
    </mapper>
    
    
    
     

    Junit单元测试类:

    @Test
        public void testMapperOrderList() throws Exception{
            //加载核心配置文件
            String resource="sqlMapConfig.xml";
            InputStream in=Resources.getResourceAsStream(resource);
            //创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            //创建SqlSession
            SqlSession sqlSession=sqlSessionFactory.openSession();
            
            //SqlSession帮我生成一个实现类
            OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
            
            List<Order> orderList=orderMapper.orderList();
            for(Order orders :orderList){
                System.out.println(orders);
            }
        }

    3.动态sql

    (1)通过mybatis提供的各种标签方法实现动态拼接sql

    <sql>和<include>标签

     

    (2)where,if 标签

    4.关联查询

       一对一关联:一份订单对应一个用户

     使用resultMap,定义专门的resultMap用于映射一对一查询结果

     sql语句:

       

          select 
            o.id,
            o.user_id,
            o.number,
            o.note,
            o.createtime,
            u.id,
            u.username
            FROM mybatis_orders o 
            LEFT JOIN mybatis_user u
            ON o.user_id=u.id

    改造pojo类

    public class Order implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        private String id;
        private String userId;
        private Integer number;
        private String note;
        private Date createTime;
        
        //附加对象 用户对象
        private User user;
        
        
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
       /* 后面get,set方法省略*/

    Mapper.xml配置文件

    <resultMap type="com.javaweb.mybatis.model.Order" id="order">
            <!-- 定义普通属性 -->
            <id     column="id" property="id"/>
            <result column="user_id" property="userId"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createTime"/>
                
            <!-- 一对一 -->
            <association property="user" javaType="com.javaweb.mybatis.model.User" >
                <id column="id" property="user_id"/>
                <result column="userName" property="userName"/>
            </association>
        </resultMap>
        
        <!-- 一对一关联查询 以订单为中心关联用户 -->
        <select id="selectOrder" resultMap="order">
            select 
            o.id,
            o.user_id,
            o.number,
            o.note,
            o.createtime,
            u.id,
            u.username
            FROM mybatis_orders o 
            LEFT JOIN mybatis_user u
            ON o.user_id=u.id
        </select>

    Mapper接口:

    public interface OrderMapper {
        
        
        //一对一关联查询 以订单为中心关联用户
        
        public List<Order> selectOrder();
        

    Junit单元测试类:

    @Test
        public void testMapperOrderOneToOne() throws Exception{
            //加载核心配置文件
            String resource="sqlMapConfig.xml";
            InputStream in=Resources.getResourceAsStream(resource);
            //创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            //创建SqlSession
            SqlSession sqlSession=sqlSessionFactory.openSession();
            
            //SqlSession帮我生成一个实现类
            OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
            
            List<Order> orderList=orderMapper.selectOrder();
            for(Order orders :orderList){
                System.out.println(orders);
            }
        }

       一对多关联:一个用户对应多个订单

    sql语句

         select 
            o.id,
            o.user_id,
            o.number,
            o.note,
            o.createtime,
            u.username
            FROM mybatis_user u
            LEFT JOIN mybatis_orders o 
            ON o.user_id=u.id

    改造pojo类 User.java:

    public class User implements Serializable{
    
        /**
         * user表的pojo对象
         */
        private static final long serialVersionUID = 1L;
        private String id;
        private String userName;
        private String userAge;
        private String userSex;
        private String userAddress;
        
        //附加对象list 一对多
        private List<Order> orderList;
        
        
        public List<Order> getOrderList() {
            return orderList;
        }
        public void setOrderList(List<Order> orderList) {
            this.orderList = orderList;
        }
    /*后面get,set方法省略*/

    Mapper.xml配置文件:

    <!-- 一对多 以用户为中心-->
        <resultMap type="com.javaweb.mybatis.model.User" id="user">
            <id column="id" property="id"/>
            <result column="username" property="userName"/>
            
            <!-- 一对多 -->
            <collection property="orderList" ofType="com.javaweb.mybatis.model.Order">
                
    <!-- 配置主键,是关联Order的唯一标识 -->
    <id column="id" property="id"/> <result column="number" property="userName"/> <result column="user_id" property="userId"/> <result column="note" property="note"/> <result column="createtime" property="createTime"/> </collection> </resultMap> <select id="selectUserList" resultMap="order"> select o.id, o.user_id, o.number, o.note, o.createtime, u.username FROM mybatis_user u LEFT JOIN mybatis_orders o ON o.user_id=u.id </select>

    Mapper接口:

    public interface OrderMapper {
        
        
        //一对多关联
        public List<User> selectUserList();
    }

    Junit单元测试类:

    @Test
        public void testMapperOrderOneToMany() throws Exception{
            //加载核心配置文件
            String resource="sqlMapConfig.xml";
            InputStream in=Resources.getResourceAsStream(resource);
            //创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            //创建SqlSession
            SqlSession sqlSession=sqlSessionFactory.openSession();
            
            //SqlSession帮我生成一个实现类
            OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
            
            List<User> selectUserList = orderMapper.selectUserList();
            for(User user :selectUserList){
                System.out.println(user);
            }
        }
  • 相关阅读:
    工作那些事(四)大公司VS小公司
    HTTP Keep-Alive详解
    Burp Suite Walkthrough(英文版)
    Burp Suite Walkthrough(中文版)
    Burp Suite教程(英文版)
    XSS之学习误区分析
    工具猫魔盒介绍
    XSS脚本攻击漫谈
    WEB黑客工具箱之FireBug介绍
    WEB黑客工具箱之LiveHttpHeaders介绍
  • 原文地址:https://www.cnblogs.com/FanJava/p/8343728.html
Copyright © 2011-2022 走看看