Mybatis

什么是Mybatis

Mybatis是对JDBC的封装,它隐藏了具体的JDBCAPI,它把SQL语句放到了配置文件中,它能自动把不同的输入数据映射到SQL语句的动态参数上,它能自动把SQL语句的执行结果映射为JAVA对象……MyBatis是一个持久化层的框架!

Mybatis是一个ORM框架

可以说Mybatis是一个半自动的ORM框架,Hibernate是全自动的

cms项目第9天(上)-mybatis框架

 

原文:http://blog.sina.com.cn/s/blog_6bcb0a8c0100q6ud.html

主配置文件

基本作用就是配置JDBC连接的有关信息,比如URL、用户名、密码等等

如:

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration

PUBLIC"-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--配置管理器 -->

<configuration>

   <!-- 别名-->

   <typeAliases>

      <typeAliastype="org.leadfar.mybatis.Person"alias="Person"/>

   </typeAliases>

   <!-- 配置数据库连接信息-->

   <environmentsdefault="development">

      <environmentid="development">

          <transactionManagertype="JDBC"/>

          <dataSourcetype="POOLED">

             <propertyname="driver"value="com.mysql.jdbc.Driver"/>

             <propertyname="url"value="jdbc:mysql://localhost/mybatis"/>

             <propertyname="username"value="root"/>

             <propertyname="password"value="leadfar"/>

          </dataSource>

      </environment>

   </environments>

   <!-- 映射文件定位-->

   <mappers>

      <mapperresource="org/leadfar/mybatis/PersonMapper.xml"/>

   </mappers>

</configuration>

 

映射文件

基本作用就是编写SQL语句,同时给每个SQL语句定义一个唯一标识(ID),在程序中通过此ID来调用这条SQL语句。

 

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmapper

PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--整个唯一标识sqlidnamespace+id  org.leadfar.mybatis.Person.insert-->

