Mybatis 是一款非常方便的持久层框架,它对JDBC进行了封装,从而让我们在使用它时,可以避免几乎所有的JDBC代码。SQL语句配置在XML文件中,从而让配置变得更加灵活,它的CRUD在配置文件中分别用四个元素来表示。即inert,delete,update,select。另外,它是通过核心的SqlSession对象来获取配置文件中的信息,其实整个框架都是以该对象为基础的,下面简要说明一下,它的配置流程。
和JDBC一样,第一步就是要获取数据库连接,但在mybatis中,数据库连接都是在配置文件中配置的,如:
一、从配置文件获取一个数据库连接
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/userinfo"/>
<property name="username" value="root"/>
<property name="password" value="130588"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="config/UserInfoMapper.xml"/>
</mappers>
</configuration>
在上述代码中,dataSource元素就是配置一个数据库的驱动,url,用户名和密码同时引入一个SQL映射文件(稍后说明该文件),文件配置完成后,我们就要通过SqlSession对象来获取这个文件的信息。
package com.ev.util;
import java.io.IOException;
import java.io.InputStream;
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 DatabaseConnection {
public SqlSession getSqlSession(){
String resource = "config/mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void closeSqlSession(SqlSession sqlSession){
sqlSession.close();
}
}
这个配置我放在config的包下,的上述代码中,首先是通过Resources.getResourceAsStream()函数,获取关于数据库连接配置文件的一个输入流,然后通过这个输入流得到SqlSessionFactory对象,最后再通过SqlSessionFactory对象的openSession()方法得到SqlSession实例,从而得到数据库连接,当然SqlSession实例用完后,我们就要释放相关资源,即调用sqlSession.close();
二、书写SQL映射语句
在mybatis中,SQL语句可分别写在配置文件的select,delete,update,insert四个元素中。同时这四个元素还可以接收从外面传过来的值。
<?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="ev.com.userinfo">
<select id="listall" resultType="com.ev.entities.User">
select id,username,workplace from usertable
</select>
<insert id="add" parameterType="com.ev.entities.User">
insert into usertable(username,workplace) values (#{username},#{workplace})
</insert>
<delete id="del" parameterType="int">
delete from usertable where id=#{id}
</delete>
<update id="update" parameterType="com.ev.entities.User">
update usertable set username=#{username},workplace=#{workplace} where id=#{id}
</update>
</mapper>
这里元素的namespace属性是必需的,这个是用来规定它里面的映射语句所属的命名空间,目地是在有多个映射文件的情况下避免映射语句间的冲突,另外parameterType属性就是从外面传过来的值的类型,可以是基本类型也可以是引用类型。当传入的是基本类型的值时,{}中的变量名称可以根据实际需要来命名,不过一般是和传入的变量名称一样,当传入引用类型时如一个对象,那么{}中的变量名称就取传入对象的属性名,当传入一个集合如:List类型,则变量名称取list,Map类型则取key,然后取相应值时,则应key.prop(prop为Map中的键名)。
该配置同时还支持标签和标签做一些逻辑判断和循环输出,可以使用OGNL。在这个标签中,如果表达式exp的值为true,则执行标签体中的内容,否则不执行。标签也有几个属性,如
Collection是指向一个集合,可以是Map和List,当是Map时,index是键名,item为值,如果是List则index为元素的下标,而item为元素值。
最后我们可以通过SqlSession实例为这些元素设置入参。
如sqlSession.selectList(“listall”);获取id为listall的select元素;
sqlSession.insert(“add”,user);获取id为add的insert元素,同时传入一个User类型的对象;
sqlSession.delete(“del”, id);获取id为del的delete元素,同时传入一个id;
sqlSession.update(“update”,user);获取id为update的insert元素,同时传入一个User类型的对象;
其中insert()、delete()、update()调用后,我们都要调用sqlSession.commit();方法把事务提交。