ibatis和hibernate区别在于,hibernate是全自动化管理,ibatis是半自动化管理,hibernate直接将表字段跟实体属性映射,我们减少了很多操作和心思,但是也带来一些麻烦,配置文件的数量将大量增加。ibatis只对DAO进行映射,对每个DAO擦作管理配置,底层只是解析配置好的SQL语句。也就是说,将SQL语句交给XML文件,我们不需要知道表里面的字段叫什么,只要知道DAO传过来是什么类型的参数就行了。
一,导包 mybatis-3.1.1.jar,数据库驱动,日志记录包log4j.jar
二,编写实体类 User.java
三,写核心XML文件,配置访问数据库的相关属性
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.1//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<properties resource="sql.properties"/>
<typeAliases>
<typeAlias type="entity.User" alias="User"/> //这里其实没有什么意义,只能在本配置文件中用User代替entity.User
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<mappers>
<mapper resource="user.xml"/>
</mappers>
</configuration>
//这里的几个EL表达式,是从sql.properties这个文件中获取东西,如果不方配置文件中,可以这么写
<properties>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</properties>
四,user.xml文件
这个文件是一个关键,映射了所有的DAO操作方法(HIBERNATE是映射实体,IBATIS映射方法)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.1//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="dao.UserDAO"> //这个命名空间非常重要,UserDAO是一个接口
<delete id="deleteUser" parameterType="User"> //这个id非常重要,在DAO中,直接使用命名空间.ID来对应这个SQL语句
delete from d_user where id=#{id}
</delete>
<select id="selectById" parameterType="java.lang.Integer" resultType="User">
select * from d_user where id=#{id}
</select>
</mapper>
五,编写SessionFactory工具类
这里可以采用单例模式。
package dao;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SessionFactoryUtils {
private String source="SqlMapper.xml";
private SqlSessionFactory sqlSessionFactory=null;
private static SessionFactoryUtils sessionFactory=new SessionFactoryUtils();
private SessionFactoryUtils(){
try{
Reader read=Resources.getResourceAsReader(source);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(read);
}catch(IOException e){
System.out.println("IO异常,读取资源文件SQLMAPPER.XML出错"+e.getMessage());
throw new ExceptionInInitializerError();
}
}
public static SessionFactoryUtils getSessionfactory(){
return sessionFactory;
}
public SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
这个工具类返回一个SqlSessionFactory对象,在使用的时候可以这样获得一个SqlSession的对象,实现相关操作
package dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import entity.User;
public class UserDAOIbatis implements UserDAO {
private SqlSessionFactory sqlSessionFactory = SessionFactoryUtils
.getSessionfactory().getSqlSessionFactory();
public void delete(int id) {
SqlSession sqlSession=null;
try {
sqlSession=sqlSessionFactory.openSession();
sqlSession.delete("dao.UserDAO.deleteUser", id);//第一个参数是配置文件中对应的命名空间.ID , 第2个参数ID是要传到user.xml中对应的SQL语句里面的
sqlSession.commit(); //必须提交
} finally {
sqlSession.close();
}
}
public User findById(int id) {
SqlSession sqlSession=null;
User user=null;
try{
sqlSession=sqlSessionFactory.openSession();
user=sqlSession.selectOne("dao.UserDAO.selectById",id);
sqlSession.commit();
}finally{
sqlSession.close();
}
return user;
}
}
六,测试
package test;
import org.apache.log4j.Logger;
import org.apache.log4j.jdbc.JDBCAppender;
import org.junit.Test;
import dao.UserDAO;
import dao.UserDAOIbatis;
import entity.User;
public class TestIBatis {
@Test
public void testDelete(){
UserDAO userdao=new UserDAOIbatis();
userdao.delete(12);
}
@Test
public void testSelectById(){
UserDAO userdao=new UserDAOIbatis();
User user=userdao.findById(1);
System.out.println(user.getEmail()+" "+user.getPassword());
}
}
IBATIS使用方法最简单的实现就这么个过程。另外要查看SQL语句需要添加配置文件log4j.properties
#logger level default is INFO
log4j.rootLogger=info,console,file
#append to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p - %m%n
#append to file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=error_log.txt
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=10000
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %p - %m%n
#ibatis logger config
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug,stdout
或者
log4j.logger.com.ibatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.org.logicalcobwebs=ERROR
如果要整合spring来使用,那么只需要把核心配置文件中的连接数据库的配置提取出来(environments部分),放到spring中即可。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:MyBatis-Configuration.xml"></property>
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.mybatis.UserDao"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> driverClassName,url,username,password,maxActive,maxWait等配置
<property name="defaultAutoCommit" value="true"></property>
</bean>
最近公司需要使用mybatis3.2.4,这个版本有个接口自动装配的功能。使用方法如下:
不需要dao的实现类了,只要有接口就行。
HelloworldMapper helloworldDao=session.getMapper(HelloworldMapper.class);
List<Helloworld> hws=helloworldDao.selectAll();
备注:从ibatis到mybatis改变的东西我还在收集当中。