项目结构
基于xml
解析MybatisTest.java
package com.ithysf.dao;
import com.ithysf.domain.User;
import com.ithysf.mybatis.io.Resources;
import com.ithysf.mybatis.sqlsession.SqlSession;
import com.ithysf.mybatis.sqlsession.SqlSessionFactory;
import com.ithysf.mybatis.sqlsession.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session=factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao=session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users=userDao.findAll();
for(User user :users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); SqlSessionFactory factory=builder.build(in);
创建工厂Mybatis使用了构建者模式,Builder就是构建者
优势:把对象的创建细节隐藏,使用者直接调用方法即可创建对象
SqlSession session=factory.openSession();
创建SqlSession使用了工厂模式
优势:解耦
IUserDao userDao=session.getMapper(IUserDao.class);
创建Dao实现类使用了代理模式
优势:不修改源码的基础上对已有的方法增强
IUserDao.java
在com/ithysf
下创建包dao
,创建类:IUserDao.java
package com.ithysf.dao;
import com.ithysf.domain.User;
import com.ithysf.mybatis.annotations.select;
import java.util.List;
public interface IUserDao {
//@select("select * from user")
List<User> findAll();
}
User.java
在com/ithysf
下创建包damain
,创建类:User.java
package com.ithysf.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public int getId() {
return id;
}
public String getUsername() {
return username;
}
public Date getBirthday() {
return birthday;
}
public String getSex() {
return sex;
}
public String getAddress() {
return address;
}
public void setId(int id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
Resources.java
在com/ithysf/mybatis
下创建包mybatis.io
,创建类:Resources.java
package com.ithysf.mybatis.io;
import java.io.InputStream;
/**
* 使用类加载器加载配置文件
*/
public class Resources {
/**
* 根据传入参数,获取一个子节输入流
* @param s
* @return
*/
public static InputStream getResourceAsStream(String s) {
return Resources.class.getClassLoader().getResourceAsStream(s);
}
}
SqlSession.java
在com/ithysf/mybatis
创建包sqlsession
,包内创建:接口SqlSession.java
package com.ithysf.mybatis.sqlsession;
/**
* 自定义Mybatis中和数据库交互的核心类
* 它里面可以创建dao接口的代理对象
*/
public interface SqlSession {
/**
* 根据参数创建一个代理对象
* @param iUserDaoClass
* @param <T>
* @return
*/
<T> T getMapper(Class<T> iUserDaoClass);
void close();
}
SqlSessionFactory.java
再在此包内创建一个接口:SqlSessionFactory.java
package com.ithysf.mybatis.sqlsession;
public interface SqlSessionFactory {
/**
* 用于打开一个新的SqlSession对象
* @return
*/
SqlS