说明:
2张表,Adress表存有User表的主键ID值user_id;
2个类,User类内部有List<Adress>类型的变量adressList。
二者一对多关系。
主要依赖jar包:mybatis-x.x.x.jar、mysql-connector-java-x.x.x.jar
其他依赖jar包:ant-x.x.x.jar、ant-launcher-x.x.x.jar、asm-x.x.jar、cglib-x.x.xx.jar、commons-logging-x.x.jar、javassist-x.x.x-GA.jar、log4j-x.x.x.jar、log4j-api-x.x.x.jar、log4j-core-x.x.x.jar、ognl-x.x.x.jar、slf4j-api-x.x.x.jar、slf4j-log4j12-x.x.x.jar
一、创建一对多的2个类:
1.Adress类:
//地址类,与User多对一关系
public class Adress {
public Integer id;
public String name;
public Integer user_id;
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 getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
}
2.User类:
//用户类,与Adress一对多关系
public class User {
public Integer id;
public String name;
public List<Adress> adressList;
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 List<Adress> getAdressList() {
return adressList;
}
public void setAdressList(List<Adress> adressList) {
this.adressList = adressList;
}
}
二、创建两者的Dao接口:
1.AdressMapper接口:
//Adress的dao接口
public interface AdressMapper {
public void insert(Adress adress); //插入Adress数据
}
2.UserMapper接口:
//User的dao接口
public interface UserMapper {
public void insert(User user); //插入User数据
public User query(User user); //查询,会将List<Adress>也一起查出来
}
三、配置对象映射文件:
1.AdressMapper.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">
<!-- AdressMapper为dao接口 -->
<mapper namespace="com.yyh.hkw.dao.AdressMapper">
<!-- 插入数据sql -->
<insert id="insert" parameterType="com.yyh.hkw.domain.Adress">
insert into adress(id,name,user_id) values(#{id}, #{name}, #{user_id})
</insert>
</mapper>
2.UserMapper.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">
<!-- UserMapper为User的dao接口 -->
<mapper namespace="com.yyh.hkw.dao.UserMapper">
<!-- 插入User数据 -->
<insert id="insert" parameterType="com.yyh.hkw.domain.User">
insert into user(id,name) values(#{id}, #{name})
</insert>
<!-- 1.一对多查询,配置一对多查询属性名与列名信息 -->
<resultMap type="com.yyh.hkw.domain.User" id="user">
<!-- User属性与列名配置,u_id为自定义列别名 ,后面同意-->
<id property="id" column="u_id" />
<result property="name" column="u_name" />
<!-- collection配置一对多关系,property为User中属性名,ofType为List的item属性类型 -->
<collection property="adressList" ofType="com.yyh.hkw.domain.Adress">
<!-- Adress属性与列名配置,adress_id为查询user表的列名,adress为查出的列名(自定义列名) -->
<id property="id" column="a_id" />
<result property="name" column="a_name" />
<result property="user_id" column="u_id" />
</collection>
</resultMap>
<!-- 2.一对多查询,同时查出Adress列表信息 -->
<select id="query" parameterType="com.yyh.hkw.domain.User" resultType="com.yyh.hkw.domain.User" resultMap="user">
select u.id u_id, u.name u_name, a.id a_id, a.name a_name from user u left join adress a on(u.id = a.user_id) where u.id=#{id};
</select>
</mapper>
3.mybatis-config.xml中加载以上2个配置文件:
<mappers>
<!-- 类扫描,自动加载对象映射配置文件 -->
<mapper class="com.yyh.hkw.dao.AdressMapper" />
<mapper class="com.yyh.hkw.dao.UserMapper" />
</mappers>
四、插入与查询数据:
1.创建SqlSession工厂类:
private static SqlSessionFactory sFactory;
static {
try {
// 1.获取mybatis-config.xml输入流
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建SqlSession工厂类
sFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
2.插入数据:
(1)插入Adress数据:
public void insertAdress() throws IOException {
// 1.创建SqlSession,openSession(true)为开启自动提交事务
SqlSession session = sFactory.openSession(true);
// 2.获取Dao代理类
AdressMapper dao = session.getMapper(AdressMapper.class);
Adress adress = new Adress();
adress.id = 1;
adress.name = "杭州";
adress.user_id = 1;
// 3.执行插入语句
dao.insert(adress);
// 4.关闭连接
session.close();
}
(2)插入User数据,将Adress的id属性一起插入user表:
public void insertUser() throws IOException {
// 1.创建SqlSession,openSession(true)为开启自动提交事务
SqlSession session = sFactory.openSession(true);
// 2.获取Dao代理类
UserMapper dao = session.getMapper(UserMapper.class);
User user = new User();
user.id = 1;
user.name = "杨先生";
// 3.执行插入语句
dao.insert(user);
// 4.关闭连接
session.close();
}
3.一对多查询,查询User数据,将Adress列表一起查询出来:
public void queryUser() throws IOException {
// 1.创建SqlSession
SqlSession session = sFactory.openSession();
// 2.获取Dao代理类
UserMapper dao = session.getMapper(UserMapper.class);
User param = new User();
param.id = 1;
// 3.执行查询语句,
User result = dao.query(param); //User中adressList会被自动赋值
// 4.关闭连接
session.close();
}