三. 测试
三.一 根据id 查询单个对象
@Test public void getByIdTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); // 获取相应的 实体Mapper, 是接口的形式 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); // 调用userMapper 接口中的方法 getById User user=userMapper.getById(1); System.out.println(user); }
三.二 查询全部的对象
@Test public void findAllTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> allList=userMapper.findAll(); allList.forEach(n ->System.out.println(n)); }
测试运行效果:
只需要接口 即可,不需要相应的实现类。
四. Mapper 方式的匹配点
在利用Mapper 方式进行处理的时候,需要遵守以下的几个原则:
1.接口名称与类配置文件的名称保持一致。 一个是UserMapper.java, 一个是UserMapper.xml , 最好的命名方式为 类实体+Mapper 的形式。 (非必须)
2.xml 文件的命名空间为 接口的全限定名称, 这样可以方便的找到用的是哪一个接口。
<mapper namespace="com.yjl.mapper.UserMapper">
3.接口中的方法名称要与 xml配置文件中的id 保持一致。
如方法名称是 getById, 那么select 语句中的id 就是getById, 方法名称是insertUser, 那么insert 语句中的id 就是insertUser 。 可用于方法重载的情况。
4.参数类型一致. 接口中的方法的参数类型要与 statement 中的parameterType 的类型保持一致。
5.返回结果一致。 接口中的方法的返回值,要与statement 中的resultType 的类型保持一致,但并非一模一样。 接口的返回类型为List, resultType 的类型只是对象类型即可。
保持一致是为了自动生成代码。
User user = sqlSession.selectOne("test.findUserById", id); sqlSession.insert("test.insertUser", user);
五. 插入操作 insert
五.一 普通插入
UserMapper.java 中接口:
public int insertUser(User user);
UserMapper.xml 中接口:
<!-- 插入语句,用别名的方法 user 来替换 com.yjl.pojo.User 类 --> <insert id="insertUser" parameterType="user"> insert into user(name,age,sex,description) values(#{name},#{age},#{sex} ,#{description}) </insert>
测试方法,有自动提交,回滚的 异常处理的。
@Test public void insertTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=new User(); user.setName("老蝴蝶"); user.setAge(25); user.setSex("男"); user.setDescription("这是一个老蝴蝶"); try{ userMapper.insertUser(user); //调用插入的方法,进行插入。 //需要手动提交事务 sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); }finally{ sqlSession.close(); } System.out.println("输出信息:"+user); }
测试运行之后:
数据库插入数据: (为3的那一条是 sqlSession 没有手动提交的脏数据)
五.二 有id 值的处理
五.一 处理时,发现查询时,并没有查询出id 的值。 需要查询出id 的值信息。
<!-- 插入记录 ,获取id编号--> <insert id="insertUser" parameterType="user" keyProperty="id" useGeneratedKeys="true"> insert into user(name,age,sex,description) values(#{name},#{age},#{sex} ,#{description}) </insert>
测试方法不变, 日志输出为:
有相应的id 信息。
五.三 数据库查询id
<!-- 数据库查询,获取id编号--> <insert id="insertUser" parameterType="com.yjl.pojo.User"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select last_insert_id() </selectKey> insert into user(name,age,sex,description) values(#{name},#{age},#{sex} ,#{description}) </insert>
输出日志为:
五.四 uuid 插入
将id 的类型 改成String 类型,
数据库中id 列的类型也改成varchar 类型
xml sql语句为:
<!-- uuid插入,获取id编号--> <insert id="insertUser" parameterType="user"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> select uuid() </selectKey> <!-- 这个时候,sql 语句就要写id 了。 --> insert into user(id,name,age,sex,description) values(#{id},#{name},#{age},#{sex} ,#{description}) </insert>
测试方法:
@Test public void insertTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=new User(); user.setName("老蝴蝶uuid"); user.setAge(25); user.setSex("男"); user.setDescription("这是一个老蝴蝶uuid 测试"); try{ userMapper.insertUser(user); //调用插入的方法,进行插入。 //需要手动提交事务 sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); }finally{ sqlSession.close(); } System.out.println("输出信息:"+user); }
输出日志为:
五.五 序列形式的插入
没有oracle 客户端,不进行验证了。
<!-- oracle 序列插入,获取id编号--> <insert id="insertUser" parameterType="com.yjl.pojo.User"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer"> select 序列名.nextval() </selectKey> <!-- 这个时候,sql 语句就要写id 了。 --> insert into user(id,name,age,sex,description) values(#{id},#{name},#{age},#{sex} ,#{description}) </insert>
六. 修改操作 update
修改的接口 :
public int updateUser(User user);
修改对应的xml sql语句:
<update id="updateUser" parameterType="user"> update user set name=#{name},sex=#{sex},age=#{age},description=#{description} where id=#{id} </update>