MyBatis初入

本文详细介绍MyBatis框架的基本概念、使用方法及应用场景,并通过具体步骤指导如何搭建环境,包括配置文件、实体类创建等,同时讲解Mapper的不同形式及其JUnit测试。

介绍

MyBatis 是一款优秀的持久层框架,它支持 SQL、存储过程以及高级映射。

用法

MyBatis 有两种用法,一个是注解,一个是XML,各有千秋

  1. 注解方式: 使用注解的话,方便一些,不需要有XML配置文件,需要代码和SQL在一起

  2. XML方式 : 把SQL语句放到XML文件中,java代码中会感觉干净一些,并且,使用XML形式 写一些复杂的SQL语句会比较方便,也能统一管理,有其他同事接手工作的时候,或者其他同事优化数据库查询的时候,位置好找,修改便捷,不容易出错
    所以一般常用的就是XML,可以做到sql分离

  3. 有时候也是混用,简单的就用注解,复杂的就用XML

使用场景

作用就是, 操作持久化层(Dao),和JDBC一样,操作数据库的
当我们要写动态页面(jsp)和用户进行交互的时候,就需要操作数据库,
而MyBatis就是负责操作数据库的

步骤

1,导入jar包

三个jar包,一个是mybatis本身的jar包,一个是操作数据库的,一个在控制台记录的日志文件(log4j-1.2.17)在这里插入图片描述

2,创建MyBatis 总配置文件

<?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>
	<!-- 数据库配置文件,会自动解析,为下面提供数据库配置 -->
	<properties resource="jdbc.properties" />
	<!-- 设置别名 -->
	<typeAliases>
		<typeAlias type="lfzh.mybatis.model.User"  alias="User"/>
		<typeAlias type="lfzh.mybatis.model.Address"  alias="Address"/>
	</typeAliases>
	<!-- 设置环境 -->
	<environments default="development">
		<environment id="development">
			<!-- 事务管理器,开启事务,是由JDBC实现 -->
			<transactionManager type="JDBC" />
			<!-- 数据库链接池 -->
			<dataSource type="POOLED">
			<!-- ${driver} : 会自动去jdbc.properties中 获取对应的driver的值
				jsp中${} 是EL表达式,但是在xml中 ${} 是OGNL表达式
				
				比如 ${driver} 就能获取到 com.mysql.jdbc.Driver
			 -->
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 映射文件,如果我们是XML方式的话,最终操作数据库的SQL会单独封装到XML文件中,
		这个时候 就需要通过这里来找到对应的XML文件
	 -->
	<mappers>
		<mapper resource="lfzh/mybatis/model/User.xml" />
	</mappers>
</configuration>

3,配好(创建)相对应的数据库

4,创建与数据库相对应的实体类

在这里插入图片描述

User实体类展示

package lfzh.mybatis.model;

import java.util.List;

public class User {
		private int id;
		private String username;
		private String password;
		private String nickname;
		/**
		 * 1 是管理员 0 是普通用户
		 */
		private int type;

		private List<Address> addresses;

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}

		public String getUsername() {
			return username;
		}

		public void setUsername(String username) {
			this.username = username;
		}

		public String getPassword() {
			return password;
		}

		public void setPassword(String password) {
			this.password = password;
		}

		public String getNickname() {
			return nickname;
		}

		public void setNickname(String nickname) {
			this.nickname = nickname;
		}

		public int getType() {
			return type;
		}

		public void setType(int type) {
			this.type = type;
		}

		public List<Address> getAddresses() {
			return addresses;
		}

		public void setAddresses(List<Address> addresses) {
			this.addresses = addresses;
		}

		public User(String username, String password, String nickname, int type,
				List<Address> addresses) {
			super();
			this.username = username;
			this.password = password;
			this.nickname = nickname;
			this.type = type;
			this.addresses = addresses;
		}

		public User(String username, String password, String nickname, int type) {
			super();
			this.username = username;
			this.password = password;
			this.nickname = nickname;
			this.type = type;
		}

		public User() {
			super();
		}

		public User(int id, String username, String password, String nickname,
				int type, List<Address> addresses) {
			super();
			this.id = id;
			this.username = username;
			this.password = password;
			this.nickname = nickname;
			this.type = type;
			this.addresses = addresses;
		}

}

5,添加操作的数据库配置文件

在这里插入图片描述

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root

6,导入与jar包中log4j-1.2.17配合使用的文件,起到纪录日志的作用

在这里插入图片描述

#--------------------------------   
#  
log4j.rootLogger=DEBUG, stdout  
#log4j.logger.test=info  
#log4j.logger.org.apache.jasper = DEBUG  
#log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG  
#log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG  
  
#log4j.logger.com.fiscal = DEBUG  
#log4j.logger.com.system = DEBUG  
  
log4j.logger.com.ibatis = DEBUG  
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG  
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG  
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG  
log4j.logger.java.sql.Connection = DEBUG  
log4j.logger.java.sql.Statement = DEBUG  
log4j.logger.java.sql.PreparedStatement = DEBUG 
#log4j.logger.java.sql.ResultSet = INFO  
log4j.logger.java.sql.ResultSet = DEBUG  
  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender   
  
