快速搭建Mybatis环境:
首先创建任意一个maven项目,如何创建不在本文讨论范围,请参考作者其他博客。
1. 引入Mybatis所需的包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysqlcon.version}</version>
</dependency>
2. 配置mybatis.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/db_nba?allowMultiQueries=true" /><!-- allowMultiQueries 允许一次性执行多个SQL,否则在一个映射文件中执行多个条SQL时会报格式错误 -->
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="defaultAutoCommit" value="true"/> <!-- 配置事务自动提交,但是没有用 -->
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="resources/mybatis/PlayerMapper.xml" />
</mappers>
</configuration>
3.通过XML配置文件获取SqlSession
创建MySqlSessionFactory类,通过resource获取sqlSessionFactory
/**
*
*/
package com.jnk.mybatis.practise.service.factory;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* @author Lenovo
*
*/
public class MySessionFactory
{
// 配置文件路径
/*
* private static final String CONFIG_FILE = IConstant.APP_ROOT +
* IConstant.FILE_SEPT + "src" + IConstant.FILE_SEPT + "main" +
* IConstant.FILE_SEPT + "java" + IConstant.FILE_SEPT + "mybatis.xml";
*/
private static SqlSession sqlSession;
static
{
try
{
/*
* 使用mybatis提供的资源加载器加载配置文件,同时加载Mapper文件 如果报错 Resource not found
* 说明配置文件没有放到source 下
* 参考:http://blog.csdn.net/JJ_nan/article/details/63685929
*/
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = factory.openSession(true); // true
// 参数代表自动提交事务,否则需要手动管理事务,不然更改数据库的操作不能COMMIT
} catch (IOException e)
{
e.printStackTrace();
}
}
public static <T> T getSqlSession(Class<T> T)
{
return sqlSession.getMapper(T);
}
}
4. 配置Mapper.java接口
public interface IPlayerMapper
{
/**
* 根据ID读取球员信息
*
* @param id
* 球员ID
* @return 某个球员信息
*/
PlayerEntity queryPlayerInfo(@Param("id") int id);
}
4. 配置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="com.jnk.mybatis.practise.service.mapper.IPlayerMapper">
<resultMap type="com.jnk.mybatis.practise.service.entity.PlayerEntity"
id="playerInfo">
<result property="id" column="ID" />
<result property="pNameCn" column="P_NAME_CN" />
<result property="pNameEn" column="P_NAME_EN" />
<result property="pNo" column="P_NO" />
<result property="birthDay" column="BIRTH_DAY" />
<result property="age" column="AGE" />
<result property="teamId" column="TEAM_ID" />
</resultMap>
<sql id="commonPlayerInfo">
select
ID,
P_NAME_CN,
P_NAME_EN,
P_NO,
BIRTH_DAY,
YEAR(CURRENT_DATE()) - YEAR(BIRTH_DAY) as AGE,
TEAM_ID
from tbl_player
</sql>
<select id="queryPlayerInfo" resultMap="playerInfo">
<include refid="commonPlayerInfo"></include>
where id = #{id}
</select>
</mapper>
5. 创建测试数据库
DROP DATABASE IF EXISTS db_nba;
CREATE DATABASE db_nba CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;
USE db_nba;
DROP TABLE IF EXISTS tbl_zone;
CREATE TABLE tbl_zone(
`ZONE_ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`ZONE_NAME_CN` VARCHAR(32) NOT NULL COMMENT '分区中文名',
`ZONE_NAME_EN` VARCHAR(32) NOT NULL COMMENT '分区英文名'
)ENGINE = INNODB CHARACTER SET = utf8 COMMENT='东西部分区表';
TRUNCATE tbl_zone;
INSERT INTO tbl_zone VALUES
(1,'西部','WEST'),
(2,'东部','EAST');
DROP TABLE IF EXISTS tbl_team;
CREATE TABLE tbl_team(
`TEAM_ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`TEAM_NAME_CN` VARCHAR(32) NOT NULL COMMENT '球队中文名',
`TEAM_NAME_EN` VARCHAR(32) NOT NULL COMMENT '球队英文名',
`LOCATION` VARCHAR(256) NOT NULL COMMENT '球队所在地',
`TEAM_BOSS` VARCHAR(64) NOT NULL COMMENT '球队老板',
`ZONE_ID` INT NOT NULL,
FOREIGN KEY(ZONE_ID) REFERENCES tbl_zone(ZONE_ID)
)ENGINE = INNODB CHARACTER SET = utf8 COMMENT='球队表';
TRUNCATE tbl_team;
INSERT INTO tbl_team VALUES
(1,'湖人','Laker','洛杉矶','珍妮巴斯',1),
(2,'火箭','Rocket','休斯顿','亚历山大',1),
(3,'骑士','Cavaliers','克利夫兰','吉尔伯特',2);
DROP TABLE IF EXISTS tbl_player;
CREATE TABLE tbl_player(
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`P_NAME_CN` VARCHAR(32) NOT NULL COMMENT '球员中文名',
`P_NAME_EN` VARCHAR(32) NOT NULL COMMENT '球员英文名',
`P_NO` TINYINT NOT NULL COMMENT '球员号码',
`TEAM_ID` INT NOT NULL ,
`BIRTH_DAY` DATE NOT NULL CHECK(BOTH_DAY > '1920-01-01'),
`SEX` CHAR(1) NOT NULL CHECK (SEX IN ('F','M')),
FOREIGN KEY (TEAM_ID) REFERENCES tbl_team(TEAM_ID)
)ENGINE = INNODB CHARACTER SET = utf8 COMMENT='球员表';
TRUNCATE tbl_player;
INSERT INTO tbl_player VALUES
(1,'科比','Kobe',24,1,'1978-08-24','M'),
(2,'库兹马','Kuzma',0,1,'1995-07-24','M'),
(3,'哈登','HaDen',13,2,'1995-07-24','M'),
(4,'保罗','Pual',3,2,'1995-07-24','M'),
(5,'周琦','Zhouqi',9,2,'1995-07-24','M'),
(6,'詹姆斯','James',23,3,'1995-07-24','M'),
(7,'勒夫','Love',0,3,'1995-07-24','M');
DROP VIEW IF EXISTS view_all_player;
CREATE VIEW view_all_player AS
SELECT
p.ID,
p.P_NAME_CN,
p.P_NAME_EN,
p.P_NO,
t.TEAM_NAME_CN,
t.LOCATION,
t.TEAM_BOSS,
z.ZONE_NAME_CN
FROM
tbl_player p
INNER JOIN tbl_team t ON p.TEAM_ID = t.TEAM_ID
INNER JOIN tbl_zone z ON t.ZONE_ID = z.ZONE_ID;
6. 创建实体类
/**
*
*/
package com.jnk.mybatis.practise.service.entity;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author NonkeyJiang
*
*/
public class PlayerEntity
{
private Integer id;
private String pNameCn;
private String pNameEn;
private Integer pNo;
private Date birthDay;
private Integer age;
private Integer teamId;
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getpNameCn()
{
return pNameCn;
}
public void setpNameCn(String pNameCn)
{
this.pNameCn = pNameCn;
}
public String getpNameEn()
{
return pNameEn;
}
public void setpNameEn(String pNameEn)
{
this.pNameEn = pNameEn;
}
public Integer getpNo()
{
return pNo;
}
public void setpNo(Integer pNo)
{
this.pNo = pNo;
}
public Date getBirthDay()
{
return birthDay;
}
public void setBirthDay(Date birthDay)
{
this.birthDay = birthDay;
}
public Integer getAge()
{
return age;
}
public void setAge(Integer age)
{
this.age = age;
}
public Integer getTeamId()
{
return teamId;
}
public void setTeamId(Integer teamId)
{
this.teamId = teamId;
}
@Override
public String toString()
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return "PlayerEntity [id=" + id + ", pNameCn=" + pNameCn + ", pNameEn=" + pNameEn + ", birthDay="
+ dateFormat.format(birthDay) + ", age=" + age + ", teamId=" + teamId + "]";
}
}
7. 进行测试
public class AppTest
{
/**
* 测试方法
*
* @param args
*/
public static void main(String[] args)
{
// 获取一个球员信息
IPlayerMapper playerMapper = MySessionFactory.getSqlSession(IPlayerMapper.class);
PlayerEntity player = playerMapper.queryPlayerInfo(1);
System.out.println(player);
}
}
问题:
使用mybatis提供的资源加载器加载配置文件,同时加载Mapper文件 如果报错 Resource not found 说明配置文件没有放到source 下
参考:http://blog.csdn.net/JJ_nan/article/details/63685929 解决