一、配置pom.xml
<?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.xinxue.mabatis2</groupId>
<artifactId>mabatis_day2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 配置 mybatis 核心依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- 导入log4j 日志包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
二、配置日志文件和映射文件
日志文件
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=warn, stdout
log4j.logger.com.xingxue=debug
映射文件
<?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> <!-- 配置的SqlMapConfig.xml文件 称为 核心配置文件(mybatis 框架运行时要首先加载该配置文件)--> <!-- 1.事务管理 2.连接池 2.1 配置 连接数据库的连接信息(url user password driver) 3.引入外部的映射文件--> <environments default="d1"> <environment id="d1"> <!--1.JDBC 事务管理--> <transactionManager type="JDBC"></transactionManager> <!-- 2.连接池--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///xingxue27"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 3.引入外部的映射文件--> <mappers> <mapper resource="com/xingxue/mybatis/mapper/ClassMapper.xml"/> <mapper resource="com/xingxue/mybatis/mapper/StudentMapper.xml"/> </mappers> </configuration>
三、写好帮助类
package com.xingxue.mybatis.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SessionUtil {
private static final SqlSessionFactory factory;
static {
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("SqlMapConfig.xml"));
}catch (Exception e){
throw new RuntimeException(e);
}
}
public static SqlSession getSession(){
return factory.openSession();
}
}
四、model 的关联属性 就是一张表去关联上另一张表
package com.xingxue.mybatis.model;
import java.util.List;
public class ClassModel {
private Long cid;
private String description;
private String cname;
//关联属性
private List<StudentModel> students; 这个关联属性在数据库表里面是没有的字段,只是这里来关联上 实际业务中是单表关联就可以了
public List<StudentModel> getStudents() {
return students;
}
public void setStudents(List<StudentModel> students) {
this.students = students;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Long getCid() {
return cid;
}
public void setCid(Long cid) {
this.cid = cid;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "ClassModel{" +
"cid=" + cid +
", description='" + description + '\'' +
", cname='" + cname + '\'' +
'}';
}
}
package com.xingxue.mybatis.model;
public class StudentModel {
private Long sid;
private String sname; private Integer age; private Long cid;
//关联属性 private ClassModel cm;
public ClassModel getCm() { return cm; } public void setCm(ClassModel cm) { this.cm = cm; } public Long getSid() { return sid; } public void setSid(Long sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Long getCid() { return cid; } public void setCid(Long cid) { this.cid = cid; } @Override public String toString() { return "StudentModel{" + "sid=" + sid + ", sname='" + sname + '\'' + ", age=" + age + ", cid=" + cid + '}'; }}
五。前面写好就OK了,后面就来写接口,SQL 以及测试
查询班级的信息
package com.xingxue.mybatis.mapper;
import com.xingxue.mybatis.model.ClassModel;
public interface ClassMapper {
//通过班级的id 查询出班级的信息以及班级所有关联的学生信息?
//查两张表,连表
ClassModel getClassById(Long id);
}
对应的SQL配置类型
<?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.xingxue.mybatis.mapper.ClassMapper">
<!--resultMap 标签: 用于自定义 数据封装类型-->
<resultMap id="basic_map" type="com.xingxue.mybatis.model.ClassModel">
<!--映射ClassModel 对应的TB_class表中的主键-->
<id property="cid" column="cid"></id>
<!--映射ClassModel 对应的TB_class表中的一般字段-->
<result property="description" column="description"/>
<result property="cname" column="cname"/>
<!--映射ClassModel 关联属性:如果关联属性类型是集合:使用 collection标签来映射, ofType 属性来表示集合中存的元素的类型-->
<collection property="students" ofType="com.xingxue.mybatis.model.StudentModel">
<!--映射StudentModel 对应的TB_student表中的主键-->
<id property="sid" column="sid"/>
<!--映射StudentModel 对应的TB_student表中的一般字段-->
<result property="sname" column="sname"/>
<result property="age" column="age"/>
</collection>
</resultMap>
<!--select 标签中有 resultMap 属性:该属性用于引用自定义的 resultMap 标签的 封装类型-->
<select id="getClassById" resultMap="basic_map">
SELECT
c.*,s.sname,s.age,s.sid
FROM
tb_class c,
tb_student s
WHERE
c.cid = s.cid
AND c.CID = #{id}
</select>
</mapper>
学生的信息
package com.xingxue.mybatis.mapper;
import com.xingxue.mybatis.model.StudentModel;
public interface StudentMapper {
StudentModel getStudentById(Long id);
}
<?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 是相对应的路径
<resultMap id="basic_map2" type="com.xingxue.mybatis.model.StudentModel">
<!--映射StudentModel 对应的TB_student表中的主键-->
<id property="sid" column="sid"/>
<!--映射StudentModel 对应的TB_student表中的一般字段-->
<result property="sname" column="sname"/>
<result property="age" column="age"/>
<!--映射关联属性:如果关联属性不是集合,是一个单个的对象,请使用association 标签 cm 关联属性,是什么类型呢 javaType属性来描述它 -->
<association property="cm" javaType="com.xingxue.mybatis.model.ClassModel">
<id property="cid" column="cid"></id>
<!--映射ClassModel 对应的TB_class表中的一般字段-->
<result property="description" column="description"/>
<result property="cname" column="cname"/>
</association>
</resultMap>
因为我们都没有一个很好的模型类接受我们查询出来的类型,所以我们就自定义一个关联的类型来接受
<select id="getStudentById" resultMap="basic_map2">
SELECT s.*,c.cname,c.description FROM tb_class c, tb_student s WHERE c.CID = s.CID AND s.SID = #{id}
</select>
</mapper>
<mapper namespace="com.xingxue.mybatis.mapper.StudentMapper"> <!--resultMap 标签: 用于自定义 数据封装类型-->
最后 测试
package com.xingxue.mybatis.test;
import com.xingxue.mybatis.mapper.ClassMapper;
import com.xingxue.mybatis.mapper.StudentMapper;
import com.xingxue.mybatis.model.ClassModel;
import com.xingxue.mybatis.model.StudentModel;
import com.xingxue.mybatis.util.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
public class App {
public static void main(String[] args) throws IOException {
SqlSession session = SessionUtil.getSession();
ClassMapper mapper = session.getMapper (ClassMapper.class);
ClassModel classById = mapper.getClassById (1L);
System.out.println (classById );
/* StudentMapper mapper = session.getMapper(StudentMapper.class);
StudentModel studentById = mapper.getStudentById (1L);
System.out.println(studentById);
System.out.println (studentById.getCm () );*/
}
}