回顾 ------------- 1、JVM runtime data area. a.method area 方法区,永久区,metaspace , 共享 b.heap 堆区,共享 heap = young代 + old代理 young = 伊甸区 + 幸存区 幸存区 = 幸存一区(from) + 幸存二区(to),内存碎片整理 所有对象诞生于伊甸区。 heap //堆 non-heap //非堆 , metaspace off-heap //离堆 , os - jvm //ByteBuffer.allocateDirect(1024) ; cleaner -Xms //堆初始值 -Xmx //堆最大值 -Xmn //年轻代大小 -XX:NewSize -XX:MaxNewSize -XX:NewRatio //年老代是年轻代的倍数 -XX:SurvivorRatio //伊甸区是单个幸存区的倍数 -Xloggc:<file> // c.java stack 线程,StackFrame(method frame) , push | pop 死递归 , -Xss1m d.native method stack e.program couter register System.gc() 没有任何指针能够直接或间接到达他。 jvisualvm jconsole jmap 2、ClassLoader 类加载器,将类型映射到路径,加载对应字节码文件到内存的方法区。 三级类加载机制,Bootstrap(核心类) -> ExtClassLoader(jreextxxx.jar) -> AppClassLoader extends ClassLoader{ findClass(){ defineClass(byte[] .. ) ; } } 2、mybatis sql映射,oop方式访问jdbc。 实现mybatis的一对多关联关系 --------------------------- 1、修改Customer.class,增加集合属性 class Customer{ ... private List<Order> orders = new ArrayList<Order>(); //get/set } 2、修改CustomerMapper.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="customers"> <insert id="insert"> insert into customers(name, age) values(#{name} , #{age}) </insert> <update id="update"> update customers set name = #{name} , age = #{age} where id = #{id} </update> <delete id="deleteOne"> delete from customers where id = #{id} </delete> <delete id="deleteAll"> delete from customers </delete> <select id="selectOne" resultMap="rmCustomer"> SELECT c.id cid , c.name cname , c.age cage , o.id oid , o.orderno oorderno, o.price oprice, o.cid ocid FROM customes c left outer join orders o ON c.id = o.cid WHERE c.id = #{id} </select> <select id="selectAll" resultType="_Customer"> select * from customers </select> <resultMap id="rmCustomer" type="_Customer"> <id column="cid" property="id" /> <result column="cname" property="name" /> <result column="cage" property="age" /> <collection property="orders" ofType="_Order" column="ocid"> <id column="oid" property="id" /> <result column="oorderno" property="orderNo" /> <result column="oprice" property="price"/> </collection> </resultMap> </mapper> 3、测试 @Test public void testSelectOne() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Customer c = s.selectOne("customers.selectOne" , 6) ; s.commit(); s.close(); } 4、 自关联 ----------------- 树形图 : 全国 |---河北省 |---保定 |---张家口 |---河南省 |--驻马店 |---开封 1.设计表 create table areas(id int primary key auto_increment , areaname varchar(20) , pid int) ; 2.创建Area类 public class Area { private Integer id ; private String areaName ; private Area parentArea ; //get/set } 3.映射文件 <?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="areas"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> insert into areas(areaname , pid) values(#{areaName} , #{parentArea.id}) </insert> </mapper> 4.配置文件 <?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> <properties> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/big10"/> <property name="username" value="root"/> <property name="password" value="root"/> </properties> <!-- 定义类型别名 --> <typeAliases> <typeAlias type="com.oldboy.mybatis.domain.Customer" alias="_Customer" /> <typeAlias type="com.oldboy.mybatis.domain.Order" alias="_Order" /> <typeAlias type="com.oldboy.mybatis.domain.Area" alias="_Area" /> </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="CustomerMapper.xml"/> <mapper resource="OrderMapper.xml"/> <mapper resource="AreaMapper.xml"/> </mappers> </configuration> 5.插入 @Test public void testInsert() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Area a1 = new Area("quanguo") ; Area a2 = new Area("hebeisheng" , a1) ; Area a3 = new Area("henansheng", a1) ; Area a4 = new Area("baoding",a2) ; Area a5 = new Area("zhangjiakou", a2) ; Area a6 = new Area("zhumadian", a3) ; Area a7 = new Area("kaifeng", a3) ; s.insert("areas.insert" , a1); s.insert("areas.insert" , a2); s.insert("areas.insert" , a3); s.insert("areas.insert" , a4); s.insert("areas.insert" , a5); s.insert("areas.insert" , a6); s.insert("areas.insert" , a7); s.commit(); s.close(); } 实现自关联查询 ------------------ 1.查询自己和上级的信息 select s.id sid, s.areaname sname , p.id pid , p.areaname pname from areas s left outer join areas p on s.pid = p.id ; 2.编写AreaMapper.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="areas"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> insert into areas(areaname , pid) values(#{areaName} , #{parentArea.id}) </insert> <select id="selectOne" resultMap="rmArea"> select s.id sid, s.areaname sname , p.id pid , p.areaname pname from areas s left outer join areas p on s.pid = p.id WHERE s.id = #{id} </select> <resultMap id="rmArea" type="_Area"> <id column="sid" property="id" /> <result column="sname" property="areaName" /> <association property="parentArea" column="pid" javaType="_Area"> <id column="pid" property="id" /> <result column="pname" property="areaName"/> </association> </resultMap> </mapper> 3.实现查询 @Test public void testSelectOne() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Area a1 = s.selectOne("areas.selectOne" , 2) ; s.commit(); s.close(); } 实现自关联的下级查询 ---------------------- 1.增加Area的集合属性 public class Area { ... //所辖区域集合 private List<Area> children ; //get/set } 2.映射文件 <?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="areas"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> insert into areas(areaname , pid) values(#{areaName} , #{parentArea.id}) </insert> <select id="selectOne" resultMap="rmArea"> select p.id pid, p.areaname pname , s.id sid , s.areaname sname , c.id cid , c.areaname cname from areas s left outer join areas p on s.pid = p.id left outer join areas c on c.pid = s.id where s.id = #{id} </select> <select id="selectAll" resultMap="rmArea"> select p.id pid, p.areaname pname , s.id sid , s.areaname sname , c.id cid , c.areaname cname from areas s left outer join areas p on s.pid = p.id left outer join areas c on c.pid = s.id </select> <resultMap id="rmArea" type="_Area"> <id column="sid" property="id" /> <result column="sname" property="areaName" /> <association property="parentArea" column="pid" javaType="_Area"> <id column="pid" property="id" /> <result column="pname" property="areaName"/> </association> <collection property="children" column="sid" ofType="_Area"> <id column="cid" property="id"/> <result column="cname" property="areaName"/> </collection> </resultMap> </mapper> 3. public void testSelectOne() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Area a1 = s.selectOne("areas.selectOne" , 2) ; s.commit(); s.close(); } @Test public void testSelectAll() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; List<Area> list = s.selectList("areas.selectAll" ) ; s.commit(); s.close(); } 一对一关系 --------------- 1.创建husband,wife表。 [主键关联] 原理是一张表的主键和另外外一张表相一致。 create table husbands(id int primary key auto_increment , hname varchar(20)) ; create table wifes(id int , wname varchar(20)) ; [外键关联] 原理等同于多对一关联关系。 2.创建类 //丈夫类 public class Husband { private Integer id ; private String hname ; //一对一关联关系 private Wife wife ; } //妻子类 public class Wife { private Integer id ; private String wname ; //双向一对一关联 private Husband husband ; ... } 3.映射文件 [丈夫] <?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="husbands"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> insert into husbands(hname) values(#{hname}) </insert> <select id="selectOne" resultMap="rmHusband"> select h.id hid , h.hname hname , w.wname wname FROM husbands h left outer join wifes w on h.id = w.id where h.id = #{id} </select> <resultMap id="rmHusband" type="_Husband"> <id column="hid" property="id" /> <result column="hname" property="hname" /> <association property="wife" column="hid" javaType="_Wife"> <result column="wname" property="wname" /> <association property="husband" column="hid" javaType="_Husband"> <id column="hid" property="id"/> <result column="hname" property="hname"/> </association> </association> </resultMap> </mapper> [妻子] <?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="wifes"> <insert id="insert"> insert into wifes(id , wname) values(#{husband.id} , #{wname}) </insert> </mapper> 4.配置文件 <?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> <properties> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/big10"/> <property name="username" value="root"/> <property name="password" value="root"/> </properties> <!-- 定义类型别名 --> <typeAliases> <typeAlias type="com.oldboy.mybatis.domain.Customer" alias="_Customer" /> <typeAlias type="com.oldboy.mybatis.domain.Order" alias="_Order" /> <typeAlias type="com.oldboy.mybatis.domain.Area" alias="_Area" /> <typeAlias type="com.oldboy.mybatis.domain.Husband" alias="_Husband" /> <typeAlias type="com.oldboy.mybatis.domain.Wife" alias="_Wife" /> </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="CustomerMapper.xml"/> <mapper resource="OrderMapper.xml"/> <mapper resource="AreaMapper.xml"/> <mapper resource="HusbandMapper.xml"/> <mapper resource="WifeMapper.xml"/> </mappers> </configuration> 5.测试 @Test public void testInsert() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Husband h = new Husband(); h.setHname("huangxiaoming"); Wife w = new Wife(); w.setHusband(h); w.setWname("ab"); s.insert("husbands.insert" , h) ; s.insert("wifes.insert" , w) ; s.commit(); s.close(); } @Test public void testSelectOne() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Husband h = s.selectOne("husbands.selectOne",1); s.commit(); s.close(); } 多对多关系 ----------------- 1.创建表 create table teas(id int primary key auto_increment , tno varchar(20)) ; create table stus(id int primary key auto_increment , sno varchar(20)) ; create table links(tid int , sid int) ; 2.创建类 [Tea] /** * 教师类 */ public class Tea { private Integer id ; private String tno ; private List<Stu> stus = new ArrayList<Stu>(); } [Stu] /** * 学生类 */ public class Stu { private Integer id ; private String sno ; private List<Tea> teas = new ArrayList<Tea>(); } 3.映射文件 [TeaMapper.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="teas"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> insert into teas(tno) values(#{tno}) </insert> <insert id="insertLinks"> <foreach collection="stus" item="s"> insert into links(tid,sid) values(#{id} , #{s.id}); </foreach> </insert> <select id="selectOne" resultMap="rmTea"> select t.id tid , t.tno tno , s.id sid , s.sno sno from teas t left outer join links l on l.tid = t.id left outer join stus s on s.id = l.sid where t.id = #{id} </select> <resultMap id="rmTea" type="_Tea"> <id column="tid" property="id"/> <result column="tno" property="tno" /> <collection property="stus" ofType="_Stu" column="tid"> <id column="sid" property="id" /> <result column="sno" property="sno" /> </collection> </resultMap> </mapper> [StuMapper.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="stus"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> insert into stus(sno) values(#{sno}) </insert> </mapper> 4.修改配置文件,添加执行多条语句支持 <?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> <properties> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/big10?allowMultiQueries=true"/> <property name="username" value="root"/> <property name="password" value="root"/> </properties> <!-- 定义类型别名 --> <typeAliases> <typeAlias type="com.oldboy.mybatis.domain.Customer" alias="_Customer" /> <typeAlias type="com.oldboy.mybatis.domain.Order" alias="_Order" /> <typeAlias type="com.oldboy.mybatis.domain.Area" alias="_Area" /> <typeAlias type="com.oldboy.mybatis.domain.Husband" alias="_Husband" /> <typeAlias type="com.oldboy.mybatis.domain.Wife" alias="_Wife" /> <typeAlias type="com.oldboy.mybatis.domain.Tea" alias="_Tea" /> <typeAlias type="com.oldboy.mybatis.domain.Stu" alias="_Stu" /> </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="CustomerMapper.xml"/> <mapper resource="OrderMapper.xml"/> <mapper resource="AreaMapper.xml"/> <mapper resource="HusbandMapper.xml"/> <mapper resource="WifeMapper.xml"/> <mapper resource="TeaMapper.xml"/> <mapper resource="StuMapper.xml"/> </mappers> </configuration> 5.测试类 package com.oldboy.mybatis.test; import com.oldboy.mybatis.domain.Husband; import com.oldboy.mybatis.domain.Stu; import com.oldboy.mybatis.domain.Tea; import com.oldboy.mybatis.domain.Wife; 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 org.junit.Test; import java.io.InputStream; /** * 测试多对多 */ public class TestMany2Many { @Test public void testInsert() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Stu s1 = new Stu("s1") ; Stu s2 = new Stu("s2") ; Stu s3 = new Stu("s3") ; Stu s4 = new Stu("s4") ; Tea t1 = new Tea("t1"); Tea t2 = new Tea("t2"); t1.addStus(s1 ,s2 , s3); t2.addStus(s2 , s3 , s4); s.insert("stus.insert" , s1); s.insert("stus.insert" , s2); s.insert("stus.insert" , s3); s.insert("stus.insert" , s4); s.insert("teas.insert" , t1); s.insert("teas.insert" , t2); s.insert("teas.insertLinks" , t1); s.insert("teas.insertLinks" , t2); s.commit(); s.close(); } @Test public void testSelectOne() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ; SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ; SqlSession s = f.openSession() ; Tea t = s.selectOne("teas.selectOne" , 3) ; s.commit(); s.close(); } }