Mybatis入门笔记(2)——基于代理Dao实现CRUD
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
目录结构:
XML方式
创建步骤:
-
创建maven工程,什么都不选就ok,并导入坐标;
-
编写User实体类和dao接口。
java目录下创建com.ben.domain包,创建User实体类
创建com.ben.dao包,创建IUserDao接口(也可以写成UserDao或UserMapper)
public interface IUserDao { // 通过ID查询一个用户 User findUserById(Integer id); // 根据用户名模糊查询用户列表 List<User> findUserByUsername(String userName); // 添加用户 int insertUser(User user); // 更新用户 void updateUserById(User user); // 删除用户 void deleteUserById(Integer id); }
-
在resources文件夹中,创建Mybatis的主配置文件SqlMapConfig.xml;
-
在resources文件夹中导入log4j.properties文件
-
在resources里创建包com->ben->dao,创建映射配置文件IUserDao.xml;
要求:
创建位置:必须和持久层接口在相同的包中;
名称:必须以持久层接口名称命名文件名,扩展名是.xml
举例:
注意:配置文件的namespace必须是持久层接口的全类名
-
在java下创建测试类com.ben.test.MybatisTest,6步;
1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
3.创建SqlSession工厂对象
SqlSessionFactory factory = builder.build(in);
4.使用工厂生产SqlSession对象
session = factory.openSession();
5.创建Dao接口的代理对象
userdao = session.getMapper(IUserDao.class);
6.执行操作:增删改查等操作
7.释放资源
session.commit();
session.close();
in.close();
/**
* @ClassName: MybatisTest
* @author: benjamin
* @version: 1.0
* @description: TODO
* @createTime: 2019/07/07/21:54
*/
public class MybatisTest {
private SqlSessionFactory factory;
private IUserDao userdao;
private InputStream in;
private SqlSession session;
// 作用:在测试方法前执行这个方法
@Before
public void setUp() throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建SqlSession工厂对象
SqlSessionFactory factory = builder.build(in);
//4.使用工厂生产SqlSession对象
session = factory.openSession();
//5.创建Dao接口的代理对象
userdao = session.getMapper(IUserDao.class);
}
@After//在测试方法执行完成之后执行
public void destroy() throws IOException {
session.commit();
session.close();
in.close();
}
//通过Id查询一个用户
@Test
public void testFindUserById() {
//5.使用代理对象执行方法
User user = userdao.findUserById(1);
System.out.println(user);
}
//根据用户名模糊查询用户列表
@Test
public void testFindUserByUserName() {
List<User> list = userdao.findUserByUsername("王");
for (User user : list) {
System.out.println(user);
}
}
//添加用户
@Test
public void testInsertUser() throws IOException {
User user = new User();
user.setUsername("大王");
user.setBirthday(new Date());
user.setAddress("sadfsafsafs");
user.setSex("2");
int i = userdao.insertUser(user);
System.out.println("插入id:" + user.getId());//插入id:35
}
//更新用户
@Test
public void testUpdateUserById() throws IOException {
User user = new User();
user.setId(35);
user.setUsername("一一");
user.setBirthday(new Date());
user.setAddress("西安市");
user.setSex("1");
userdao.updateUserById(user);
System.out.println(user.getId());
}
//删除用户
@Test
public void testDeleteUserById() throws IOException {
userdao.deleteUserById(29);
}
}
注意事项:
-
在Mybatis中它把持久层的操作接口名称也叫做:Mapper。所以:IUserDao 和 IUserMapper是一样的。
-
在idea中创建目录的时候,它和包是不一样的。package包在创建时:com.ben.dao它是三级结构;directory目录在创建时:com.ben.dao是一级目录。
-
映射配置文件IUserDao.xml的mapper标签配置:
namespace:dao接口的全限定类名。比如com.ben.dao.IUserDao
id:Mapper接口(IUserDao)的接口方法名;
parameterType:接口方法的传入参数类型;
resultType:接口方法的返回值类型;
遵从了第3点,在开发中就无须再写dao的实现类。mybatis 为我们实现,即为动态代理dao实现。
注解方式
-
IUserDao.xml移除;
-
dao接口(IUserDao)的方法上使用@Select注解,并且指定SQL语句;
public interface IUserDao { //用户的持久层操作,查询所有操作。 @Select("select * from user") List<User> findAll(); }
-
SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
<mappers>
<mapper class="com.ben.dao.IUserDao"/>
</mappers>
编写测试类
/**
* @ClassName: MybatisTest
* @author: benjamin
* @version: 1.0
* @description: TODO
* @createTime: 2019/07/07/21:54
*/
public class MybatisTest {
private SqlSessionFactory factory;
private IUserDao userdao;
private InputStream in;
private SqlSession session;
// 作用:在测试方法前执行这个方法
@Before
public void setUp() throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建SqlSession工厂对象
SqlSessionFactory factory = builder.build(in);
//4.使用工厂生产SqlSession对象
session = factory.openSession();
//5.创建Dao接口的代理对象
userdao = session.getMapper(IUserDao.class);
}
@After//在测试方法执行完成之后执行
public void destroy() throws IOException {
session.commit();
session.close();
in.close();
}
//查询所有用户
@Test
public void findAll(){
List<User> list = userdao.findAll();
for (User user : list) {
System.out.println(user);
}
}
}