三种实现
1.配置文件实现
import com.bittergourd.mybatis.dao.UserDao;
import com.bittergourd.mybatis.domain.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Program: knowledge-base
* @Description: MybatisTest
* @Author: BitterGourd
* @Date: 2020-01-29 14:12
*/
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 sqlSession = factory.openSession();
// 4. 使用SqlSession创建Dao接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
// 5. 使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user:
users) {
System.out.println(user);
}
// 6. 释放资源
sqlSession.close();
in.close();
}
}
易错点
- 1.项目中的路径问题
- 不靠谱
- 绝对路径
- 相对路径
- 靠谱
- 类加载器[只能读取类路径下的配置文件]
- ServletContext对象的getRealPath()方法
- 不靠谱
- 2.构建者模式
优点:
把对象创建的细节隐藏,使调用者直接调用方法即可拿到对象。
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
- 3.工厂模式
优点:
解耦(降低类之间的依赖关系)。
SqlSession sqlSession = factory.openSession();
- 4.代理模式
优点:
不修改源码的基础上对源码的方法增强。
UserDao userDao = sqlSession.getMapper(UserDao.class);
2.使用注解实现
public interface UserDao {
@Select("select * from user")
List<User> findAll();
}
<mappers>
<!-- <mapper resource="com/bittergourd/mybatis/dao/UserDao.xml"></mapper>-->
<mapper class="com.bittergourd.mybatis.dao.UserDao"></mapper>
</mappers>
3.自己实现类[不推荐:麻烦]
import com.bittergourd.mybatis.dao.UserDao;
import com.bittergourd.mybatis.dao.impl.UserDaoImpl;
import com.bittergourd.mybatis.domain.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Program: knowledge-base
* @Description: MybatisTest
* @Author: BitterGourd
* @Date: 2020-01-29 14:12
*/
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创建Dao接口的代理对象
UserDao userDao = new UserDaoImpl(factory);
// 4. 使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user:
users) {
System.out.println(user);
}
in.close();
}
}
import com.bittergourd.mybatis.dao.UserDao;
import com.bittergourd.mybatis.dao.impl.UserDaoImpl;
import com.bittergourd.mybatis.domain.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Program: knowledge-base
* @Description: MybatisTest
* @Author: BitterGourd
* @Date: 2020-01-29 14:12
*/
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创建Dao接口的代理对象
UserDao userDao = new UserDaoImpl(factory);
// 4. 使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user:
users) {
System.out.println(user);
}
in.close();
}
}
也需要通过xml文件找到sql语句。
通过全限定类名唯一确定一个方法。
<mappers>
<mapper resource="com/bittergourd/mybatis/dao/UserDao.xml"></mapper>
<!-- <mapper class="com.bittergourd.mybatis.dao.UserDao"></mapper>-->
</mappers>
原理分析
1.mybatis做了哪些工作
- 创建代理对象
- 在代理对象中调用selectList
封装的两部分重点:
- 连接信息
- 映射信息 [两部分组合为一个对象]
- 执行的sql语句
- 封装结果的实体类全限定类名