`

MyBatis基本使用

 
阅读更多

MyBatis是轻量级的数据库访问API,封装了JDBC操作,可以实现对实体对象的CRUD操作。

 MyBatis体系结构主要组成部分:

   配置文件:SqlMapConfig.xml 主配置文件

   声明了数据库连接参数,引用了映射文件

   映射文件: 每个实体一个映射文件

   映射文件与 Mapper接口对应。

 

映射文件中:

 

  每个Mapper接口中的方法,对应映射文件中的SQL语句。

 

使用步骤:

使用MyBatis

 1 导入包

 2 创建配置文件

 3 创建实体和Mapper接口,已经映射文件

 4 使用 工厂创建SqlSession

 

 5 创建Mapper接口对象,执行接口方法

 

下面来详细介绍。

 

1),加载配置

    两钟形式,一种是XML配置文件,另一种是JAVA代码的注解。

    MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句,结果映射配置),并将其存储在内存中。

   A)SqlMapConfig.xml 

    只有一个,用于配置数据库连接参数和框架参数。

 

<?xml version="1.0" encoding="UTF-8" ?>  
<!--这段代码不能掉,否则出现异常-->
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" 
	"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
	<!--配置数据库连接 -->
	<environments default="environment">
		<environment id="environment">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" 
					value="oracle.jdbc.OracleDriver" />
				<property name="url"
					value="jdbc:oracle:thin:@localhost:1521:XE" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>  
	<!-- 引入 Dept.xml 配置 -->
	<mappers>
		<mapper resource="com/lydia/entity/Dept.xml"/>
	</mappers>
</configuration> 

 

    

    B) 实体类对应的映射文件

    Dept.xml ,该配置文件是映射Dept.java实体类的

<!-- Dept.xml 在com.lydia.entity 包中  -->  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- namespace 的值是 DeptMapper 接口
  每个Mapper 接口对应一个配置文件  -->
<mapper 
	namespace="com.lydia.entity.DeptMapper"> <!--此处的DeptMapper是我们封装的接口-->
	<insert id="addDept" 
		parameterType="com.lydia.entity.Dept">
		<selectKey keyProperty="deptno"
			order="BEFORE"
			resultType="int">
			select SEQ_T_DEPT.nextval 
			from DUAL
		</selectKey>
			insert into T_DEPT (deptno, dname, 
			loc) values 
			(#{deptno}, #{dname}, #{loc})
	</insert>
	<delete id="deleteDept"
		parameterType="com.lydia.entity.Dept">
		delete from T_DEPT 
		where deptno = #{deptno}
	</delete>
	<select id="findDeptById"
		parameterType="java.lang.Integer"
		resultType="com.lydia.entity.Dept">
		select deptno,dname,loc 
		from T_DEPT where deptno=#{deptno}
	</select>
	<update id="updateDept"
		parameterType="com.lydia.entity.Dept">
		<!-- #{deptno} 读取参数的Bean属性 -->
		update T_DEPT set dname=#{dname},
		loc = #{loc} where deptno=#{deptno}
	</update>
	<!-- 注意resultType 的值是List中元素类型
	 结果集行映射的数据类型-->
	<select id="findAllDept"
		resultType="com.lydia.entity.Dept">
		select deptno, dname, loc 
		from T_DEPT
	</select>
	<select id="findDeptByLoc"
		parameterType="java.lang.String"
		resultType="com.lydia.entity.Dept">
		select deptno, dname, loc 
		from T_DEPT where loc=#{loc}
	</select>
	<select id="findAllDname"
		parameterType="java.lang.String"
		resultType="java.util.Map">
		select dname from T_DEPT
		where loc=#{loc}
	</select>
</mapper>

  

注意:这里特别要注意主键ID的处理。

本案例中使用Oracle,那么要先创建序列 CREATE SEQUENCE SEQ_T_DEPT;   然后使用<select-key>..

 

如果是MySQL 或者 DB2,主键ID是自动增长的,可以如下设置:

 <!-- 自增类型(MySql SqlServer DB2 Derby)-->
  <insert id="addDept" useGeneratedKeys="true"
	keyProperty="deptno" 
	parameterType="com.tarean.entity.Dept">
	insert into T_DEPT(dname, loc)
	values (#{dname},#{loc})
  </insert>

 

2),SQL解析

    当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map,JavaBean,基本数据类型))。MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析。解析后可以得到最终要执行的SQL和参数。

  

3),结果映射

     将操作数据库的结果按照映射的配置进行转换。可以转换成HashMap,JavaBean或者基本数据类型,并最终将结果返回。

 

创建DeptMapper.java接口,该接口中封装了Dept.xml中指定的SQL方法。

/**
 * Mapper接口,类似于Dao,但是语法有限定
 * 不能有重载
 * Mapper 定义实体Dept对象的CRUD操作 
 *该类中的方法名必须和Dept.xml中SQL的id一致
 */
public interface DeptMapper {
	void addDept(Dept dept);
	void deleteDept(Dept dept);
	void updateDept(Dept dept);
	Dept findDeptById(Integer deptno);
	List<Dept> findAllDept();
	List<Dept> findDeptByLoc(String loc);
	List<Map<String, Object>> findAllDname(
			String loc);
}

 

MyBatis框架中设计到的几个API

SqlSessionFactoryBuilder

--该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例

SqlSessionFactory

--每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。

SqlSession

--该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句

 

TestCass.java类负责调用MyBatis中的基本API来操作数据库。

 

package com.lydia.test;

import java.io.Reader;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

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.junit.Test;

import com.lydia.entity.Dept;
import com.lydia.entity.DeptMapper;

public class TestCase {
	// @Test
	public void testSqlSession() throws Exception {
		String cfg = "SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(cfg);
//创建builder对象
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(reader);
//创建session
		SqlSession session = factory.openSession();
		Connection conn = session.getConnection();
		System.out.println(conn);
		System.out.println(conn.getMetaData().getDatabaseProductName());
		conn.close();
		session.close();
	}

	@Test
	public void testAddDept() throws Exception {
		String cfg = "SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(cfg);
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(reader);
		SqlSession session = factory.openSession();
//		+++++++++++++++++++++++++++++++++++++++
		// 通过Mapper映射器去执行SQL
		// DeptMapper mapper =
		// session.getMapper(DeptMapper.class);
		// Dept dept = new Dept("C++","武汉");
		// mapper.addDept(dept);
		// System.out.println(dept);
//		+++++++++++++++++++++++++++++++++++++++
		// 通过session去执行SQL
		Dept dept = new Dept("C++", "武汉");
		session.insert("addDept", dept);
//		+++++++++++++++++++++++++++++++++++++++
		session.commit();
		session.close();
	}

	// @Test
	public void testDelete() throws Exception {
		String cfg = "SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(cfg);
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(reader);
		SqlSession session = factory.openSession();
		DeptMapper mapper = session.getMapper(DeptMapper.class);
		Dept dept = mapper.findDeptById(2);
		mapper.deleteDept(dept);
		System.out.println(dept);
		Dept d = mapper.findDeptById(2);
		System.out.println(d);
		session.commit();
		session.close();
	}

	@Test
	public void testFindAll() throws Exception {
		String cfg = "SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(cfg);
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(reader);
		SqlSession session = factory.openSession();
		DeptMapper mapper = session.getMapper(DeptMapper.class);
		List<Dept> list = mapper.findAllDept();
		for (Dept dept : list) {
			System.out.println(dept);
		}
		session.close();
	}

	// @Test
	public void testUpdate() throws Exception {
		String cfg = "SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(cfg);
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(reader);
		SqlSession session = factory.openSession();
		DeptMapper mapper = session.getMapper(DeptMapper.class);
		Dept d = mapper.findDeptById(4);
		d.setDname("PHP");
		d.setLoc("苏州桥");
		mapper.updateDept(d);
		List<Dept> list = mapper.findAllDept();
		for (Dept dept : list) {
			System.out.println(dept);
		}
		session.commit();
		session.close();
	}

	// @Test
	public void testMap() throws Exception {
		String cfg = "SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(cfg);
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(reader);
		SqlSession session = factory.openSession();
		DeptMapper mapper = session.getMapper(DeptMapper.class);
		List<Map<String, Object>> list = mapper.findAllDname("苏州桥");
		System.out.println(list);
		session.close();
	}

	@Test
	public void testPage() throws Exception {
		String cfg = "SqlMapConfig.xml";
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		Reader reader = Resources.getResourceAsReader(cfg);
		SqlSessionFactory factory = builder.build(reader);
		SqlSession session = factory.openSession();
		//+++++++++++++++++++++++++++++++++++++
		RowBounds bounds = new RowBounds(0, 2);
		//此处用的selectList(arg1,arg2,arg3); 中间arg2参数不要掉
		List<Dept> list = session.selectList("findAllDept",null, bounds);
		for (Dept dept : list) {
			System.out.println(dept);
		}
		session.commit();
		session.close();
		//+++++++++++++++++++++++++++++++++++++
	}
}

 注意:上面调用CRUD的操作方法也可以使用以下的代替

String cfg = "SqlMapConfig.xml";
		Reader reader = 
			Resources.getResourceAsReader(cfg);
		SqlSessionFactoryBuilder builder=
			new SqlSessionFactoryBuilder();
		SqlSessionFactory factory =
			builder.build(reader);
		SqlSession session = 
			factory.openSession();

		Dept dept = new Dept("C++","武汉");
		session.insert("addDept", dept);

		session.commit();
		session.close();

   

 

 ResultMap映射定义:

在Dept.xml中定义<select>操作时,如果查询结果字段名和javaBean属性不一致,需要使用<resultMap>元素显示指定映射关系。例如Dept.java中的属性是 no,name,loc,那么应该如下配置:

 

<select id ="findAll2" resultMap="deptMap">
    select DEPTNO,DNAME,LOC from DEPT
</select>
<resultMap id = "deptMap" type="com.lydia.Dept">
    <result property="no" column="deptno"/>
    <result property="name" column="dname"/>
    <result property="loc" column="loc"/>
</resultMap>

 

 代码目录结构如下:

 

 

 

  • 大小: 18.8 KB
分享到:
评论

相关推荐

    MyBatis基本使用与优化

    ### MyBatis基本使用与优化 #### MyBatis简介与使用方法 MyBatis是一个流行的持久层框架,它简化了Java应用程序与数据库交互的过程。MyBatis的核心特性在于它的ORM(对象关系映射)功能,它能够将Java实体类与SQL...

    MyBatis基本使用总结

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在使用MyBatis时,我们需要理解其核心组件...在实际项目中,理解并熟练掌握MyBatis的基本使用,对于提升开发效率和代码质量有着重要作用。

    MyBatis基本使用方法.rtf

    Mybatis基本使用方法但是没有注解使用方法

    SSM笔记-Mybatis基本使用

    本笔记将重点介绍Mybatis的基本使用,包括它的核心组件、开发步骤、配置方法以及在实际应用中的注意事项。 一、Mybatis的核心组件 1. XML配置文件:Mybatis的主要配置文件(mybatis-config.xml)包含了数据源、事务...

    Spring SpringMVC Mybatis基本使用的jar包

    在Java Web开发中,Spring、SpringMVC和Mybatis是三个非常重要的框架,它们共同构成了SSM(Spring-SpringMVC-Mybatis)集成开发框架。这个框架组合提供了全面的解决方案,从依赖注入到业务逻辑处理,再到数据库操作...

    mybatis基本使用

    以下是一个基本的 MyBatis 测试使用的描述: 1. 环境准备 首先,确保你已经安装了 Java 和 Maven,并且有一个可用的数据库环境(如 MySQL)。然后,在 Maven 项目中添加 MyBatis 的依赖。 2. 配置 MyBatis 在项目的 ...

    Mybatis基本使用(基于XML源码).zip

    本资源着重讲解了Mybatis基于XML的配置方式,涵盖了基本的创建、读取、更新、删除(CRUD)操作,以及参数处理和结果集封装,同时也对主配置文件的构成进行了详尽的解释。 首先,Mybatis的XML配置文件是整个框架的核心...

    Mybatis自定义框架及使用1

    2. **Mybatis 基本使用** - **单表 CURD 操作**:Mybatis 提供了对数据库表的增删改查操作,这些操作可以通过 DAO 接口定义,然后在映射文件中编写对应的 SQL 语句。 - **参数和返回值**:Mybatis 支持各种参数...

    MyBatis的helloworld(不使用Mapper接口实现MyBatis查询数据库).zip

    在本示例中,我们将不使用Mapper接口来演示如何通过MyBatis进行基本的数据库查询,这对于理解MyBatis的核心工作原理是非常有帮助的。 首先,MyBatis的核心组件包括XML配置文件、SqlSessionFactory和SqlSession。XML...

    01 MyBatis入门程序-资料

    四、MyBatis基本使用 1. 创建实体类:根据数据库表结构创建对应的Java类。 2. 编写Mapper XML文件:在文件中定义SQL语句,使用`resultType`或`resultMap`指定返回类型。 3. 创建Mapper接口:接口方法与XML文件中的...

    mybatis基本例子的简单实现

    在本示例中,我们探讨的是如何实现MyBatis的基本功能。这个压缩包提供了源代码和一个名为“mybatis映射笔记.odt”的文档,其中详细记录了在实现过程中关于映射遇到的问题和解决方案。 首先,我们要理解MyBatis的...

    mybatis详细使用讲解

    #### 一、MyBatis 框架介绍与基本环境搭建 **1.1 MyBatis 框架简介** MyBatis 是一款非常流行的基于 SQL 的 ORM (对象关系映射) 框架,它由 Clinton Begin 在 2002 年创建,并在后续的发展过程中被捐赠给了 Apache...

    mybatis demo mybatis 实例

    通过这个示例,开发者可以了解MyBatis的基本用法,包括配置文件的编写、Mapper接口的定义、XML映射文件的创建以及实体类与数据库表的关联等。 描述中的“mybatis deom”可能是“mybatis demo”的拼写错误,表示这是...

    Mybatis框架基本介绍

    Mybatis框架的基本工作原理是,通过一个XML文件,该文件配置了数据库的连接信息以及SQL语句等,然后使用Java代码中的SQLSessionFactory构建器来生成SQLSession,通过这个Session进行数据库的操作。Mybatis使用了JDBC...

    mybatis学习-入门(1)-单独使用mybatis

    通过以上步骤,你已经掌握了MyBatis的基本使用。在后续的学习中,你还可以了解如何与Spring框架集成,实现更高效的开发流程。MyBatis的灵活性和强大功能使其成为Java开发中的首选持久层框架之一。现在,你可以继续...

    mybatis基本配置及例子.zip_mybatis_mybatis sql server_mybatis 实例_mybati

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。本资料包含MyBatis的基本配置和实例,适合初学者学习,特别关注与SQL ...

    Mybatis3.2.7 使用Demo

    在Mybatis 3.2.7这个版本中,我们将会看到一些关键的改进和优化,尽管这些细节可能已经随着时间的推移而改变,但基本的使用流程和概念依然适用。 首先,要使用Mybatis,我们需要在项目中引入Mybatis的jar包。这通常...

    Mybatis系列教程Mybatis基本应用共9页.pdf

    【标题】:Mybatis系列教程Mybatis基本应用共9页.pdf 【描述】:这份教程是关于Mybatis基本应用的详细讲解,包含了9页丰富的内容,旨在帮助学习者深入理解和掌握Mybatis这一强大的持久层框架。 【标签】:Mybatis...

    mybatis generator使用方法

    MyBatis Generator是一款...至此,MyBatis Generator的基本使用方法介绍完毕。实际上,MyBatis Generator还支持更多的配置选项,比如设置表的别名、自定义生成的代码规则等,读者可以参阅官方文档进行更深入的学习。

    mybatis基本配置

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 在了解MyBatis的基本配置之前,我们需要知道MyBatis的工作原理。MyBatis...

Global site tag (gtag.js) - Google Analytics