发表于: 2018-01-31 22:21:43

1 571


今日完成

  学习mybatis;

1.编写mybatis中原始dao开发;

2.mapper代理方法开发dao

  在mybatis中使用mapper代理来开发dao,不需要我们去写具体的实现,在定义好了mapper.xml文件之后,  sqlSession自动创建一个mapper接口的代理对象。通过这个代理对象来实现接口中的方法。

   需要注意的是:

     1.在mapper.xml中,使namespace等于mapper接口的地址(完全限定名)

         若不一致则会抛出找不到映射文件的异常

     2.mapper.java接口中的方法名和mapper.xml中statement的id一致

         若不一致则会抛出找不到映射文件的异常

     3.mapper.java接口中方法的输入参数类型和mapper.xml中statement的parameterType指定的类型一致

     4.mapper.java接口中方法返回值类型和mapper.xml中statement的resultType指定的类型一致


下面是通过原始dao开发 和用mapper代理方法开发dao的实例

  DAO接口

public interface Dao1 {
public User findUserById(int id) throws IOException;//查询
   public List<User> findUserByname(String name)throws IOException;
   //模糊查询(查询结果不一定只有一个,所以将查询结果放入List集合中。
   public void insertUser(User3 user) throws  Exception;//增加
   public  void deleteUser(int id) throws  Exception;//删除指定id的记录
   public void updateUser(User user) throws Exception;//更改指定id的数据

在使用原始dao开发时实现类

public class UserDaoImpl implements Dao1 {
private SqlSessionFactory sqlSessionFactory;
   public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
   }

@Override
   public User findUserById(int id) throws IOException {
SqlSession sqlSession=sqlSessionFactory.openSession();
       User user=sqlSession.selectOne("test.findUserById", id);
       sqlSession.close();
       return user;
   }
@Override
   public List<User> findUserByname(String name) throws IOException {
SqlSession sqlSession=sqlSessionFactory.openSession();
       List<User> list=sqlSession.selectList("test.findUserByname",name);
       return list;
   }
@Override
   public void insertUser(User3 user) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
       sqlSession.insert("test.insertUser", user);
       sqlSession.commit();
       sqlSession.close();
   }
@Override
   public void deleteUser(int id) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
       sqlSession.delete("test.deleteUser", id);
       sqlSession.commit();
       sqlSession.close();

   }
@Override
   public void updateUser(User user) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
       sqlSession.update("test.updateUser", user);
       sqlSession.commit();
       sqlSession.close();
   }
}

  单元测试


public class TestDaoImpl {
private SqlSessionFactory sqlSessionFactory;

 @Before//通过before在所有的测试方法之前都先执行这个方法。如果不注解,则出报出sqlSessionFactory空指针异常

 public  void setUp() throws Exception{//创建sqlSessionFactory

String resource="SqlMapConfigDaoTest.xml";
     InputStream inputStream= Resources.getResourceAsStream(resource);
     sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

 }

//通过原始dao开发

@Test
   public void testFindInsertUser() throws Exception{
     Dao1 dao1=new UserDaoImpl(sqlSessionFactory);
     System.out.println(dao1.findUserById(1));//通过ID查询,并输出结果
     System.out.println(dao1.findUserByname("张"));//通过名字模糊查询,并输出结果
     User3 user=new User3("赵六2",null,"女","重庆大学");

     dao1.insertUser(user);//插入数据

//通过mapper代理方法开发dao

@Test
public void testFindUserById() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();
   UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
   User user=userMapper.findUserById(5);
   System.out.println(user);
}
@Test
public void testFindUserByName() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
   UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
   List<User> p=userMapper.findUserByname("四");
   sqlSession.close();
   System.out.println(p);
}
}

<?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"/>//通过db.properties加载属性文件
   <typeAliases>

       <package name="POJO"/>//批量自定义别名

   </typeAliases>

   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC" />
           <dataSource type="POOLED">
               <property name="driver" value="${jdbc.driver}" />
               <property name="url" value="${jdbc.url}" />
               <property name="username" value="${jdbc.username}" />
               <property name="password" value="${jdbc.password}" />
           </dataSource>
       </environment>
   </environments>
   <mappers>
      <!-- <mapper resource="User4.xml" />

       <mapper resource="UserMapper.xml" />//通过mapper代理方法开发dao

       -->

       <mapper resource="User4.xml" />//原始dao开发
   </mappers>
</configuration>

映射文件1

<?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">

<mapper namespace="test">
   <select id="findUserById" parameterType="int" resultType="User">
       select * from user where id = #{id}
</select>
 <select id="findUserByname" parameterType="java.lang.String" resultType="User2">
      select * from user where username like '%${value}%'
</select>
<insert id="insertUser" parameterType="User3">
        insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select last_insert_id()
</selectKey>
 </insert>
     <delete id="deleteUser" parameterType="java.lang.Integer">
         delete from user where id=#{id}
</delete>
   <update id="updateUser" parameterType="User">
         update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
 </mapper>

