myBatis 支持自己写dao的实现类

tech2024-02-23  69

myBatis 支持自己写dao的实现类,或者用动态代理(常用)

动态代理的过程:

dao接口
/** * 用户的持久层接口 */ public interface UserDao { /** * 查询所有用户 */ List<User> findAll(); /** * 保存用户 * @param user */ void saveUser(User user); }
测试类:
public class MybatisTest { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private UserDao userDao; @Before//用于在测试方法执行之前执行 public void init() throws Exception { //1,读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2,获取SqlSessionFactory工厂 factory = new SqlSessionFactoryBuilder().build(in); //3,获取SqlSession对象 sqlSession = factory.openSession(); //4,获取dao的代理对象 userDao = sqlSession.getMapper(UserDao.class); } @After//用于在测试方法执行之后执行 public void destory() throws Exception { // 因此要提交事务 sqlSession.commit(); //6.释放资源 sqlSession.close(); in.close(); } // 测试查询所有 @Test public void testFindAll() { List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } /** * 测试保存操作 */ @Test public void testSave() throws Exception { User user = new User(); user.setUsername("一一一一一"); user.setAddress("广东深圳"); user.setSex("男"); user.setBirthday(new Date()); System.out.println("保存之前的user"+user); //5,执行保存操作方法 userDao.saveUser(user); System.out.println("保存之后的user"+user); /*代码无异常但是 * Setting autocommit to false on JDBC 添加失败了 还要提交事务 * */ }

动态代理的过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNvj27kg-1599125745150)(D:\Java\1-10\00 讲义+笔记+资料\4.主流框架\31.Mybatis\mybatis\mybatis_day02\截图\非常重要的一张图-分析代理dao的执行过程.png)]

自己写dao的实现类过程:

Dao接口的实现类代码:
public class UserDaoImpl implements UserDao{ private SqlSessionFactory factory; public UserDaoImpl(SqlSessionFactory factory) { this.factory = factory; } //查询用户 public List<User> findAll() { //1,根据factory对象,获取SqlSession对象 SqlSession session = factory.openSession(); //2,调用SqlSession中的方法,实现查询数据库 List<User> users = session.selectList("x.xss.dao.UserDao.findAll"); //3,释放资源 session.close(); return users; } // 保存用户 public void saveUser(User user) { //1,根据factory对象,获取SqlSession对象 SqlSession session = factory.openSession(); //2,调用SqlSession中的方法,实现查询数据库 session.insert("x.xss.dao.UserDao.saveUser",user); //3,提交事务 session.commit(); //4,释放资源 }
测试类代码:
public class MybatisTest { private InputStream in; private SqlSessionFactory factory; private UserDao userDao; @Before//用于在测试方法执行之前执行 public void init() throws Exception { //1,读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2,获取SqlSessionFactory工厂 factory = new SqlSessionFactoryBuilder().build(in); //3,使用工厂对象,创建dao对象 userDao = new UserDaoImpl(factory) ; } @After//用于在测试方法执行之后执行 public void destory() throws Exception { in.close(); } // 测试查询所有 @Test public void testFindAll() { List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } } //测试保存操作 @Test public void testSave() throws Exception { User user = new User(); user.setUsername("牛牛牛牛"); user.setAddress("广东深圳"); user.setSex("男"); user.setBirthday(new Date()); userDao.saveUser(user); }

它的执行过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22kimkJZ-1599125745155)(C:\Users\2019\Desktop\1111.png)]

圳"); user.setSex(“男”); user.setBirthday(new Date()); userDao.saveUser(user); } 执行过程

以查询为例,不管是创建代理Dao实现类对象 ,还是编写Dao实现类,最终都是去实行selectList方法,后面的过程就是一样了!

最新回复(0)