这里未与其他框架如spring、SpringBoot整合,只是单纯使用mybatis进行学习、研究。当 Mybatis 与一些依赖注入框架(如 Spring 或者 Guice)搭配使用时,SqlSession 将被依赖注入框架创建并注入,所以你需要使用 SqlSessionFactoryBuilder 或者 SqlSessionFactory
【1】注解接口-UserMapper
注意,接口上面没有使用@Repository注解:
public interface UserMapper {
@Insert("insert into t_user(username,age) values(#{name},#{age})")
public int addUser(User user);
@Delete("delete from t_user where id=#{id}")
public int deleteUser(int id);
@Update("update t_user set username=#{name},age=#{age} where id=#{id}")
public int updateUser(User user);
@Select("select * from t_user where id=#{id}")
public User getUser(int id);
@Select("select * from t_user")
public List<User> getUsers();
}
注册到全局配置文件mybatis.xml
<mappers>
<mapper resource="com/web/mapper/userMapper.xml"/>
<mapper resource="com/web/mapper/orderMapper.xml"/>
<mapper class="com.web.mapperClass.UserMapper"/>
//注意,未与userMapper.xml放在同一包下
</mappers>
【2】增删改查实例
① 两种方式
- 直接使用sqlsession的相关方法进行数据操作;
- 根据目标类型创建代理接口进行数据操作
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
* 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
* 3、将sql映射文件注册在全局配置文件中
* 4、写代码:
* 1)、根据全局配置文件得到SqlSessionFactory;
* 2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
* 一个sqlSession就是代表和数据库的一次会话,用完关闭
* 3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
*
* @throws IOException
*/
@Test
public void test() throws IOException {
// 2、获取sqlSession实例,能直接执行已经映射的sql语句
// sql的唯一标识:statement Unique identifier matching the statement to use.
// 执行sql要用的参数:parameter A parameter object to pass to the statement.
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
Employee employee = openSession.selectOne(
"com.mybatis.EmployeeMapper.selectEmp", 1);
System.out.println(employee);
} finally {
openSession.close();
}
}
@Test
public void test01() throws IOException {
// 1、获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
// 2、获取sqlSession对象
SqlSession openSession = sqlSessionFactory.openSession();
try {
// 3、获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
System.out.println(mapper.getClass());
System.out.println(employee);
} finally {
openSession.close();
}
}
② 测试实例代码
/*use annotation*/
@Test
public void testAdd(){
SqlSession session = MybatisUtils.getFactory().openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int addUser = mapper.addUser(new User("Tom6", 16));
/*return the effect rows*/
/*default is not auto commit*/
session.commit(true);
session.close();
System.out.println("effect rows.."+addUser);
}
@Test
public void testSelect(){
/*set auto commit ,which equals to the above*/
SqlSession session = MybatisUtils.getFactory().openSession(true);
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUser(7);
/*return the effect rows*/
System.out.println("effect rows.."+user);
}
@Test
public void testUpdate(){
SqlSession session = MybatisUtils.getFactory().openSession(true);
UserMapper mapper = session.getMapper(UserMapper.class);
int updateUser = mapper.updateUser(new User(7,"Tom62", 162));
/*return the effect rows*/
System.out.println("effect rows.."+updateUser);
}
@Test
public void testDelete(){
SqlSession session = MybatisUtils.getFactory().openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int deleteUser = mapper.deleteUser(6);
/*return the effect rows*/
/* commit by yourself*/
session.commit();
System.out.println("effect rows.."+deleteUser);
session.close();
}
@Test
public void testGetUsers(){
SqlSession session = MybatisUtils.getFactory().openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
/*return the List<User>*/
List<User> users = mapper.getUsers();
session.commit();
System.out.println("effect rows.."+users);
session.close();
}
【3】同时使用基于注解和xml注意事项
① userMapper.xml 与namespace
若不一致,如namespace改为com.web.mapper.userMapperError
,将会报错
② userMapper.xml与UserMapper.class不应放在同一包下
通常这种情况也很少出现,这里只做测试使用。mapper接口是可以标记注解的,如@Select("select * from tbl_employee where id=#{id}")
,也可以配置对应的xxxMapper.xml。需要注意的是,如果一个方法使用了注解,那么此时如果还存在对应的xxxMapper.xml,则xml文件中不应该再有id与注解标记的方法名字重复的语句。
如下图所示,EmployeeMapper中方法getEmpById使用了注解,同时存在EmployeeMapper.xml中包含一个id为getEmpById的select语句,测试报下错。