mybatis开发步骤
- 新建一个java web工程/可以使java工程;新建mybatis工程的java package包
- 把mybatis框架的jar包及其依赖包拷贝到项目工程中
- 编写数据实体类,与数据库表进行对应 - 为orm(对象映射关系)做准备
- .定义数据操作接口,并在接口中定义数据操作
- 编写一个接口映射文件,对接口的数据操作进行映射
- 编写mybatis全局配置文件,配置数据库连接参数,配置映射文件或数据操作接口...
- 编写测试类,测试mybatis框架:4个步骤(获取mybatis环境 --> 实例化数据操作接口 --> 调用接口方法 --> 处理操作结果)
使用mybatis框架的几个阶段
- 1.基本应用:(熟练掌握)
- 使用mybatis完成jdbc的增删查改操作,能够进行对象映射和关系映射
- 开发步骤,工作流程,工作原理,基本操作
- 2.熟练应用:(熟悉应用)
- 使用mybatis简化程序开发,进行复杂业务的开发
- 配置优化,动态sql,其他复杂的映射
- 3.优化应用:(了解)
- 利用orm框架的缓存机制优化程序性能,对某些复杂业务能够进行定制开发
框架架构
框架架构
mybatis开发步骤
mybatis开发步骤
全局配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是mybatis全局配置文件,用于进行mybatis配置 -->
<!-- dtd:文档类型定义,使用全局文档类型定义约束,可以配置哪些标签,每个标签可以配置哪些属性 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置mybatis的运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 配置jdbc的4个参数 -->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin://localhost:1521/orcl"/>
<property name="username" value="trainUser"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 关联mybatis的接口映射文件 -->
<mapper resource="com/neuedu/mybatisdemo/dao/ICourceDao.xml"/>
</mappers>
</configuration>
局部配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis接口映射文件,用于映射接口操作,
mybatis会根据配置文件的配置实现数据库的操作 -->
<!-- 注意:mybatis有两个配置文件,一个是全局配置文件,一个接口映射文件
接口映射文件需要使用接口文档映射定义 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
在mapper映射文件中,使用mapper便签进行接口映射,使用namespace指定要映射的接口;
即namespace配置的是接口的名称,一般的一个映射文件实现(映射)一个接口,
在运行过程中,mybatis的代理类公会根据配置实现数据操作接口定义的数据库操作(相当于由mybatis编写了一个接口实现类)
-->
<mapper namespace="com.neuedu.mybatisdemo.dao.ICourceDao">
<!-- resultMap用于配置查询结果的映射关系 -->
<resultMap type="com.neuedu.mybatisdemo.bean.Cource" id="courceMap">
<!-- id用于配置数据库的主键列或唯一键列 -->
<!-- orm框架可以完成数据库表的列与java类属性的映射关系
- object mapping对象映射,relation mapping关系映射 -->
<id column="cource_id" property="courceId"/>
<result column="cource_name" property="courceName"/>
<result column="cource_score" property="courceScore"/>
<result column="start_date" property="startDate"/>
</resultMap>
<!-- 在接口映射文件中,使用select,insert,update,delete配置对应的sql脚本 -->
<!-- 在以上标签中,使用id配置接口的方法名称,resultMap用于配置自定义的结果映射关系 -->
<select id="findAll" resultMap="courceMap">
select * from cource
</select>
<!-- 注意使用mybatis进行配置,id不能重名,即接口方法不能重载 -->
<!-- 如果接口方法有参数,需要使用parameterType配置参数的类型(原始数据类型或对象类型),
多个参数使用parameterMap进行配置(集合类型) 或 使用对象类型进行配置 -->
<select id="findById" resultMap="courceMap" parameterType="String">
<!-- 可以使用#{} 获取参数值 -->
select * from cource where cource_id = #{id}
</select>
<insert id="addCource" parameterType="com.neuedu.mybatisdemo.bean.Cource" >
insert into cource(cource_id,cource_name,cource_score,start_date)
values(#{courceId},#{courceName},#{courceScore},sysdate)
</insert>
<update id="editCource" parameterType="com.neuedu.mybatisdemo.bean.Cource">
update cource set
cource_name = #{courceName},cource_score = #{courceScore},start_date = sysdate
where cource_id = #{courceId}
</update>
<!-- 某些情况下,parameterType可以省略 -->
<delete id="deleteById" parameterType="String">
<!-- 只有一个参数时,参数名称可以任意
public void deleteById(String id);
-->
delete from cource where cource_id = #{id}
</delete>
</mapper>
测试类
package test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.neuedu.mybatisdemo.bean.Cource;
import com.neuedu.mybatisdemo.dao.ICourceDao;
public class TestICourceDao {
private Logger logger = Logger.getLogger(TestICourceDao.class);
private SqlSession session = null;
@Before
public void init(){
try {
//1.加载mybatis环境
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.通过mybatis实例化数据访问接口
session = sqlSessionFactory.openSession();
} catch (IOException e) {
logger.warn("发生了异常!",e);
}
}
@After
public void destroy(){
if(session != null){
session.close();
}
}
public void testDeleteCource(){
Cource cource = null;
cource = session.selectOne("com.neuedu.mybatisdemo.dao.ICourceDao.findById","cource003");
if(cource != null){
try {
session.getMapper(ICourceDao.class).deleteById(cource.getCourceId());
session.commit();
logger.info("删除课程成功!");
} catch (Exception e) {
logger.info("删除课程失败!",e);
}
}else{
logger.info("要删除的课程不存在!");
}
}
@Test
public void testEditCource(){
Cource cource = null;
cource = session.selectOne("com.neuedu.mybatisdemo.dao.ICourceDao.findById","cource003");
if(cource != null){
cource.setCourceName("html+css基础知识");
try {
session.getMapper(ICourceDao.class).editCource(cource);
session.commit();
logger.info("修改课程成功!");
} catch (Exception e) {
//session.rollback();
logger.info("修改课程失败!",e);
}
}else{
logger.info("要修改的课程不存在!");
}
}
public void testAddCource(){
//Cource cource = new Cource("cource002","mybatis实战",4,null);
Cource cource = new Cource("cource003","html5+css3基础知识",4,null);
try {
session.getMapper(ICourceDao.class).addCource(cource);
//使用jdbc事务
session.commit();
logger.info("新增课程成功!");
} catch (Exception e) {
//session.rollback();
logger.info("新增课程失败!",e);
}
}
public void testFind(){
List<Cource> list = session.getMapper(ICourceDao.class).findAll();
for(Cource cource : list){
logger.info(
cource.getCourceId() + cource.getCourceName()
+ cource.getCourceScore() + cource.getStartDate());
}
}
public void testFindAll(){ //测试方法一
try {
//1.加载mybatis环境
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.通过mybatis实例化数据访问接口
SqlSession session = sqlSessionFactory.openSession();
//ICourceDao courceDao = session.getMapper(ICourceDao.class);
//3.调用数据访问接口,进行数据操作
/*List<Cource> list = courceDao.findAll();*/
//Cource cource = courceDao.findById("couce001");
Cource cource = null;
//方法1 - 通过mybatis session先获取mybatis映射接口,再调用接口的方法进行查询
//cource = session.getMapper(ICourceDao.class).findById("couce001");
//List<Cource> list = session.getMapper(ICourceDao.class).findAll();
//方法2 - 直接使用mybatis session调用直接接口和方法,并进行参数传递
cource = session.selectOne("com.neuedu.mybatisdemo.dao.ICourceDao.findById","couce001");
//List<Cource> list = session.selectList("com.neuedu.mybatisdemo.dao.ICourceDao.findAll");
//4.处理数据操作的结果
/*for(Cource cource : list){
logger.info(
cource.getCourceId() + cource.getCourceName()
+ cource.getCourceScore() + cource.getStartDate());
}*/
if(cource != null){
logger.info(
cource.getCourceId() + cource.getCourceName()
+ cource.getCourceScore() + cource.getStartDate());
}else{
logger.info("没有找到该课程信息!");
}
} catch (IOException e) {
logger.warn("发生异常!",e);
}
}
}