1.包结构
2.pom配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zy</groupId> <artifactId>mybatis03</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.21</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.16</version> </dependency> </dependencies> </project>
3.main目录下
3.1java目录下
3.1.1model层
===================stu类========================== package com.zy.model; import java.io.Serializable; /** * Created by Administrator on 2018/6/27. */ public class Stu implements Serializable{ private Integer id; private String name; private Integer age; @Override public String toString() { return "Stu{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Stu() { } public Stu(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } } =========================classinfo类================= package com.zy.model; import java.io.Serializable; /** * Created by Administrator on 2018/6/29. */ public class ClassInfo implements Serializable { private Integer id; private String className; @Override public String toString() { return "ClassInfo{" + "id=" + id + ", className='" + className + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public ClassInfo() { } public ClassInfo(Integer id, String className) { this.id = id; this.className = className; } } ==============score类============================ package com.zy.model; import java.io.Serializable; /** * Created by Administrator on 2018/6/29. */ public class Score implements Serializable { private Integer id; private String sub; private Integer score; private Integer sId; public Integer getsId() { return sId; } public void setsId(Integer sId) { this.sId = sId; } public Score(Integer id, String sub, Integer score, Integer sId) { this.id = id; this.sub = sub; this.score = score; this.sId = sId; } @Override public String toString() { return "Score{" + "id=" + id + ", sub='" + sub + '\'' + ", score=" + score + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getSub() { return sub; } public void setSub(String sub) { this.sub = sub; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public Score() { } public Score(Integer id, String sub, Integer score) { this.id = id; this.sub = sub; this.score = score; } }
3.1.2dto层
==========studto类=================== package com.zy.dto; import com.zy.model.ClassInfo; import com.zy.model.Stu; /** * Created by Administrator on 2018/6/29. */ public class StuDto extends Stu { private ClassInfo classInfo; public ClassInfo getClassInfo() { return classInfo; } public void setClassInfo(ClassInfo classInfo) { this.classInfo = classInfo; } public StuDto() { } public StuDto(ClassInfo classInfo) { this.classInfo = classInfo; } @Override public String toString() { return super.toString() + classInfo; } } ============classinfodto类========================== package com.zy.dto; import com.zy.model.ClassInfo; import com.zy.model.Stu; /** * Created by Administrator on 2018/6/29. */ public class ClassInfoDto extends ClassInfo { private Stu stu; public ClassInfoDto(Stu stu) { this.stu = stu; } public ClassInfoDto() { } @Override public String toString() { return "ClassInfoDto{" + "stu=" + stu + '}'; } public Stu getStu() { return stu;package com.zy.dto; import com.zy.model.Score; import com.zy.model.Stu; import java.util.List; /** * Created by Administrator on 2018/6/29. */ public class ScoreDto extends Stu { private List<Score> list; @Override public String toString() { return "ScoreDto{" + "list=" + list + "} " + super.toString(); } public List<Score> getList() { return list; } public void setList(List<Score> list) { this.list = list; } public ScoreDto(List<Score> list) { this.list = list; } public ScoreDto() { } } } public void setStu(Stu stu) { this.stu = stu; } } ==================ScoreDto类==================
3.1.3mapper层
===============StuMapper接口=================== package com.zy.mapper; import com.zy.dto.ClassInfoDto; import com.zy.dto.ScoreDto; import com.zy.model.Stu; import org.apache.ibatis.annotations.Param; import java.util.List; /** * Created by Administrator on 2018/6/27. */ public interface StuMapper { // 根据班级id获取学生信息 List<Stu> getStuByClassId(@Param("id") Integer id); // 分步查询(一对一):即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载 List<ClassInfoDto> getStuByClassIdStep(@Param("id") Integer id); // 分步查询(一对多):即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载 List<ScoreDto> getStuByScoreStep(@Param("id") Integer id); } ===================ClassInfoMapper接口================= package com.zy.mapper; import com.zy.model.ClassInfo; import org.apache.ibatis.annotations.Param; /** * Created by Administrator on 2018/6/29. */ public interface ClassInfoMapper { // 根据班级id查询班级信息 ClassInfo getClassById(@Param("cid") Integer id); } ==================ScoreMapper接口============= 由于是最后一层,可写可不写方法,但接口一定要定义!!!!!!!!!!!!!!!
3.1.4util层(用于Junit测试)
package com.zy.util; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; /** * Created by Administrator on 2018/6/27. */ public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory; static { InputStream is = MybatisUtil.class.getClassLoader().getResourceAsStream("sqlMappingConfig.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } /*定义或者sqlSession的方法*/ public static SqlSession getSqlSession() { SqlSession sqlSession = threadLocal.get(); if (sqlSession == null) { sqlSession = sqlSessionFactory.openSession(true); threadLocal.set(sqlSession); } return sqlSession; } /*定义关闭方法*/ public static void closeSqlSession(){ SqlSession sqlSession = threadLocal.get(); if(sqlSession != null){ sqlSession.close(); threadLocal.remove(); } } }
3.2resources目录下
3.2.1sqlMappingConfig.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> <!--读取配置文件--> <properties resource="db.properties"/> <!--设置全局配置环境--> <settings> <!--开启全局缓存--> <setting name="cacheEnabled" value="true"/> <!--开启懒加载--> <setting name="lazyLoadingEnabled" value="true"/> <!--根据对象触发配置需要关闭--> <setting name="aggressiveLazyLoading" value="false"/> </settings> <!--配置别名:不推荐使用--> <typeAliases></typeAliases> <!--配置数据库环境--> <environments default="mysql_dev"> <environment id="mysql_dev"> <!--事务管理--> <transactionManager type="JDBC"></transactionManager> <!--数据库--> <!--POOLED,UNPOOLED,JNDI--> <dataSource type="POOLED"> <property name="url" value="${jdbc.url}"/> <property name="driver" value="${jdbc.driver}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--映射文件,mappers:将sql映射注册到全局配置中--> <mappers> <package name="com.zy.mapper"/> </mappers> </configuration>
3.2.2db.properties配置
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/atguigu_mybatis jdbc.username=root jdbc.password=123456 orcl.driver=oracle.jdbc.OracleDriver orcl.url=jdbc:oracle:thin:@localhost:1521:orcl orcl.username=zhang orcl.password=123456
3.2.3其他xml配置
=============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"> <!-- namespace:名称空间;指定为接口的全类名 id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取出id值 public Employee getEmpById(Integer id); --> <!--namespace必须是EmployeeMapper的全限定名--> <mapper namespace="com.zy.mapper.StuMapper"> <!--配置resultMap:关联查询--> <resultMap id="stuResultMap" type="com.zy.dto.StuDto"> <!--如果是date类型的变量,此处的jdbcType必须配置为TIMESTAMP--> <id column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="INTEGER"/> <association property="classInfo" javaType="com.zy.model.ClassInfo"> <id column="id" property="id"/> <result column="className" property="className"/> </association> </resultMap> <!--配置resultMap(一对一):分步查询--> <resultMap id="stuResultMapStep" type="com.zy.dto.StuDto"> <!--如果是date类型的变量,此处的jdbcType必须配置为TIMESTAMP--> <id column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="INTEGER"/> <association property="classInfo" javaType="com.zy.model.ClassInfo" select="com.zy.mapper.ClassInfoMapper.getClassById" column="cid"/> </resultMap> <!--配置resultMap(一对多):分步查询--> <resultMap id="stuResultMapScoreStep" type="com.zy.dto.ScoreDto"> <!--如果是date类型的变量,此处的jdbcType必须配置为TIMESTAMP--> <id column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="INTEGER"/> <collection property="list" ofType="com.zy.model.Score" select="com.zy.mapper.ScoreMapper.getScoreById" column="id" /> </resultMap> <!--==================查询结果区====================--> <!--// 根据班级id获取学生信息 Stu getStuByClassId(Integer id);--> <select id="getStuByClassId" resultMap="stuResultMap"> SELECT s.id id,s.`name` name,s.age age,c.className className from t_stu s LEFT JOIN t_classinfo c on s.cId = c.id where c.id = #{id} </select> <!--// 分步查询:即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载 List<Stu> getStuByClassIdStep(@Param("id") Integer id);--> <select id="getStuByClassIdStep" resultMap="stuResultMapStep"> select * from t_stu where id=#{id} </select> <!--// 分步查询(一对多):即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载 List<Stu> getStuByScoreStep(@Param("id") Integer id);--> <select id="getStuByScoreStep" resultMap="stuResultMapScoreStep"> select * from t_stu where id=#{id} </select> </mapper> ===================ClassInfoMapper.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="com.zy.mapper.ClassInfoMapper"> <select id="getClassById" resultType="com.zy.model.ClassInfo"> select * from classInfo where id = #{cid} </select> </mapper> ================ScoreMapper.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="com.zy.mapper.ScoreMapper"> <!--定义resultMap--> <resultMap id="myScoreResultMap" type="com.zy.model.Score"> <id column="id" property="id"/> <result column="sub" property="sub"/> <result column="score" property="score"/> <result column="sId" property="sId"/> </resultMap> <select id="getScoreById" resultMap="myScoreResultMap"> SELECT * from t_score where sId = #{id} </select> </mapper>
4.junit测试配置
import com.zy.dto.ClassInfoDto; import com.zy.dto.ScoreDto; import com.zy.mapper.StuMapper; import com.zy.model.Stu; import com.zy.util.MybatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; /** * Created by Administrator on 2018/6/29. */ public class StuTest { // 按照班级id查询 @Test public void testGetStuById() { // 获取sqlSession final SqlSession sqlSession = MybatisUtil.getSqlSession(); // 获取mapper StuMapper mapper = sqlSession.getMapper(StuMapper.class); // 调用mapper的增加方法 List<Stu> list = mapper.getStuByClassId(1); System.out.println(list); // 关闭资源 MybatisUtil.closeSqlSession(); } // 分步查询:即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载 @Test public void testGetStuByClassIdStep() { // 获取sqlSession final SqlSession sqlSession = MybatisUtil.getSqlSession(); // 获取mapper StuMapper mapper = sqlSession.getMapper(StuMapper.class); // 调用mapper的增加方法 List<ClassInfoDto> list = mapper.getStuByClassIdStep(1); System.out.println(list); // 关闭资源 MybatisUtil.closeSqlSession(); } // 分步查询:即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载 @Test public void testGetStuByScoreStep() { // 获取sqlSession final SqlSession sqlSession = MybatisUtil.getSqlSession(); // 获取mapper StuMapper mapper = sqlSession.getMapper(StuMapper.class); // 调用mapper的增加方法 List<ScoreDto> list = mapper.getStuByScoreStep(1); System.out.println(list); // 关闭资源 MybatisUtil.closeSqlSession(); } }