实训-mybatis-经验总结

    只要文件在有符号的src包下 ,就不必写src 这节目录
    //  假如我将mybatis-config.xml放到comm.icss.control包下,那么我就得
    //  String config = "com/icss/control/mybatis-config.xml"; (省略src)
        
        String config = "mybatis-config.xml";
        //官网模板String resource = "org/mybatis/example/mybatis-config.xml";
        
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(config);
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        SqlSession openSession = sqlSessionFactory.openSession();
         Object oneUser = openSession.selectOne("getUserById", 1);
         System.out.println(oneUser);

2. 执行xml哪个SQL语句 并先知道它的id

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        SqlSession openSession = sqlSessionFactory.openSession();
         Object oneUser = openSession.selectOne("getUserById", 1);
             // Object oneUser = openSession.selectOne("com.icss.mapping.user.getUserById", 1);   这样就更加精准了,更唯一了,因为如果只写"getUserById",可能还有一个XML里的SQL id也叫这个getUserById
         System.out.println(oneUser);

3. XML 里SQL的 标签 #{} 等于JDBC的占位符 ?

//resultType->查询后返回的结果是什么类型   , parameterType表示查询是传入的参数是什么类型, 
<select id="getUserById"  resultType="com.icss.entity.User"  parameterType="int">
     select  *  from user where id=#{id}
   </select>  

//parameterType表示传入占位符#{}的是User类型。   切记,#{pwd2}  , #{user2} 和实体类user的成员变量名字要相同,框架会帮你自动准确填入,不然你传的user.id,user.pwd不知填到哪个占位符里
    <update id="updateByUser" parameterType="com.icss.entity.User">
        UPDATE  user set user=#{user2},pwd=#{pwd2} where user=#{user2}
    </update>
    
    <insert id="insertByUser"  parameterType="com.icss.entity.User" >
        insert into user values(#{id},#{user2},#{pwd2},#{status},#{role})
    </insert>
    
    <delete id="deleteByid" parameterType="int">
        delete from user where id =#{id}
    </delete>

4.查询返回的结果是集合的 情况

<!-- 因为要传入两个参数,但 parameterType只能写一个东西的,所以写map-->
  
    <select id="listByPage" resultMap="userlist" parameterType="map">
  //注意:这个占位符#{}是有讲究的,#{index}, #{pagesize} 意味着,方法调用那边也要起这个名字,框架才能准确对应起来  。具体请看下面图片
        select * from user limit #{index},#{pagesize}
    </select>

//上面查询语句有一个id,下面集合也要有一个id,各自有名字才能对应起来 。上面的resultMap填的就是下面的集合的id 名字

//type代表集合的成员类型

<resultMap  id="userlist" type="com.icss.entity.User">
// column对应的是mysql数据库的那个列名
//property对应的是实体类User 里的成员属性名

        <result column="id"  property="id"/>
        <result column="user" property="user2"/>
        <result column="pwd" property="pwd2"/>
        <result column="status" property="status"/>
        <result column="role" property="role" />
    
    </resultMap>

工具类

package com.icss.util;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SQLSessionUtil {
    
      private static SqlSessionFactory  factory=null;
      // static
      static Reader read=null;
      
      static{
           String config="mybatis-config.xml";
           try {
             read= Resources.getResourceAsReader(config);
        } catch (IOException e) {
            e.printStackTrace();
        } 
      }
      
      /**
       * 
       * @return
       * 单例设计模式,只得到一个工厂对象
       */
      private static  SqlSessionFactory  getSqlSessionFacory(){
           if(factory==null){
               factory =new SqlSessionFactoryBuilder().build(read);
           }
            return factory;
      }
      
      
      /***
       *  封装一个得到 SqlSession的对象
       *  
       */
      
      public  static  SqlSession getSqlSession(){
          return getSqlSessionFacory().openSession();
      }
    
    
}

整 体原理

猜你喜欢

转载自www.cnblogs.com/czy16/p/9270171.html