1.mapper动态代理
使用mapper映射来,联系sql语句和代码函数。
步骤一:在上一篇基础的上,新增一个接口,要求与UserMapper的xml配置文件同名,加入在xml中的所有sql的id相同的方法,即方法名相同,入参和返回值都相同
步骤二:修改usermapper的命名空间为接口的类路径
步骤三:在获得sqlSession之后,使用getMapper(interface.class),会返回一个与入参相同类型的接口对象,可以用该对象来调用方法。
package com.test.mapper;
import java.util.List;
import com.test.domain.User;
public interface UserMapper {
public void addUser2(User user);
public void deleteUser(Integer id);
public void updateUser(User user);
public User selectUser(Integer id);
public List<User> selectAllUser();
}
package com.test.test;
import java.io.IOException;
import java.util.List;
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.Test;
import com.test.domain.User;
import com.test.mapper.UserMapper;
public class test1 {
public static SqlSession sqlSession;
public static UserMapper mapper;
public static void init() throws IOException {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("sqlMapConfig.xml"));
sqlSession = sqlSessionFactory.openSession();
mapper = sqlSession.getMapper(UserMapper.class);
System.out.println("test1 init ");
}
@Test
public void testAddUser2() throws Exception {
init();
User user = new User(1,"addmapmth");
mapper.addUser2(user);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDeleteUser() throws Exception {
init();
//User user = new User(1,"addmapmth");
mapper.deleteUser(1008);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdateUser() throws Exception {
init();
User user = new User(1010,"addmapmth");
mapper.updateUser(user);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testSelectUser() throws Exception {
init();
//User user = new User(1,"addmapmth");
User user = mapper.selectUser(1010);//.addUser2(user);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testSelectAllUser() throws Exception {
init();
//User user = new User(1,"addmapmth");
List<User> user = mapper.selectAllUser();//.selectUser(1010);//.addUser2(user);
for (User user2 : user) {
System.out.println(user2);
}
sqlSession.commit();
sqlSession.close();
}
}
2.sqlMapconfig.xml配置标签
注意:
在配置文件中(sqlMapConfig.xml)
标签顺序从上到下:properties 、settings、typeAliases、environments 、mappers。顺序出错,也会报错
思考一下:
properties配置数据库的驱动,类路径,帐号,密码。也可以是别的,算是用户自定义配置
settings设置二级缓存和延迟加载。现在都是用分布式缓存,redis,等
typeAliasses设置类别名,以便可以在mapper中使用,所以至少应在mapper之前
environment设置jdbc什么的,在与spring整合中会被废弃
mappers存放sql的映射文件
别名标签:
<typeAliases>
<!--
<typeAlias 设置类《==》别名
<package 设置包中所有的类《==》别名
-->
<package name="com.test.domain"/>
<!--
<typeAlias type="com.test.domain.User" alias="User"/>
-->
</typeAliases>
映射器标签:
<mapper class=" " />
使用mapper接口类路径
如:<mapper class="cn.xxx.mapper.UserMapper"/>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
<package name=""/>
注册指定包下的所有mapper接口
如:<package name="cn.xxx.mapper"/>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。