mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
以下是使用示例
入门使用配置
Maven工程依赖添加
Dao对应的映射文件
进阶SqlMapConfig.xml配置
配置文件多表查询示例
动态sql
JNDI
一对多延迟加载
一级缓存
二级缓存
使用注解开发二级缓存和延迟加载
常用注解
public class User implements Serializable {
//getter和setter省略
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
}
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
public List<User> findAll();
/**
* 根据id查询用户
* @param id
* @return
*/
public User findById(Integer id);
/**
* 保存用户
* @param user
*/
public void saveUser(User user);
/**
* 更新用户
* @param user
*/
public void update(User user);
/**
* 删除用户
* @param id
*/
public void delete(Integer id);
/**
* 返回记录总数
* @return
*/
public int findTotal();
}
测试类
public class TestUserDAO {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
*测试findAll()方法
*/
@Test
public void findAllTest(){
List<User> userList = userDao.findAll();
for (User user:userList
) {
System.out.println(user.toString());
}
}
/**
* 测试findByIdTest()方法
*/
@Test
public void findByIdTest(){
User user = userDao.findById(49);
System.out.println(user);
}
@Test
public void saveUser(){
User user = new User();
user.setAddress("青岛");
user.setSex("男");
user.setBirthday(new Date());
user.setUsername("SaveTestUser");
System.out.println("之前的"+user);
![结果](https://img-blog.csdnimg.cn/20200210122843325.png)
userDao.saveUser(user);
System.out.println("之后的"+user);
![运行结果](https://img-blog.csdnimg.cn/2020021012291184.png)
}
@Test
public void upstate(){
User user = userDao.findById(49);
System.out.println("保存之前" + user);
user.setUsername("upstateTest");
userDao.update(user);
User u = userDao.findById(49);
System.out.println(u);
}
@Test
public void bugTest(){
User user = userDao.findById(60);
System.out.println(user);//返回为空
![运行结果](https://img-blog.csdnimg.cn/20200210122952193.png)
}
@Test
public void deleteTest(){
userDao.delete(51);
}
@Test
public void findTotalTest(){
System.out.println(userDao.findTotal());
}
}
到此基本的CRUD功能以基本实现