一.MyBatis是什么?
MyBatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发着只用关注sql本身,不用去关注例如注册驱动,加载链接,得到statement,处理结果集等复杂的过程。
mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。
二.工作原理
mybatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件,配置文件来源于两个方面:一个是xml,一个是Java中的注解,获取sqlSession。SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物的提交工作,用完之后关闭SQLSession。
三.关于对象的生命周期:
- SqlSessionFactoryBuilder的作用是创建SqlSessionFactiory,在创建完成后就会被回收,所以它的生命周期只存在于局部方法。
- SqlSessionFactiory是单例的,作用就是创建SqlSession,每次访问数据库都需要一个SqlSession,所以SqlSessionFactiory的生命周期是贯穿整个Mybatis生命周期的,SqlSessionFactiory采用单例的原因是减少数据库连接资源。
- SqlSession是一个会话,类似于jdbc的connection,它的生命周期是在请求数据库处理事务过程中,他是一个线程不安全的对象。多线程操作时因多注意他的隔离级别和数据库锁等。SqlSession使用需及时关闭。
- Mapper是一个接口,它的作用是发送SQL,返回结果,因此他的生命周期不会大于SqlSession
四.优/缺点
优点:
1、 与JDBC相比,减少了50%以上的代码量。
2、 MyBatis是最简单的持久化框架,小巧并且简单易学。
3.、MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。
4、 提供XML标签,支持编写动态SQL语句。
5、提供映射标签,支持对象与数据库的ORM字段关系映射。
缺点:
1、 SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
2、SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
四.MyBatis框架适用场合:
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。
对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。
五.配置
结构如图
resources下:
mybatis-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>
<!-- 引入db.properties文件 -->
<properties resource="db.properties"/>
<!-- 配置日志实现为LOG4J -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/kgc/dao/GradeMapper.xml"/>
</mappers>
</configuration>
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/kd31?characterEncoding=utf-8
jdbc.user=root
jdbc.password=abc123
log4j.properties
log4j.rootLogger=DEBUG,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.smbms.dao=debug
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
log4j.logger.java.sql.ResultSet=debug
log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug
######################################################################################
# Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n
######################################################################################
# DailyRolling File \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=error
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
log4j.logger.com.opensymphony.xwork2=error
src下:
GradeMapper.java
package cn.kgc.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.kgc.pojo.Grade;
public interface GradeMapper {
int add(Grade grade);
int del(Integer gid);
void upd(Grade grade);
Grade getGradeById(Integer gid);
List getGradeList();
}
GradeMapper.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="cn.kgc.dao.GradeMapper">
<insert id="add" parameterType="cn.kgc.pojo.Grade" useGeneratedKeys="true" keyProperty="gid">
insert into grade(gid,gname)values(#{gid},#{gname})
</insert>
<delete id="del" parameterType="Integer" >
delete from grade where gid=#{id}
</delete>
<update id="upd" parameterType="cn.kgc.pojo.Grade" >
update grade set gid=#{gid},gname=#{gname} where gid=#{gid}
</update>
<select id="getGradeById" parameterType="Integer" resultType="cn.kgc.pojo.Grade">
select * from grade where gid=#{gid}
</select>
<select id="getGradeList" resultType="cn.kgc.pojo.Grade">
select * from grade
</select>
</mapper>
Grade.java
package cn.kgc.pojo;
public class Grade {
private Integer gid;
private String gname;
public Grade() {
super();
// TODO Auto-generated constructor stub
}
public Grade(Integer gid, String gname) {
super();
this.gid = gid;
this.gname = gname;
}
public Integer getGid() {
return gid;
}
public void setGid(Integer gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
@Override
public String toString() {
return "Grade [gid=" + gid + ", gname=" + gname + "]";
}
}
test测试类:
package cn.kgc.test;
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;
import cn.kgc.dao.GradeMapper;
import cn.kgc.pojo.Grade;
public class testGrade {
public static void main(String[] args) {
SqlSession sqlSession=null;
try {
InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(stream);
sqlSession = ssf.openSession();
Grade grade = sqlSession.getMapper(GradeMapper.class).getGradeById(101);
sqlSession.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}