文章目录
介绍
MyBatis 是一款优秀的持久层框架,它支持 SQL、存储过程以及高级映射。
用法
MyBatis 有两种用法,一个是注解,一个是XML,各有千秋
-
注解方式: 使用注解的话,方便一些,不需要有XML配置文件,需要代码和SQL在一起
-
XML方式 : 把SQL语句放到XML文件中,java代码中会感觉干净一些,并且,使用XML形式 写一些复杂的SQL语句会比较方便,也能统一管理,有其他同事接手工作的时候,或者其他同事优化数据库查询的时候,位置好找,修改便捷,不容易出错
所以一般常用的就是XML,可以做到sql分离 -
有时候也是混用,简单的就用注解,复杂的就用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操作数据库实现简单的增删改查了。
本文详细介绍MyBatis框架的基本概念、使用方法及应用场景,并通过具体步骤指导如何搭建环境,包括配置文件、实体类创建等,同时讲解Mapper的不同形式及其JUnit测试。

3817

被折叠的 条评论
为什么被折叠?



