包结构
pom.xml
<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>cn.ps</groupId>
<artifactId>MYBATIS</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- 引入mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 引入驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- 引入分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
<!-- 引入redis -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
resources
创建properties资源文件
数据库连接: jdbc.properties
#驱动名
driverClassName=com.mysql.jdbc.Driver
#连接地址
url=jdbc:mysql://localhost:3306/unit02
#用户
userNames=root
#密码
password=ps123456
#初始连接数
initialSise=5
#最大连接数
maxTotal=8
#最大超时
maxWaitMillis=60000
redis连接:redis.properties
host=192.168.0.198
port=6379
password=123456
实体类
Dept
package cn.ps.lesson02.resultmap;
import java.util.List;
public class Dept {
private String deptno;
private String dname;
private String djob;
private List<Emp> empList;
public List<Emp> getEmpList() {
return empList;
}
public void setEmpList(List<Emp> empList) {
this.empList = empList;
}
public String getDeptno() {
return deptno;
}
public void setDeptno(String deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getDjob() {
return djob;
}
public void setDjob(String djob) {
this.djob = djob;
}
}
Emp
package cn.ps.lesson02.resultmap;
public class Emp {
private String empno;
private String ename;
private int sal;
private Dept dept;
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public String getEmpno() {
return empno;
}
public void setEmpno(String empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", sal=" + sal + ", dept=" + dept + "]";
}
}
接口类
DeptMapper
package cn.ps.lesson02.resultmap;
public interface DeptMapper {
public Dept queryDept(int deptno);
}
EmpMapper
package cn.ps.lesson02.resultmap;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
public Emp queryEmp(int empno);
public Emp queryEmpName(int deptno);
@Results(
//sal是数据库的字段名,mySql是实体类的属性
{
@Result(column="sal",property="mySal")
}
)
@Select("SELECT * FROM emp WHERE empno = #{0}")
public Emp queryEmps(int empno);
}
DeptMapper.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="cn.ps.lesson02.resultmap.DeptMapper">
<!-- 一对多
coolection="获取数据"
property="数据类型"
javaTyoe="数据返回类型"
select="需要查询的方法路径"
column="往需要查询方法里面传入的参数"
-->
<resultMap type="cn.ps.lesson02.resultmap.Dept" id="dept">
<collection property="empList" javaType="list" select="cn.ps.lesson02.resultmap.EmpMapper.queryEmpName" column="deptno"></collection>
</resultMap>
<!-- 一对多 先查出dept表里面的deptno编号-->
<select id="queryDept" resultMap="dept">
SELECT * FROM dept WHERE deptno = #{0}
</select>
</mapper>
EmpMapper.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="cn.ps.lesson02.resultmap.EmpMapper">
<!--
设置resultMap返回值
type=返回值的类型
column=数据库有的字段名 property=bean属性类里变量名
autoMapping="true" bean属性类里跟数据库字段名一致的,自动映射值。
autoMapping="false" 在result里面设置的值会映射,其它都不会。
association="获取bean的集合" property="empBean里面的deptBean类型" javaType="返回deptBean类型的的绝对路径" autoMapping="true自动映射"
-->
<!-- 一对一 通过empBean里面的deptBean类型将查询出来的数据插入deptBean里面-->
<resultMap type="cn.ps.lesson02.resultmap.Emp" id="emp" autoMapping="true">
<result column="sal" property="mySal"/>
<association property="dept" javaType="cn.ps.lesson02.resultmap.Dept" autoMapping="true"></association>
</resultMap>
<!-- 一对一 先从emp和dept表关联查出dept表里的数据 -->
<select id="queryEmp" resultMap="emp">
SELECT e.*,d.* FROM emp e INNER JOIN dept d ON e.deptno = d.deptno WHERE e.empno = #{0}
</select>
<!-- 一对多 由DeptMapper.xml里调用的查询方法 #{0}由DeptMapper.xml里传来-->
<select id="queryEmpName" resultType="cn.ps.lesson02.resultmap.Emp">
SELECT * FROM emp WHERE deptno = #{0}
</select>
</mapper>
config.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="jdbc.properties" ></properties>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 给返回类型取别名 -->
<typeAliases>
<typeAlias type="cn.ps.lesson02.selectKey.User" alias="user"/>
</typeAliases>
<!-- 连接数据库 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driverClassName}" />
<property name="url" value="${url}" />
<property name="username" value="${userNames}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 扫描 -->
<mappers>
<mapper resource="cn/ps/lesson02/resultmap/EmpMapper.xml"></mapper>
<mapper resource="cn/ps/lesson02/resultmap/DeptMapper.xml"></mapper>
</mappers>
</configuration>
测试类TestMybatis
package cn.ps.lesson02.resultmap;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
/**
* 1.解决sql硬编码的问题 2.解决面向对象面向问题 每一个对象一个xml文件(映射文件 MAPPING)
*
* @author 胡俊飞 2018年11月10日上午11:08:11
*/
public class TestMybatis {
//获取session对象
public static SqlSession getSeesion() {
// 获取config.xml文件
String resources = "config.xml";
// 读取config.xml文件
InputStream resourceAsStream = TestMybatis.class.getResourceAsStream(resources);
// sessopm工厂负责生产回话
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 回话就是跟数据库产生的连接可以操作数据库的增删改查
SqlSession openSession = sqlSessionFactory.openSession();
return openSession;
}
@Test
public void testOneToOne() {
SqlSession seesion = getSeesion();
EmpMapper mapper = seesion.getMapper(EmpMapper.class);
Emp queryEmp = mapper.queryEmp(7521);
System.out.println(queryEmp.getDept().getDname());
}
@Test
public void testOneToMany() {
SqlSession seesion = getSeesion();
DeptMapper mapper = seesion.getMapper(DeptMapper.class);
Dept queryDept = mapper.queryDept(20);
System.out.println(queryDept.getEmpList());
}
}