Mybatis入门篇

什么是ORM框架

在学习Mybatis之前先了解下什么是ORM框架。ORM,即Object/Relation Mapping,简称ORM。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。在数据库中,关系数据无法直接表达多对多关联和继承关系。对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

当开发一个应用程序的时候(不使用O/R Mapping),可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。对于每个对象都要重复的写这些代码。除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。用O/R Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。对象关系映射成功运用在不同的面向对象持久层产品中,

以上摘自:ORM 框架简介

一、Mybatis综述

1、Mybatis是一个持久化框架,和Hibernate一样,都是ORM的一种实现框架,它对JDBC操作数据库的过程进行了封装,是开发者只需关注SQL语句即可,而不用去管注册驱动、Connection、Statement等对象的创建。

Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

二、编写第一个Mybatis的Demo并实现增删改查
1、首先创建一个收据表;
2、创建实体类
3、配置全局mapper-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--数据库配置文件位置-->
    <properties resource="jdbc.properties"></properties> 

    <!--按照自己的需要配置-->
    <typeAliases>
        <typeAlias type="com.pojo.User" alias="User"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--实体类的xml文件位置,如果在其他地方比如在com.demo.test包下,要把 . 换成 / -->
    <mappers>
        <mapper resource="mapper/user.xml"/>
    </mappers>

    <!--除了上述注释的地方其余部分配置都可以不用改变-->
</configuration>

4、jdbc.properties

driver:com.mysql.jdbc.Driver
url:jdbc:mysql://localhost:3306/test01
username:root
password:ForMe=520

5、log4j.properties,可自行百度

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=firestorm.log

log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.com.codefutures=DEBUG

6、user.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pojo">
    <select id="listAll" resultType="User">
        select * from stu
    </select>

    <insert id="add" parameterType="User">
        insert into stu (username,password,age) values (#{username},#{password},#{age})
    </insert>

    <update id="updateUser" parameterType="User">
        update stu set password=#{password} where username=#{username}
    </update>

    <delete id="deleteUser" parameterType="String">
        delete from stu where username=#{username}
    </delete>

    <select id="getOneUser" resultType="User">
        select * from stu where username=#{username}
    </select>
</mapper>

7、创建获取SqlSession的工具类

public class MybatisUtils {

    private static SqlSession session;
    static {
        String resources = "mybatis-config.xml";
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader(resources);
            SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
            session = sqlMapper.openSession();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSession(){
        return session;
    }
}

8、然后就可以编写测试类进行测试了

public class TestMain {
    public static void main(String[] args) {
        SqlSession session = MybatisUtils.getSession();

        //select
//        List<User> userList = session.selectList("listAll");
//        for (User user : userList)
//            System.out.println(user.getUsername());

        //insert
//        User user = new User();
//        user.setUsername("admin2");
//        user.setPassword("2121212");
//        user.setAge(20);
//        session.insert("add",user);
//        session.commit();

        //update
//        User user = session.selectOne("getOneUser","admin1");
//        user.setPassword("222222");
//        session.update("updateUser",user);
//        session.commit();

        //delete
//        session.delete("deleteUser","admin2");
//        session.commit();
    }
}

上面的实例已经经过测试可以使用。

三、Mybatis动态SQL语句

当对数据库进行操作时有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL很可能会出现错误。对于Mybatis来说,它提供给我们了动态SQL的技术,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。以之前的user.xml为例:

1、动态SQL:if 语句

不使用动态SQL:

<select id="getOneUser" resultType="User">
    select * from stu where username=#{username} and idid=#{id}
</select>

对于上面的SQL语句查询来说存在什么问题呢?当username为null时,查询的结果也为null,这不是我们想要的,我们可以使用动态SQL判断当不存在username时就不查询,方法如下:

<select id="getOneUser" resultType="User">
        select * from stu where
        <if test="username != null">
            username=#{username}
        </if>
        <if test="id != null">
            and id=#{id}
        </if>
</select>

对于上面的只是用if语句的查询结果其实是存在错误的,比如,当username=null时,而id!=null,则SQL语句相当于 select * from and id=#{id},是错误的,name如何避免呢?答案就是使用< where >关键字

2、动态SQL:if+where 语句

上面的改进结果:

    <select id="getOneUser" resultType="User">
        select * from stu
        <where>
          <if test="username != null">
              username=#{username}
          </if>
          <if test="id != null">
              and id=#{id}
          </if>
        </where>
    </select>

where标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

3、动态SQL:if+set 语句

含有set关键字的update操作:

    <update id="updateUser" parameterType="User">
        update stu student
        <set>
            <if test="username != null and username != ''">
                student.username=#{username}
            </if>
            <if test="password != null and password != ''">
                student.password=#{password}
            </if>
        </set>
        where id=#{id}
    </update>

4、动态SQL:choose(when,otherwise) 语句

有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句

    <select id="getUser" resultType="com.pojo.User">
        select * from
        <where>
            <choose>
                <when test="id != null and id != ''">
                    id=#{id}
                </when>
                <when test="username != null and username != ''">
                    and username=#{username}
                </when>
                <otherwise>
                    and age=#{age}
                </otherwise>
            </choose>
        </where>
    </select>

5、foreach语句

不适用动态SQL:select * from user where id in (1,2,3)
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名;
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;
open表示该语句以什么开始;
separator表示在每次进行迭代之间以什么符号作为分隔符;
close表示以什么结束;

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
①、如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
②、如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
③、如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key。

具体示例:

①、单参数List型

    <select id="getUsers" resultType="com.pojo.User">
        select * from stu where id in
        <foreach collection="list" open="(" index="index" close=")" separator="," item="item">
            #{item}
        </foreach>
    </select>

上述collection的值为list,对应的Mapper是这样的:
public List<User> dynamicForeachTest(List<Integer> ids);

②、单参数array数组的类型:

<select id="getUsers" resultType="com.pojo.User">
        select * from stu where id in
        <foreach collection="array" open="(" index="index" close=")" separator="," item="item">
            #{item}
        </foreach>
</select>

public List<User> dynamicForeach2Test(int[] ids);

③、多参数 map型

<select id="batchSelect" resultType="UserVO" parameterType="java.util.Map">  
     select userId,userName,userAge,userPhone from user_table where userId in  
     <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">  
         #{item}  
     </foreach>  
 </select>  
List<Integer> ids = new ArrayList<Integer>();  
        ids.add(1);  
        ids.add(2);  
        ids.add(3);  
        ids.add(6);  
        ids.add(7);  
        ids.add(9);  
        Map<String, Object> params = new HashMap<String, Object>();  
        params.put("ids", ids);  

参考文章:mybatis 详解(五)------动态SQL

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值