一、环境搭建
1.tomat:Apache Tomcat® - Welcome!
2.JDK:Java Downloads | Oracle
3.小皮(mysql):Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn)
4.SQLyong:SQLyog - Download (softonic.com)
二、声明
多对一,一对多 的应用
三、项目基础搭建及jar包导入
四、代码编写
1.dao层
ClassesMapper.java
package cn.lexed.dao;
import cn.lexed.pojo.Classes;
import cn.lexed.pojo.Student;
public interface ClassesMapper {
//根据班级id查询对应的学生信息 以及班级信息
public Classes getClasses(int cid);
}
StudentMapper.java
package cn.lexed.dao;
import cn.lexed.pojo.Student;
public interface StudentMapper {
//根据学生id去查询对应的班级形象
public Student getStu(int sid);
}
ClassesMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.lexed.dao.ClassesMapper">
<select id="getClasses" resultMap="getc" parameterType="int">
select * from classes c,student s where s.c_id=c.c_id and c.c_id=#{c_id}
</select>
<resultMap type="Classes" id="getc">
<id column="c_id" property="cid"/>
<result column="c_name" property="cname"/>
<collection property="students" ofType="Student">
<id column="s_id" property="sid"/>
<result column="s_name" property="sname"/>
</collection>
</resultMap>
</mapper>
StudentMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.lexed.dao.StudentMapper">
<select id="getStu" resultMap="getS" parameterType="int">
select * from student s,classes c where s.c_id=c.c_id and s.s_id=#{s_id}
</select>
<resultMap type="Student" id="getS">
<id column="s_id" property="sid"/>
<result column="s_name" property="sname"/>
<association property="classes" javaType="Classes">
<id column="c_id" property="cid"/>
<result column="c_name" property="cname"/>
</association>
</resultMap>
</mapper>
2.pojo
Classes
package cn.lexed.pojo;
import java.util.List;
import java.util.Set;
//一对多 一个老师对应多个班级
//多对一 多个班级对应一个老师
public class Classes {
private int cid;
private String cname;
//一对多
private List<Student> students;
public Classes() {
super();
}
public Classes(int cid, String cname, List<Student> students) {
super();
this.cid = cid;
this.cname = cname;
this.students = students;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
/*public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Classes [cid=" + cid + ", cname=" + cname + ", teacher=" + teacher + "]";
}*/
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Classes [cid=" + cid + ", cname=" + cname + ", students=" + students + "]";
}
}
Student
package cn.lexed.pojo;
public class Student {
//这里我们以班级和学生为例,一个班级里面对应多个学生,这是一对多;
//反过来,多个学生对应一个班级,这是多对一
private int sid;
private String sname;
//多对一
private Classes classes;
public Student() {
super();
}
public Student(int sid, String sname, Classes classes) {
super();
this.sid = sid;
this.sname = sname;
this.classes = classes;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", classes=" + classes + "]";
}
}
3.utils
MybatisUtils
package cn.lexed.utils;
import java.io.InputStream;
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 MybatisUtils {
private static SqlSessionFactory factory;
static{ //在静态代码块里,factory只会被创建一次
try{
InputStream is=Resources.getResourceAsStream("config.xml");
factory=new SqlSessionFactoryBuilder().build(is);
}catch(Exception e){
e.printStackTrace();
}
}
//获取SqlSession
public static SqlSession createSqlSession(){
return factory.openSession(true); //true为自动提交
}
public static void closeSqlSession(SqlSession sqlSession){
if(null!=sqlSession){
sqlSession.close();
}
}
}
4.resources
config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<!-- 引入外部文件 -->
<properties resource="db.properties"></properties>
<!-- 开启复杂的自动映射 -->
<settings>
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
<!-- 起别名 -->
<typeAliases>
<package name="cn.lexed.pojo"/>
</typeAliases>
<!-- JDBC配置 -->
<environments default="env">
<environment id="env">
<!-- 事务管理器 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源 -->
<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>
<!-- 在配置文件中,关联包下得接口类 -->
<package name="cn.lexed.dao"/>
</mappers>
</configuration>
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbs
username=root
password=root
log4j.properties
log4j.rootLogger=DEBUG,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.lexed.dao=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug
######################################################################################
# Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n
######################################################################################
# DailyRolling File \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=error
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
log4j.logger.com.opensymphony.xwork2=error
5.测试类
package cn.lexed.test;
import static org.junit.Assert.*;
import org.apache.ibatis.session.SqlSession;
import cn.lexed.dao.ClassesMapper;
import cn.lexed.dao.StudentMapper;
import cn.lexed.pojo.Classes;
import cn.lexed.pojo.Student;
import cn.lexed.utils.MybatisUtils;
public class Test {
@org.junit.Test
public void test() {
SqlSession ss=MybatisUtils.createSqlSession();
Classes c=ss.getMapper(ClassesMapper.class).getClasses(2);
System.out.println(c);
}
@org.junit.Test
public void test2(){
SqlSession ss=MybatisUtils.createSqlSession();
Student s=ss.getMapper(StudentMapper.class).getStu(1);
System.out.println(s);
}
}