MyBatis

一.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。

三.关于对象的生命周期:

  1. SqlSessionFactoryBuilder的作用是创建SqlSessionFactiory,在创建完成后就会被回收,所以它的生命周期只存在于局部方法。
  2. SqlSessionFactiory是单例的,作用就是创建SqlSession,每次访问数据库都需要一个SqlSession,所以SqlSessionFactiory的生命周期是贯穿整个Mybatis生命周期的,SqlSessionFactiory采用单例的原因是减少数据库连接资源。
  3. SqlSession是一个会话,类似于jdbc的connection,它的生命周期是在请求数据库处理事务过程中,他是一个线程不安全的对象。多线程操作时因多注意他的隔离级别和数据库锁等。SqlSession使用需及时关闭。
  4. 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();
			}
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值