MyBatis部分讲解

Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射 。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解来配置和映射原生信息,将接口和java的POJOs映射成数据库的记录。

1.jdbc的回顾

import com.mysql.jdbc.Driver;

import java.sql.*;

public class JDBCTest {
    public static void main (String[] args) {
       //mysql驱动类
        String driverClass = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://192.168.93.88:3306/mydb";
        String username = "root";
        String password = "";

        //数据库连接接口
        Connection conn = null;
        //执行sql语句的接口
        Statement st = null;
        try {
            //加载驱动类到虚拟机
            Class.forName ( driverClass );

            //连接数据库
            conn =  DriverManager.getConnection (url,username,password);//url地址,username,password

            //创建语句对象
            st = conn.createStatement (); //功能是执行sql语句
            String sql = "begin";
            st.execute ( sql ); //执行语句
            int count = st.executeUpdate ( sql );
            //st.executeUpdate ( sql )返回执行成功后的语句记录数,进行数据库中的添删改操作
            sql = "update Account set account = account - 1000 where id = 1;";
            st.execute ( sql );
            sql = "update Account set account = account + 1000 where id = 2;";
            st.execute ( sql );
            sql = "commit";
            st.execute ( sql );

        } catch (Exception e) {
            e.printStackTrace ();
        }

        try {
            String sql = "rollback";
            st.execute ( sql );
        } catch (SQLException e) {
            e.printStackTrace ();
        }finally {
            //关闭这些对象,是为了释放资源
            try {
                if (st != null)
                    st.close ();
                if (conn != null)
                    conn.close ();
            } catch (SQLException e) {
                e.printStackTrace ();
            }
        }
    }
}

每次执行数据库操作都得写这么多,但是实际改动的部分是如下所示:

    String sql = "begin";
    st.execute ( sql ); //执行语句
    int count = st.executeUpdate ( sql );
    //st.executeUpdate ( sql )返回执行成功后的语句记录数,进行数据库中的添删改操作
    sql = "update Account set account = account - 1000 where id = 1;";
    st.execute ( sql );
    sql = "update Account set account = account + 1000 where id = 2;";

所以,重复做的事情一般的解决方法是就是封装,调用。类似的,引入MyBatis。

2.MyBatis引射器与动态Sql

MyBatis 常用的映射器元素,动态SQL元素、MyBatis注解配置和关联映射。

2.1MyBatis映射器

2.1.1映射器的主要元素

​ Mybatis提供了强大的映射器,并且提供丰富的映射器元素,具体如表2-1所示。

元素名称 描述
select 映射查询语句
insert 映射插入语句
update 映射更新语句
delete 映射删除语句
sql 可以被其他语句引用的可重用语句块
resultMap 用来描述如何从数据库结果集中加载对象
cache 给定命名空间的缓存配置
cache-ref 其他命名空间缓存配置的引用

​ 表2-1 映射器元素

2.1.2 select元素

​ select 元素是MyBatis中最为常用的元素之一,select元素可以从数据库中读取数据,组装数据给业务人员。比如,可以在配置文件ChannelDao.xml中使用 select元素,根据用户 Id 查询 表t_channel中的具体频道信息,具体代码如下:

<select id="findByCid" parameterType="Int" resultType="edu.xatu.entity.Channel">
        select * from t_channel
        where cid = #{id}
    </select>

这个语句被称为findByCid,接受一个Int类型的参数,并返回一个Channel类型的对象。参数#{id}是告诉MyBatis创建一个预处理语句参数。通过JDBC,这样的一个参数在SQL中会由一个“?”来标识,并被传递到一个新的预处理语句中。上面的SQL语句执行时会生成如下JDBC代码:

    String findByCid = "select * from t_channel where id = ?";
    PreparedStatement pst = conn.prepareStatement ( findByCid );
    pst.setString ( 1,"id" );

接口ChannelDao中定义的方法如下:

 public Channel finByCid(int id);

select元素提供了很多种配置,具体如表2-2所示。