映射文件2

<?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">
<mapper namespace="Dao.Dao1">
   <select id="findUserById" parameterType="int" resultType="POJO.User">
       select * from user where id = #{id}
</select>
   <select id="findUserByname" parameterType="java.lang.String" resultType="POJO.User2">
       select * from user where username like '%${value}%'
</select>
   <insert id="insertUser" parameterType="POJO.User3">
       insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
           select last_insert_id()
</selectKey>
   </insert>
   <delete id="deleteUser" parameterType="java.lang.Integer">
       delete from user where id=#{id}
</delete>
   <update id="updateUser" parameterType="POJO.User">
       update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>

     映射文件1和2除了namespace不同,其他地方都相同。

3.resultMap

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

4.定义包装类型pojo 

   通过定义包装类型pojo 可以进行比较复杂的查询需求;

5.动态sql

   动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

映射文件1

<?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">
<mapper namespace="test">
   <!-- 模糊查询 -->
   <select id="findUserList" parameterType="java.lang.String" resultType="User2">
       select * from user
<where>
         <include refid="sqlfrase"></include>
       </where>

   </select>

 <!--右边拼接AND ( id=n1 OR id=n2 OR id=n3 ) sql语句:select * from user WHERE user.sex = ? and user.username like '%user.username%' AND ( id=n1 OR id=n2 OR id=n3 )  -->

   <sql id="sqlfrase" >
       <if test="user!=null">
           <if test="user.sex!=null and user.sex!=''" >
               and user.sex=#{user.sex}
</if>
           <if test="user.username!=null and user.username!=''">
               and user.username like '%${user.username}%'
</if>
           <if test="ids!=null">
               <foreach collection="ids" item="user_id" open="AND(" close=")" separator="OR">
                   id=#{user_id}
</foreach>
           </if>
       </if>
   </sql>
  <!--右边拼接AND id IN(n1,n2,n3) sql语句:select * from user WHERE user.sex = ? and user.username like '%user.username%' AND AND id IN(n1,n2,n3) -->
   <!---
   <sql id="sqlfrase" >
       <if test="user!=null">
           <if test="user.sex!=null and user.sex!=''" >
               and user.sex=#{user.sex}
           </if>
           <if test="user.username!=null and user.username!=''">
               and user.username like '%${user.username}%'
           </if>
           <if test="ids!=null">
               <foreach collection="ids" item="user_id" open="AND id IN(" close=")" separator=",">
                   id=#{user_id}
               </foreach>
           </if>
       </if>
   </sql>-->
</mapper>

映射文件2

<?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">
<mapper namespace="Dao.UserMapperIn">
   <!-- 模糊查询 -->
   <select id="findUserList" parameterType="java.lang.String" resultType="POJO.User2">
       select * from user
<where>
           <include refid="test.sqlfrase"></include>//调用映射文件1的sql片段
       </where>
   </select>
</mapper>

  测试单元

public class TestIn {
private SqlSessionFactory sqlSessionFactory;
   @Before
   public void setUp() throws IOException {
String resource = "SqlMapConfigDaoTest.xml";
       InputStream inputStream = Resources.getResourceAsStream(resource);
       sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
   }
@Test
   public void testFindUserList() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
       UserMapperIn userMapperIn=sqlSession.getMapper(UserMapperIn.class);
       UserQueryVO userQueryVO=new UserQueryVO();
       User user=new User();
       user.setSex("男");
       user.setUsername("五");
       List<Integer> ids=new ArrayList<Integer>();
       ids.add(1);
       ids.add(10);
       ids.add(3);
       userQueryVO.setIds(ids);
       userQueryVO.setUser(user);
       List<User> p=userMapperIn.findUserList(userQueryVO);
       System.out.println(p);
   }
}

   DAO

public interface UserMapperIn {
public List<User> findUserList(UserQueryVO userQueryVO)throws IOException;
}

  实体类

public class UserQueryVO {
private User user;
   private List<Integer> ids;
   public List<Integer> getIds() {
return ids;
   }
public void setIds(List<Integer> ids) {
this.ids = ids;
   }
public User getUser() {
return user;
   }
public void setUser(User user) {
this.user = user;
   }
@Override
   public String toString() {
return "UserQueryVO{" +
"user=" + user +
", ids=" + ids +
'}';
   }
}

明天计划

1.学习单元测试(任务一:18-20);

遇到问题

1.运行测试单元,报空指针异常。师兄指出:未在创建sqlSessionFactory时加上@Before,导致报错;

2.在编写mapper.java接口时方法名和mapper.xml中的id不一致,导致找不到映射文件。看错误报告后,查询mapper.xml文件和接口文件,改为相同后解决;

收获

学习到了mybatis中的DAO编写和动态sql;

运行测试单元时,遇到一些系统报错,通过师兄的帮助和网上查询都圆满解决。知道了一些常见的坑,避免以后再次发生同样的错误;



返回列表 返回列表
评论

    分享到