新建项目—Jar包配置好
防止每次新建良母项目都要复制xml配置文件,因此自己编写一个新建配置文档
插曲--传统的Dao实现查找一个用户信息
可以从下图看出来重复代码很多要反复写,在这里我们采用动态代理对于重复的地方增强就好
采用动态代理完成Dao层增删改查
核心:不用再写Dao层接口实现类了,只需要给我一个DAO层接口即可
主要三点
1.接口方法名要和配置文件id一样
2.namespace名为接口类位置
3.配置文件参数和返回值要与接口中方法一致
动态代理实现测试类
但是当测试类中有findall,findbyid等多个函数,需要每次都要创建构造类,创建工厂,太繁琐,于是提取出来,共享一个工厂即可。
具体代码如下:
/**
* Unit test for simple App.
*/
public class AppTest {
private SqlSessionFactory sqlSessionFactory=null;
@Before
public void init(){
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
sqlSessionFactory = builder.build(AppTest.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
}
@Test
public void testFindById() {
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用getMapper 可以获取一个该接口的实现类对象 底层采用动态代理技术
//必须保证 接口的类的全限定名 跟配置文件中的 namespace一样
//方法名 必须跟配置文件中 id一致
//参数必须配置声明参数一致
//返回必须跟配置文件声明一样
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.findById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void testFindAll() {
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用getMapper 可以获取一个该接口的实现类对象 底层采用动态代理技术
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> all = userDao.findAll();
System.out.println(all);
sqlSession.close();
}
/**
* 出现了问题 查询出来结果集中 列名叫做 name javaBen却叫做username 不对称了
*/
@Test
public void testFindById1() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setUsername("小户");
user.setAddress("河南啊");
List<User> users = userDao.findByUsernameAndAddress(user);
System.out.println(users);
}
}
DAO层接口
package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
public interface UserDao {
User findById(int id);
List<User> findAll();
User findById1(int id);
List<User> findByUsernameAndAddress(User user);
}