<mappernamespace="org.leadfar.mybatis.Person">

 <insertid="insert"parameterType="Person">

    insert into t_person(name,age,birthday) values(#{name},#{age},#{birthday})

 </insert>

 

</mapper>

 

程序代码

      // 声明一个session管理工厂

       SqlSessionFactory factory =null;

      // 声明读取器

       Reader reader =null;

      try{

          // 通过读取器定位到主配置文件

           reader = Resources.getResourceAsReader("SqlMapConfig.xml");

          // 初始化工厂

           factory =newSqlSessionFactoryBuilder().build(reader);

       }catch(IOException e) {

          // TODOAuto-generated catch block

           e.printStackTrace();

       }

      // 打开一个会话(类似于jdbc中创建数据库连接)

       SqlSession session = factory.openSession();

       Person p =newPerson();

       p.setName("张三");

       p.setAge(11);

       p.setBirthday(newDate());

      // 进行插入

      try{

           session.insert("org.leadfar.mybatis.Person.insert", p);

          // 事务提交

           session.commit();

           System.out.println("保存成功!");

       }catch(Exception e) {

           e.printStackTrace();

          //事务回滚

           session.rollback();

       }finally{

          //关闭连接

           session.close();

       }

 

sql参数传递

1.简单参数

<deleteid="delete"parameterType="int">

    delete from t_person where id=#{id} <!—无所谓写什么都可以à

 </delete>

2.多个参数,建议采用Map包装

<selectid="selectLikeNameAndAgeBetween"parameterType="map"resultType="Person">

   <includerefid="selectBasic"/>where name like #{name} and age between #{age1} and #{age2}

 </select>

 

SqlSession session =factory.openSession();

    Mapmap=newHashMap();

   map.put("name","%%");

   map.put("age1", 0);

   map.put("age2", 100);

    List persons=session.selectList(Person.class.getName()+".selectLikeNameAndAgeBetween",map);

   

    System.out.println(((Person)(persons.get(0))).getName());

    session.close();

sql语句块

 <sqlid="selectBasic">

    select * from t_person

 </sql>

<selectid="selectLikeName"parameterType="string"resultType="Person">

   <includerefid="selectBasic"/>where name like #{name}

 </select>

属性名与字段名不匹配

<resultMaptype="Person"id="select-reusltMap">

    <resultcolumn="sex"property="gender"/>

 </resultMap>

<selectid="selectLikeNameAndAgeBetweenResultMap"parameterType="map"resultMap="select-reusltMap">

   <includerefid="selectBasic"/>where name like #{name} and age between #{age1} and #{age2}

 </select>

 

 

动态sql

if

<selectid="selectIf"parameterType="map"resultType="Person">

    select * from t_person

   <iftest="name !=null">

      where name like #{name}

   </if>

   <iftest="age !=0">

      and age=#{age}

   </if>

 </select>

注:如果name==null,则sql拼写错误

 <selectid="selectWhere"parameterType="map"resultType="Person">

    select * from t_person

   <where>

       <iftest="name !=null">

          name like #{name}

       </if>

       <iftest="age !=0">

         and age=#{age}

       </if>

   </where>

 </select>

:<where>后则确保一定是where开头

choose

类似于switch

<selectid="selectChoose"parameterType="map"resultType="Person">

    select * from t_person

   <choose>

     <whentest="name!=null">

         where name like #{name}

     </when>

     <otherwise>

         where name like '%%'

     </otherwise>

   </choose>

    <iftest="age !=0">

      and age=#{age}

   </if>

 </select>

foreach

in操作

<selectid="selectFor"parameterType="list"resultType="Person">

    select * from t_person where id in

   <foreachcollection="list"item="p"open="("close=")"separator=",">

    #{p}

   </foreach>

 </select>

 

SqlSession session =factory.openSession();

    Listl=newArrayList();

   l.add(1);

   l.add(2);

   l.add(3);

   l.add(4);

    List persons=session.selectList(Person.class.getName()+".selectFor",l);

   

    System.out.println(((Person)(persons.get(1))).getName());

    session.close();

$

相当于转义,字符串替换

<selectid="selectIn"parameterType="map"resultType="Person">

    select * from t_person where id in ${instr}

 </select>

 

SqlSession session =factory.openSession();

   

    Map params=newHashMap();

   //params.put("name", "%%");

   params.put("instr","(1,2,3,4)");

    List persons=session.selectList(Person.class.getName()+".selectIn",params);

   

    System.out.println(((Person)(persons.get(1))).getName());

    session.close();

另外对于排序时由外部传入某字段

<selectid="selectOrderBy"parameterType="map"resultType="Person">

    select * from t_person  order by  ${by}

 

 </select>

 

SqlSession session =factory.openSession();

   

    Map params=newHashMap();

   //params.put("name", "%%");

   params.put("by","age desc");

    List persons=session.selectList(Person.class.getName()+".selectOrderBy",params);

   

    System.out.println(((Person)(persons.get(1))).getName());

    session.close();

 

一对一映射

简单方法

PersonAddress是一对一关系

PersonMapper.xml

<resultMaptype="Person"id="select-resultMap">

   <!-- 一对一(多对一)通过association,property目标对象的属性 -->

      <associationproperty="address"select="org.leadfar.mybatis.Address.selectAll"column="id"javaType="Address">

          

      </association>

      

   </resultMap>

 

<selectid="selectAll"resultMap="select-resultMap">

      select * from t_person

   </select>

 

AddressMapper.xml

<selectid="selectAll"parameterType="int"resultType="Address">

      select * from t_address where person_id=#{pId}

   </select>

解决N+1问题

<selectid="selectAllN1"resultMap="select-resultMapN1">

      select a.*,b.id addr_id, b.postCode,b.area from t_person a left join t_address b on

      a.id=b.person_id 

   </select>

 

<!--这种方式能解决N+1问题,但是自动对象赋值将不行-->

   <resultMaptype="Person"id="select-resultMapN1">

      <idcolumn="id"property="id"/>

      <resultcolumn="sex"property="gender"/>

      <resultcolumn="name"property="name"/>

      <resultcolumn="birthday"property="birthday"/>

      <resultcolumn="age"property="age"/>

      <associationproperty="address" column="id"javaType="Address">

          <idcolumn="addr_id"property="id"/>

          <resultcolumn="area"property="area"/>

          <resultcolumn="postCode"property="postCode"/>

      </association>

   </resultMap>

一对多映射

PersonCar为一对多关系

<selectid="selectAllN1"resultMap="select-resultMapN1">

      select a.*,b.id addr_id, b.postCode,b.area from t_person a left join t_address b on

      a.id=b.person_id 

   </select>

 

<!--这种方式能解决N+1问题,但是自动对象赋值将不行-->

   <resultMaptype="Person"id="select-resultMapN1">

      <idcolumn="id"property="id"/>

      <resultcolumn="sex"property="gender"/>

      <resultcolumn="name"property="name"/>

      <resultcolumn="birthday"property="birthday"/>

      <resultcolumn="age"property="age"/>

      <associationproperty="address" column="id"javaType="Address">

          <idcolumn="addr_id"property="id"/>

          <resultcolumn="area"property="area"/>

          <resultcolumn="postCode"property="postCode"/>

      </association>

      <!-- t_car中相关的数据与目标对象(Person)中的cars属性进行对应-->

      <collectionproperty="cars"column="id"select="org.leadfar.mybatis.Car.selectByPerson"></collection>

   </resultMap>

 

原文:http://blog.sina.com.cn/s/blog_6bcb0a8c0100q6ud.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值