1.持久化与ORM
持久化是数据在内存与硬盘间相互转化的过程
ORM即对象关系映射
程序员使用面向对象的思维方式处理数据,每个对象都是一个pojo。但是保存数据的时候,却以关系型数据库的方式存储。所以在持久化的过程中编码会很复杂,比如jdbc的存取数据——要自己拆分每个字段,然后存入数据库,或者从数据库拿到ResultSet然后转变成泛型。
而对象关系映射使得程序变得简单了。通过xml配置,发条sql就能拿到pojo泛型,或者给个对象就能存入数据库。
2.mybatis基本构成
SqlSessionFactoryBuilder(构建器):生成SqlSessionFactory(工厂接口)
SqlSessionFactory:生成SqlSession(会话)
SqlSession:可以直接发送SQL并返回结果,也可以获取Mapper的接口
SQLMapper:由Java接口和XML文件(或注解)组成,负责发送SQL执行并返回结果
3.mybatis大配置
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!--引入 jdbc.properties--> 7 <properties resource="jdbc.properties"/> 8 <settings> 9 <setting name="logImpl" value="LOG4J"/> 10 <!--<setting name="lazyLoadingEnabled" value="true"/>--> 11 <!--<setting name="aggressiveLazyLoading" value="false"/>--> 12 <!--<setting name="autoMappingBehavior" value="NONE"/>--> 13 </settings> 14 <!--别名--> 15 <typeAliases> 16 <package name="cn.sohappy.bean"/> 17 </typeAliases> 18 <!--DB connection info,配置mybatis多套运行环境--> 19 <environments default="development"> 20 <environment id="development"> 21 <!--采用jdbc事务管理,JDBC,MANAGED,自定义--> 22 <transactionManager type="JDBC"/> 23 <dataSource type="POOLED"> 24 <property name="driver" value="${jdbc.driver}"/> 25 <property name="url" value="${jdbc.url}"/> 26 <property name="username" value="${jdbc.username}"/> 27 <property name="password" value="${jdbc.password}"/> 28 </dataSource> 29 </environment> 30 </environments> 31 <!--大配置关联小配置--> 32 <mappers> 33 <mapper resource="cn/sohappy/dao/IUserDAO.xml"/> 34 <!--<package name="cn.happy.dao"/>--> 35 </mappers> 36 </configuration>
开始一个简单的例子,感受一下mybatis的便捷。
接口:
1 package cn.sohappy.dao; 2 3 import cn.sohappy.bean.Smbms_user; 4 5 public interface IUserDAO { 6 Smbms_user isLogin(Smbms_user user); 7 }
XML:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="cn.sohappy.dao.IUserDAO"> 6 <select id="isLogin" resultType="bean_user"> 7 select * from smbms_user where userCode=#{usercode} and userPassword=#{userpassword} 8 </select> 9 </mapper>
调用:
1 @Test 2 public void test01(){ 3 SqlSession session = MyBatisUtil.getSession(); 4 try{ 5 cn.sohappy.dao.IUserDAO mapper = session.getMapper(IUserDAO.class); 6 System.out.println(mapper.isLogin(new Smbms_user())); 7 }finally { 8 session.close(); 9 } 10 }
4.生命周期
SqlSessionFactoryBuilder(构建器):用过即丢,只要创建了SqlSessionFactory,SqlSessionFactoryBuilder就失去了价值,将被回收。
SqlSessionFactory:创建SqlSession,所以该对象存在于Mybatis整个生命周期中。每次创建SqlSessionFactory都会打开数据库连接资源(Connection),为了避免数据库连接资源消耗殆尽,SqlSessionFactory是单例的。
SqlSession:SqlSession是一个线程不安全的对象。其生命周期存在于请求数据库处理事物的过程中,随着session.close()而结束。每个SqlSession都会占用数据库连接池的活动资源,所以事物处理完毕后应该即使关闭session。
Mapper:Mapper是一个接口,没有实现类。只能调用接口的方法,作用是发送SQL并返回结果或者更新数据库数据。存在于某个sqlSession事物方法之内,是方法级别的。