ORM:对象关系映射,它只是一种规则。
像MyBatis,Hibernate对jdbc进行了封装。
第一章 回顾JDBC开发
1.优点:简单易学,上手快,非常灵活构建SQL(自己写的),效率高。2.缺点:代码繁琐(各种try..catch..),难以写出高质量的代码(例如:资源的释放,SQL注入安全性等),开发者既要写业务逻辑,又要写对象(连接对象等)的创建和销毁,必须关注底层具体数据库的语法(例如:分页)(MySQL的分页和Oracle的分页语句不同)。3.适合于超大批量数据的操作,速度快。开发步骤:1.加载数据库的驱动Class.forName().2.通过DriverManager获取数据库的连接.3.通过Connection获取Statement或PreparedStatement.4.将SQL语句绑定到Statement或PreparedStatement中去,准备向数据库发送SQL语句.5.执行完SQL语句之后,返回对象的结果.ResultSet set = ps.executeQuery(查询)/int i = ps.executeUpdate(增/删/改),返回影响记录数.6.依次关闭连接对象ResultSet/Statement/Connection.如果上述操作需要非查询操作的话,还需要事务的支持,简单的写下代码.connection.setAutoCommit(false);connection.commit();connection.rollback();
第二章 回顾hibernate单表开发
1)优点:不用写SQL,完全以面向对象的方式设计和访问,不用管底层具体数据库的语法,(例如:分页)便于理解。2)缺点:处理复杂业务时,灵活度差, 复杂的HQL难写难理解,例如多表查询的HQL语句3)适合于中小批量数据的操作,速度慢。开发步骤:1.创建Configuration,加载src/hibernate.cfg.xml配置文件,该配置文件中又去加载xx.hbm.xml文件.2.通过Configuration创建SessionFactory.3.通过SessionFactory创建Session.4.通过Session创建Transaction5.如果做增删改的话一定要事务,如果做查询的话,事务可选.6.操作Session的常用API,例如:save()/update()/delete()/get().7.提交事务,出错后事务回滚.8.关闭Session.
第三章 什么是MyBatis,MyBatis有什么特点
1.基于上述二种支持,我们需要在中间找到一个平衡点,结合它们的优点,摒弃它们的缺点,这就是MyBatis,现今MyBatis被广泛的企业所采用。2.MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。3.iBatis一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)4.JDBC/DBUtils/Spring DAO,Hibernate/Spring ORM,MyBatis同属于ORM解决方案之一。第四章 MyBatis快速入门准备开发环境1.创建项目MyBatis_Study,普通的java项目或者是JavaWeb项目均可,如下图所示:
2.添加项目所需的两个主要jar包:mybatis-3.2.8.jar和mysql-connector-java-5.0.8-bin.jar,以及有关的日志包.
3.创建MySQL数据库和表.
SQL脚本如下:
创建表的语句不规范!!请自觉忽略。待我补规范语法,这个请自觉忽略
CREATE DATABASE mybatis;USE mybatis;CREATE TABLE student( id INT(5) PRIMARY KEY, NAME VARCHAR(10), sal DOUBLE(8,2))
执行此脚本,完成数据库和表的创建工作。
4.创建与数据库表对应的实体。
package com.winner.entity;/** * Created by winner_0715 on 2016/3/23. * student表对应的实体类 */public class Student { private Integer id;//最好使用包装类型 private String name; private Double sal;//最好使用包装类型 //无参构造方法必须有 public Student() { } public Student(Integer id, String name, Double sal) { this.id = id; this.name = name; this.sal = sal; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; }}
5.在entity目录下创建StudentMapper.xml配置文件,表示表和实体的映射关系,
(位置不一定非得放在实体目录中,命名建议是"实体类名+Mapper.xml"),
相当于Hibernate中的xxx.hbm.xml.
6.在src目录下添加Mybatis的配置文件mybatis-config.xml,
相当于Hibernate中的hibernate.cfg.xml,里面有数据库的链接信息。
db.properties
mysql.driver=com.mysql.jdbc.Drivermysql.url=jdbc:mysql://127.0.0.1:3306/mybatismysql.username=rootmysql.password=rootoracle.driver=oracle.jdbc.driver.OracleDriveroracle.url=jdbc:oracle:thin:@127.0.0.1:1521:orcloracle.username=scottoracle.password=tiger
7.在util目录下创建MyBatisUtil.java工具类
/** * Created by winner_0715 on 2016/3/23. * 工具类 */public class MybatisUtil { private static ThreadLocalthreadLocal = new ThreadLocal (); private static SqlSessionFactory sqlSessionFactory; /** * 这个工具类加载时加载mybatis.xml配置文件,注意路径。希望类加载的时候就加载配置文件 */ static{ try { Reader reader = Resources.getResourceAsReader("mybatis.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 禁止外界通过new方法创建 */ private MybatisUtil(){} /** * 获取SqlSession */ public static SqlSession getSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); //如果SqlSession对象为空 if(sqlSession == null){ //在SqlSessionFactory非空的情况下,获取SqlSession对象 sqlSession = sqlSessionFactory.openSession(); //将SqlSession对象与当前线程绑定在一起 threadLocal.set(sqlSession); } //返回SqlSession对象 return sqlSession; } /** * 关闭SqlSession与当前线程分开 */ public static void closeSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); //如果SqlSession对象非空 if(sqlSession != null){ //关闭SqlSession对象 sqlSession.close(); //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收 threadLocal.remove(); } } /** * 测试 */ public static void main(String[] args) { Connection conn = MybatisUtil.getSqlSession().getConnection(); System.out.println(conn!=null?"连接成功":"连接失败"); }}
8.在DAO目录下创建StudentDao.java类,这里就不使用接口了,实际项目中必须使用接口.
就像在Hibernate中使用的那样,DAO调用mybatis提供的有关方法完成对数据库的操作。
public class StudentDao { public void add1() throws Exception{ SqlSession sqlSession = null; try{ sqlSession = MybatisUtil.getSqlSession(); //事务开始(默认) //读取StudentMapper.xml映射文件中的SQL语句 int i = sqlSession.insert("com.winner.entity.StudentMapper.add1"); System.out.println("本次操作影响了"+i+"行"); //事务提交 sqlSession.commit(); }catch(Exception e){ e.printStackTrace(); //事务回滚 sqlSession.rollback(); throw e; }finally{ MybatisUtil.closeSqlSession(); } } public void add2(Student student) throws Exception{ SqlSession sqlSession = null; try{ sqlSession = MybatisUtil.getSqlSession(); //事务开始(默认) //读取StudentMapper.xml映射文件中的SQL语句 sqlSession.insert("com.winner.entity.StudentMapper.add2",student); //事务提交 sqlSession.commit(); }catch(Exception e){ e.printStackTrace(); //事务回滚 sqlSession.rollback(); throw e; }finally{ MybatisUtil.closeSqlSession(); } } public static void main(String[] args) throws Exception{ StudentDao dao = new StudentDao(); //dao.add1(); dao.add2(new Student(2,"lisi",3000d)); }}
想看log4j日志信息的话需要log4j的jar包,然后把log4j.properties放在src下
log4j.rootLogger=debug,stdout,logfilelog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.SimpleLayoutlog4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%nlog4j.logger.com.ibatis=DEBUGlog4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUGlog4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUGlog4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUGlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
mybatis工作流程
1.通过Reader对象读取src目录下的mybatis.xml配置文件(该文本的位置和名字可任意)2.通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象3.从当前线程中获取SqlSession对象4.事务开始,在mybatis中默认5.通过SqlSession对象读取StudentMapper.xml映射文件中的操作编号,从而读取sql语句6.事务提交,必写7.关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收