5、基于Mapper接口下的数据操作
5.1、概述
在 mybatis 中 dao 层的接口名字不推荐使用Dao,而是修改成Mapper,例如 UserDao 修改成 UserMapper
由于在 dao(mapper)的实现类中对 sqlsession 的使用方式很类似。mybatis 提供了接口的动态代理
5.2、动态Mapper接口的注意事项
1.将dao包更改命名为com.luke.mapper(可选)
2.将接口也改为xxMapper的形式(可选)
3.删除所有的dao类实现类(必须)因为此时我们是通过动态代理的方式来生产其操作类
4.将映射文件放在mapper包下,并且将该映射文件名更改为接口的名字.xml
mapper.xml
namespace:
根标签的 namespace 属性称为名称空间,如果希望使用 mybatis 通过的动态代理的接口,就需要 namespace 中的值,和需要对应的Mapper(dao)接口的全路径一致
Mapper中namespace定义本身没有限制,只要不重复即可,但是如果要想使用Mybatis提供的动态代理,namespace必须为dao接口的全路径
5.注意此时还需要保证我们接口中的方法名和配置文件中的id名称保持一致
5.3、具体操作
mapper接口
package com.luke.mapper;
import com.luke.pojo.User;
import java.util.List;
public interface UserMapper {
public int insertUser(User vo) throws Exception;
public int updateUser(User user) throws Exception;
public int deleteUserById(Long id) throws Exception;
public Integer selectCount() throws Exception;
public User queryUserById(Long id) throws Exception;
public List<User> queryAllUser() throws Exception;
}
测试类:
package com.luke.test;
import com.luke.mapper.UserMapper;
import com.luke.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class TestMyBatis {
private UserMapper userMapper ;
private SqlSession sqlsession;
@Before
public void setUp() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlsession = sqlSessionFactory.openSession();
userMapper = sqlsession.getMapper(UserMapper.class);
}
@After
public void tearDown() throws Exception {
sqlsession.close();
}
@Test
public void testInsertUser() throws Exception {
Date birthday = new Date();
User user = new User( "关羽3", "123456", 15, "男", birthday);
int result=-1;
try {
result = userMapper.insertUser(user);
sqlsession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlsession.rollback();
}
System.out.println(result);
}
@Test
public void testUpdateUser() throws Exception {
Date birthday = new Date();
User user = new User( 6,"关羽2", "123456", 15, "男", birthday);
int result=-1;
try {
result = userMapper.updateUser(user);
sqlsession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlsession.rollback();
}
System.out.println(result);
}
@Test
public void testDeleteUserById() throws Exception {
int result=-1;
try {
result = userMapper.deleteUserById(6l);
sqlsession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlsession.rollback();
}
System.out.println(result);
}
@Test
public void testSelectCount() throws Exception {
int result=-1;
try {
result = userMapper.selectCount();
} catch (Exception e) {
e.printStackTrace();
}finally{
sqlsession.close();
}
System.out.println(result);
}
@Test
public void testQueryAll() throws Exception {
List<User> list = null ;
try {
list = userMapper.queryAllUser();
} catch (Exception e) {
e.printStackTrace();
}finally{
sqlsession.close();
}
for (User u:list){
System.out.println(u);
}
}
@Test
public void testQueryUserById() throws Exception {
User user = null ;
try {
user = userMapper.queryUserById(3l);
} catch (Exception e) {
e.printStackTrace();
}finally{
sqlsession.close();
}
System.out.println(user);
}
}
UserMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:命名空間 (保证唯一)
-->
<mapper namespace="com.luke.mapper.UserMapper">
<insert id="insertUser" parameterType="hello">
insert into tb_user (userid,user_name,pwd,age,sex,birthday)
values(seq_user.nextval,#{userName},#{pwd},#{age},#{sex},#{birthday})
</insert>
<update id="updateUser" parameterType="hello">
update tb_user set user_name=#{userName},pwd=#{pwd},age=#{age},sex=#{sex},birthday=#{birthday}
where userid=#{userid}
</update>
<delete id="deleteUserById" parameterType="long">
delete from tb_user where userid=#{userid}
</delete>
<select id="selectCount" resultType="int">
select count(*) from tb_user
</select>
<select id="queryAllUser" resultType="hello">
select USERID,
USER_NAME,
PWD,
AGE,
SEX,
BIRTHDAY
from tb_user
</select>
<select id="queryUserById" resultType="hello">
select USERID,
USER_NAME,
PWD,
AGE,
SEX,
BIRTHDAY
from tb_user where userid = #{userid}
</select>
</mapper>
mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties"></properties>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--设置别名-->
<typeAliases>
<!--单一配置
<typeAlias type="com.luke.pojo.User" alias="User"></typeAlias>
-->
<package name="com.luke.pojo"></package>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/luke/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
5.4、动态代理方式总结
使用Mapper接口不用写接口实现类即可完成数据操作,使用非常简单,也是官方推荐的方式,使用Mapper接口也必须具备以下几个条件
1.Mapper的namespace必须和mapper接口的全路径保持一致
2.Mapper接口的方法名必须和 sql定义的id一致
3.Mapper接口中的输出参数类型必须和sql定义的resultType一致