属性名称 描述
id 它和mapper的命名空间组合起来是唯一的,id的值和DAO接口的方法名一致。如不一致或者不唯一,MyBatis将抛出异常
parameterType 将会传入语句参数类的全名码或者别名,这个属性时可选的,因为MyBatis可以通过Type Handler推断出传入语句的参数,默认值为 unset。可以选择JavaBean 、Map等复杂的参数类型传递给SQL
parameterMap 即将废弃的元素,不讨论
resultType 从语句中返回期望类型的类的完全限定名或别名。注意如果是集合的情形,那应该是集合可以包含的类型,而不可能是集合本身。返回时可以用resultType或者resultMap,但不能同时使用。结果集将通过JavaBean的规范映射或者定义为int、double、float等参数。
resultMap 它是映射集的引用,将执行强大的映射功能,可以使用resultType或者resultMap其中的一个,resultMap可以给予我们自定义映射规则的机会
flushCache 它的作用是调用SQL后,是否要求MyBatis清空之前查询本地缓存和二级缓存,取值为false/true,默认为false
useCache 启动二级缓存的开关,取值为false/true,默认为false
timeout 设置超时参数,等超时的时候抛出异常,单位为秒
fetchSize 获取记录的总条数设定
statementType 告诉MyBatis使用哪个JDBC的Satament工作,取值为STATEMENT、PREPARED 或者CALLABLE. 默认为PREPARED
resultSetType 它的值包括FORWARD_ONLY(游标允许向前访问)|SCROLL_SENSITIVE(双向滚动,并及时跟踪数据库更新,以便更改resultSet中的数据)|SCROLL_INSENSITIVE(双向滚动,但不及时跟踪数据库更新,数据库里的数据修改,并不在resultSet中反应过来)
databaseId 如果设置databaseIdProvider,Mybatis会加载所有的不带databaseId的语句,如果不带或者带的语句都有,则不带的会被忽略
resultOrdered 这个设置仅针对嵌套结果select语句:如果设置为true,就是假设包含了嵌套结果集或者分组了,当返回一个主结果 行的时候,就不会发生对前面结果集引用的情况。这就使得获得嵌套结果集时不至于导致内存不够用。默认设为false
resultSets 适用于多个结果集的情况,它将列出执行SQL后每个结果集的名称,每个名称之间用逗号隔开。使用比较少

​ 表2-2 select元素配置

2.1.3 insert、update、delete元素

​ insert元素用来映射DML语句,MyBatis会执行插入之后返回一个整数,来表示进行操作后插入的记录数。

​ update元素用来映射DML语句,主要用来更新数据库中的 数据,MyBatis会执行更新之后返回一个整数,来表示进行操作后插入的记录数。

​ delete元素用来映射DML语句,主要用来删除数据库中的数据,MyBatis会执行删除操作之后返回一个整数,来表示进行操作后插入的记录数。

它们特有的属性如表2-3所示:

属性名称 描述
useGeneratedKeys 令MyBatis使用JDBC的useGeneratedKeys方法来获取由数据库内部生成的主键,例如MySql和SQL server自动递增字段,Oracle的序列等,使用它时必须给keyProperty或者keyColumn赋值
keyProperty 表示哪个列作为属性的主键,不能喝keyColumn同时使用
keyColumn 表明第几列是主键,不能和keyProperty同时使用,只接受整形参数

​ 表2-4 insert、update、delete元素配置

下面看几个实例:

insert:

<insert id="addChannel" >
        insert into t_channel(cid,cname,description) 
        values(#{cid},#{cname},#{description})
    </insert>

对应接口:

 public void addChannel(int id);

update:

<update id="updChannel" parameterType="channel">
        update t_channel set
        name = #{cname},
        description =#{description}
        where cid = #{cid}
    </update>

对应接口:

public int updChannel(Channel channel);

delete:

<delete id="delChannel">
        delete from t_channel
                where cid = #{id}
    </delete>

对应接口:

public void delChannel(int id);

发布了101 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Austin_/article/details/102242475