接口代理方式(mapper):
使用Mapper接口的代理方式, 根据方法名和映射文件中指令ID进行绑定,动态调用相关指令信息。
指令id方式(dao):
根据mybatis将映射信息封装为:MappedStatement对象,存在Map中,将namespace和指令ID当做key,根据key获取对应MappedStatement对象,进行数据库操作。
上项目:
使用dao的项目结构
使用mapper的项目结构
在这两个项目中,只有UserDao,UserMapper和test目录里的文件不同,其他完全相同,
UserDao文件
package com.example.dao;
import com.example.domain.User;
import com.example.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class UserDao {
//查询全部
public List<User> selectAll() {
SqlSession session = SqlSessionUtils.getSession();
List<User> list = session.selectList("com.example.Mapper.UserMapper.selectAll");
session.close();
return list;
}
//根据id查询
public User queryById(int id) {
SqlSession session = SqlSessionUtils.getSession();
User user = session.selectOne("com.example.Mapper.UserMapper.queryById", id);
session.close();
return user;
}
//添加
public int addUser(User user) {
SqlSession session = SqlSessionUtils.getSession();
int result = session.insert("com.example.Mapper.UserMapper.addUser", user);
//提交事务
session.commit();
session.close();
return result;
}
//通过id更新
public int updateUserById(User user) {
SqlSession session = SqlSessionUtils.getSession();
int result = session.update("com.example.Mapper.UserMapper.updateUserById", user);
session.commit();
session.close();
return result;
}
//根据id删除
public int deleteUserById(int id) {
SqlSession session = SqlSessionUtils.getSession();
int result = session.delete("com.example.Mapper.UserMapper.deleteUserById", id);
session.commit();
session.close();
return result;
}
}
UserMapper文件
package com.example.mapper;
import com.example.domain.User;
import java.util.List;
public interface UserMapper {
/**
* 全查询
* @return
*/
public List<User> selectAll();
/**
* 根据ID查询一个
* @return
*/
public User queryById(int id);
/**
* 添加用户
* @return
*/
public int addUser(User user);
/**
* 修改用户
* @return
*/
public int updateUserById(User user);
/**
* 删除用户
* @return
*/
public int deleteUserById(int id);
}
由此可见,UserDao实现了方法,而UserMapper则只是写了接口,里面内容的实现交给了MyBatis去实现。
而UserDao调用和UserMapper调用就只是细微的差距,差异点如下
UserDao的调用
package com.example.test;
import com.example.dao.UserDao;
import com.example.domain.User;
import org.junit.Test;
import java.util.Date;
import java.util.List;
public class MyBatisTest {
private UserDao userDao = new UserDao();
//查询全部
@Test
public void test1(){
List<User> userList = userDao.selectAll();
userList.forEach(System.out::println);
}
//根据id进行查询
@Test
public void test2(){
User SelectUserById = userDao.queryById(2);
System.out.println("user = "+SelectUserById);
}
//插入新user
@Test
public void test3(){
User user = new User("0000", 22, "男", "北京", new Date(2001 - 10 - 2));
int res = userDao.addUser(user);
System.out.println(res);
}
//根据id进行修改
@Test
public void test4(){
// int res2 = userDao.updateUserById(new User(8,"马化腾",55,"女","北京",new Date(2001-10-2)));
// System.out.println(res2);
UserDao userDao = new UserDao();
User user = new User();
user.setId(7);
user.setName("王老七");
user.setAge(52);
user.setSex("女");
user.setAddress("湖南");
user.setBirth(new Date(2001-10-2));
int rows = userDao .updateUserById(user);
System.out.println("rows = " + rows);
}
//删除用户
@Test
public void test5(){
int a = userDao.deleteUserById(8);
System.out.println(a);
}
}
UserMapper的调用
package com.example.test;
import com.example.domain.User;
import com.example.mapper.UserMapper;
import com.example.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.List;
//增删改需要在代码后加上session.commit();
public class MyBatisTest3 {
SqlSession sqlSession;
@Before
public void init() {
// 获取SqLSession对象
sqlSession = SqlSessionUtils.getSession();
}
@After
public void destory() {
sqlSession.commit();
sqlSession.close();
}
@Test
public void test1() {
// 通过SqLSession获取接口的实现类对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.selectAll();
userList.forEach(System.out::println);
}
//根据id查询用户
@Test
public void test2(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryById(3);
System.out.println(user);
}
//插入用户
@Test
public void test3(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
//user.setId(9);
user.setName("33");
user.setAge(55);
user.setSex("女");
user.setAddress("湖南");
user.setBirth(new Date(2001-10-2));
int rows = mapper.addUser(user);
System.out.println("rows = " + rows);
}
//根据id修改用户
@Test
public void test4(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res2 = mapper.updateUserById(new User(9,"马化腾",55,"男","北京",new Date(2001-10-2)));
System.out.println("res2 = " +res2);
}
//根据id删除用户
@Test
public void test5(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int a = mapper.deleteUserById(7);
System.out.println(a);
}
}