#log4j.appender.fileout=org.apache.log4j.RollingFileAppender  
#log4j.appender.fileout.File=e:/log/ibatis.log   
#log4j.appender.fileout.MaxFileSize=10000KB   

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   
#log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%n   
#log4j.appender.fileout.layout=org.apache.log4j.PatternLayout   
#log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n  
  
#log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout   
  
# log4j.logger.org=info 

7,Mapper的三种形式

1),sqlSession
2),使用注解(基本不用)
3),利用接口代理(常用)

1和3 都需要用到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 : 是用于调用的映射,只是一个名字而已
  		
  		调用方式 : namespace.id
  		
  		这里和别名没有关系
   -->
<mapper namespace="lfzh.mybatis.dao.IUserDao">
	<!-- id : 表示调用的sql的名字,相当于 方法名 -->
	<!-- parameterType : 参数类型 -->
	<!-- #{username} : 就等于使用  ? 这种方式 -->
	<insert id="add"  parameterType="User"  >
		insert into t_user(username,password,nickname,type) values(#{username},#{password},#{nickname},#{type});
	</insert>
</mapper>

1.创建一个接口,接口名与xml一样,接口与xml放在一起,一个xml对应一个接口
2.在接口中定义抽象方法,返回值就写你想要的,方法名就是xml中语句的 id(xml中namespace的值是接口的全路径)

package lfzh.mybatis.dao;

import lfzh.mybatis.model.User;
public interface IUserDao {
	
//	@Insert("insert into t_user(username,password,nickname,type) values(#{username},#{password},#{nickname},#{type});")
	public void add(User user);

	public void delete(int id);

	public void update(User user);

	public User load(int id);
}

当使用注解形式的时候,总配置文件中的Mapper要改为接口地址,接口中要写上sql语句
在这里插入图片描述
使用接口代理模式,要将User.xml这个对应的xml文件中的
Namespace的值要和接口全名一致
Id的值要和接口中的方法名一致

8,JUnit测试

1),导入JUnit包

在这里插入图片描述

2),介绍
package lfzh.mybatis.test;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;


public class TestJunit {
	/**
	 * @Test 对应的方法只能是成员方法,相当于main方法,可以有多个@Test方法
	 * 
	 * @Before 对应的方法只能是成员方法,在每个@Test对应的方法之前执行
	 * 
	 * @After 对应的方法只能是成员方法,在每个@Test对应的方法之后执行
	 * 
	 * @BeforeClass 对应的方法只能是静态方法,并且在执行第一个@Test之前执行,并且只执行一次,在@Before之前执行
	 * 
	 * @AfterClass 同上 最后执行,只执行一次
	 */
	@Before
	public void B() {
		System.out.println("Before执行了");
	}

	@After
	public void A() {
		System.out.println("After执行了");
	}

	@BeforeClass
	public static void BC() {
		System.out.println("BeforeClass执行了");
	}

	@AfterClass
	public static void AC() {
		System.out.println("AfterClass执行了");
	}

	@Test
	public void t1() {
		System.out.println("test1执行");
	}

	@Test
	public void t2() {
		System.out.println("test2执行");
	}

	@Test
	public void t3() {
		System.out.println("test3执行");
	}
	
	
	
}

3),相对应Mapper三种形式的测试
package lfzh.mybatis.test;

import java.io.IOException;
import java.io.InputStream;

import lfzh.mybatis.dao.IUserDao;
import lfzh.mybatis.model.User;

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.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestMyBatisDao {

	private static SqlSessionFactory sqlSessionFactory = null;

	@BeforeClass
	public static void BC() {
		// 1 读取配置文件
		String resource = "mybatis-config.xml";
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 2 通过配置文件,创建session工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	private SqlSession session = null;

	@Before
	public void B() {
		// 3 创建session对象(与数据库连接)
		session = sqlSessionFactory.openSession();
	}

	@After
	public void A() {
		// 5 提交
		session.commit();

		// 6 关闭
		session.close();
	}

	@Test
	public void testAddUser() throws IOException {
		// 4 调用mapper文件 ,执行SQL
		// 准备数据
		User user = new User("zhangsan", "root", "张三", 0);
		//接口代理或者注解形式
		session.getMapper(IUserDao.class).add(user);
		//Sqlseesion形式
//		 session.insert("lfzh.mybatis.dao.IUserDao.add",user);
		// com.tledu.zrz.mybatis.dao.IUserDao
		// System.out.println(IUserDao.class.getName());
		// IUserDao.class.getName() : 获取类全名
		// session.insert(IUserDao.class.getName() + ".add", user);
	}
}

优化

封装工具类

package lfzh.mybatis.util;

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 MyBatisUtil {

	private static SqlSessionFactory sqlSessionFactory = null;
	static {
		// 1 读取配置文件
		String resource = "mybatis-config.xml";
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(resource);
			// 2 通过配置文件,创建session工厂
			sqlSessionFactory = new SqlSessionFactoryBuilder()
					.build(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static SqlSession getSession(){
		return sqlSessionFactory.openSession();
	}
	
	public static void closeSession(SqlSession session){
		if (session != null) {
			session.close();
		}
	}
}


封装后我们使用只需要调用就行

注释:当我们知道这些就可以实现简单的用MyBatis操作数据库实现简单的增删改查了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值