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);