商品和商品类别一对一级联,注:此处只是做一对一关联的一个例子,请勿在乎表的设计缺陷。
1.pojo类如下
/**
*商品表
*/
public class Commodity {
//主键
private Long id;
//商品名称
private String commodity_name;
//商品价格
private Double price;
//商品类别
private CommodityType commodityType = null;
//商品排序
private Long sort;
/**setter and getter**/
}
/**
*类别表
*/
public class CommodityType {
//类别id
private Long id;
//类别名称
private String commodity_type_name;
/** setter and gette **/
}
2.接口dao
package xuexi.mybatis.dao.mapper;
import xuexi.mybatis.pojo.CommodityType;
/**
*商品类别接口
*/
public interface CommodityTypeMapper {
//根据类别ID获取类别信息
public CommodityType getCommodityType(Long id);
}
package xuexi.mybatis.dao.mapper;
import java.util.List;
import xuexi.mybatis.pojo.Commodity;
/**
*商品接口
*/
public interface CommodityMapper {
//获取商品列表
public List<Commodity> getCommodityList();
}
3.mybatis主配置文件mybatis-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>
<typeAliases><!-- 别名 -->
<!-- <typeAlias alias="user" type = "xuexi.mybatis.pojo.User"/> -->
<!-- 扫描此包下别名 -->
<package name="xuexi.mybatis.pojo"/>
</typeAliases>
<!-- 数据库环境 -->
<environments default = "development">
<!-- 描述数据库 -->
<environment id="development">
<!-- 配置事务管理 -->
<transactionManager type="JDBC" />
<!--配置数据库 type="POOLED" 代表采用mybatis内部提供的连接池方式 -->
<dataSource type="POOLED">
<property name = "driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入 映射器xml创建文件 -->
<mappers>
<package name="xuexi.mybatis.dao.mapper"/>
</mappers>
</configuration>
4.mybatis映射器配置文件
商品类别CommodityTypeMapper.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对应的是接口全限定名称 于是mybatis上下文就通过它找到对应的接口-->
<mapper namespace="xuexi.mybatis.dao.mapper.CommodityTypeMapper">
<!-- getCommodityType和接口名称必须一样, resultType结果集返回的类型,参数类型parameterType-->
<select id="getCommodityType" resultType="commodityType" parameterType="long" >
select id,commodity_type_name from commodity_type where id = #{commodity_type_id}
</select>
</mapper>
商品CommodityMapper.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对应的是接口全限定名称 于是mybatis上下文就通过它找到对应的接口-->
<mapper namespace="xuexi.mybatis.dao.mapper.CommodityMapper">
<!-- id代表resultMap标识,type要映射的pojo -->
<resultMap id="commodityTypeMap" type="commodity">
<!-- 主键,property映射到pojo类的实体或者属性,column对应数据库表SQL的列 -->
<id property="id" column="id" ></id>
<result property="commodity_name" column="commodity_name"/>
<result property="price" column="price"/>
<result property="sort" column="sort"/>
<!-- association一对一级联 -->
<!-- property属性代表映射到POJO属性上。select配置是命名空间+SQL id的形式,这样便可以指向
对应Mapper的SQL,Mybatis就会通过对应的SQL将数据查询回来。column代表SQL的列,用作参数传递给
select属性制定的SQL,如果是多个参数,则需要用逗号隔开。-->
<association property="commodityType" column="commodity_type_id"
select="xuexi.mybatis.dao.mapper.CommodityTypeMapper.getCommodityType"/>
</resultMap>
<select id = "getCommodityList" resultType="commodity" resultMap="commodityTypeMap">
select id,commodity_name,price,sort,commodity_type_id from commodity
</select>
</mapper>
5.工具类
package utils;
import java.io.IOException;
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 SqlSessionFactoryUtils {
private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;
private static SqlSessionFactory sqlSesssionFactory = null;
//构造方法加入了private 关键字,使得其他代码不能通过new的方式来创建它
private SqlSessionFactoryUtils(){}
public static SqlSessionFactory getSqlSessionFactory(){
//synchronized关键字防止多线程中多次实例化SqlSessionFactory对象,从而保证SqlSessionFactory的唯一性
synchronized ( LOCK ){
if( sqlSesssionFactory != null){
return sqlSesssionFactory;
}
}
String resouce = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resouce);
sqlSesssionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return null;
}
/**
* 创建SqlSession
* @return
*/
public static SqlSession openSqlSession(){
if(sqlSesssionFactory == null){
getSqlSessionFactory();
}
return sqlSesssionFactory.openSession();
}
}
6.测试
public class Test{
public static void main(String[] args) {
test1();
}
public static void test1(){
SqlSession sqlSession = null;
try {
sqlSession = SqlSessionFactoryUtils.openSqlSession();
CommodityMapper commodityMapper = sqlSession.getMapper(CommodityMapper.class);
List<Commodity> li = commodityMapper.getCommodityList();
for (Commodity commodity : li) {
System.out.println(commodity);
}
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
}
}