Mybatis - Day01

Mybatis - Day01

注意! mybatis默认不提交事务,所以在每次修改,增加,删除之后都要手动提交

  1. 注意:这里我们userMapping 映射我们最好跟我们的Dao层是同级的 所以我们也创建一个it.heima的目录

  2. Mybatis实现数据库的查询 (先导坐标)

    • 第一步:先创建一个user类 给出set get方法

    • 第二步:创建一个userMapping.xml配置文件 在里面编写我们需要的sql语句 注意这里是是resultType 不是resultMap

      <?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="userMapper">
            <!--调用的时候是userMapper.findAll 来调用这个sql语句    resultMap里面的是你得到的结果封装成这个对象-->
          <select id="findAll"  resultType="com.itheima.pojo.User">
              select * from user
          </select>
      </mapper>
    • 第三步:创建一个数据源配置文件(sqlMapConfig.xml文件) 里面连接userMapping.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>
      ​
           <!--数据源环境-->
           <environments default="develpment"> <!--表示默认使用id为devlement的环境配置-->
               <environment id="develpment">
                   <transactionManager type="JDBC"></transactionManager>
                   <dataSource type="POOLED">
                       <property name="driver" value="com.mysql.jdbc.Driver"/>
                       <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                       <property name="username" value="root"/>
                       <property name="password" value="xjj168"/>
                   </dataSource>
               </environment>
           </environments>
      ​
          <!--加载Mapping映射文件-->
          <mappers>
              <mapper resource="com\itheima\mapping\UserMapping.xml"></mapper>
          </mappers>
      </configuration>
    • 第四步:编写程序测试

      @Test
      public void test() throws IOException {
          //得到核心配置文件sqlMapConfig.xml
          InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
          //创建session工厂对象
          SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
          //获得session回话对象
          SqlSession sqlSession = sqlSessionFactory.openSession();
          //执行操作  参数为namespace.id
          List<User> userList = sqlSession.selectList("userMapper.findAll");
          for (User user : userList) {
              System.out.println(user);
          }
      ​
      ​
      }

      先获取核心配置文件,在创建session工厂对象,然后获得session会话对象,执行操作

  3. 增加user操作

    注意! 注释里面的#{}也默认占了一个占位符(下面这种注释里面有#{}就会报错)

    <!--增加user--> <!--这里是参数类型,你增加一个用户,肯定是传进来一个参数user ,所以这里是参数类型,不是结果类型-->
    <insert id="save" parameterType="com.itheima.pojo.User">
             /*这里采用${}的方式来获取你传进来的user的username属性和password属性*/
        insert into user values(#{id},#{username},#{password})
    </insert>

    正确的xml文件是 注释里面没有#{}, 这里是parameterType属性来表示你要插入的类型

    <!--增加user--> <!--这里是参数类型,你增加一个用户,肯定是传进来一个参数user ,所以这里是参数类型,不是结果类型-->
    <insert id="save" parameterType="com.itheima.pojo.User">
             /*这里采用的方式来获取你传进来的user的username属性和password属性*/
        insert into user values(#{id},#{username},#{password})
    </insert>
    //执行增加user操作  因为目前没有客户端所以手动创建一个user对象
    User user = new User();
    user.setUsername("tom");
    user.setPassword("adc");
    //之后经行操作
    sqlSession.insert("userMapper.save",user);
    //千万注意! mybatis默认不主动提交事务 所以我们需要手动提交
    sqlSession.commit();
    ​
    ​
    sqlSession.close();
  4. 删除操作

    <!--删除操作-->                  <!--你要传进来的参数的类型-->
    <delete id="delete" parameterType="com.itheima.pojo.User">
                      /*老师的parameterType="java.long.Integer"> */
        delete from user where id = #{id}
    </delete>
    //获取session会话对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    User user = new User();
    user.setId(3);
    ​
    //执行操作
    sqlSession.update("userMapper.delete",user);
    ​
    sqlSession.commit();
    sqlSession.close();
  5. 抽取jdbc.properties文件(resource里面是jdbc问的路径)

    <!--导入jdbc.properties文件-->
    <properties resource="jdbc.properties"></properties>
     <!--数据源环境-->
     <environments default="development"> <!--表示默认使用id为development的环境配置-->
         <environment id="development">
             <transactionManager type="JDBC"></transactionManager>
             <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}"/>
  6. 在sqlMappingConfig文件中为我们映入的UserMapper.xml中 执行sql语句是需要传入的type定义一个别名

    sqlMappingConfig文件 (注意typeAliases 和configuration之间的顺序)

       <!--定义User一个别名,这样他在映射文件写type的时候就只需要用别名即可-->
    <typeAliases>
        <typeAlias type="com.itheima.pojo.User" alias="user"></typeAlias>
    </typeAliases>

    上面定义了别名那么UserMapper.xml文件的type可以写成user

    <select id="findAll"  resultType="user">
        select * from user
    </select>
  7. 如果在获取session会话对象的时候给传入true 则会帮你自动提交

     //获取session会话对象
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    User user = new User();
    user.setUsername("lzx");
    user.setPassword("sss");
    user.setId(2);
    //执行操作
     sqlSession.update("userMapper.update",user);
    ​
    //  sqlSession.commit();

让Mybatis自动给你创建实现类

  1. 以前写Dao层的时候,我们需要一个接口,一个实现类,现在有了Mybatis只要准寻他的规则,就自动帮我们创建实现类

    规则:

    • 接口中定义的方法的返回值,必须和UserMapper.xml中你的sql语句的结果返回类型一样(比如通过id查一个人,返回值必须是user,接口的返回值也要是user)

      <select id="findById" parameterType="int" resultType="user">
          select * from user where id=#{id}
      </select>
    • 接口中定义的方法的方法名,必须和UserMapper.xml中你的sql语句的id的值一样

    • 你想要Mybatis给你创建实现类的接口的权限的名必须和UserMapper.xml中的namespace名字一样

      <mapper namespace="com.itheima.dao.UserMapper">
    • 接口中传入的参数的类型,必须和UserMapper.xml中你的sql语句的parameterType的类型一样

      parameterType="int"
    • 接口的方法例子

      public List<User> findAll();
      ​
      public User findById(int id);
      ​
          public void save(User user);
      ​
          public void deleteById(int id);
      ​
          public void updateById(User user);
    • UserMapper.xml的例子

      <mapper namespace="com.itheima.dao.UserMapper">
      ​
          <!--查询操作-->
          <select id="findAll" resultType="user">
              select * from user
          </select>
      ​
          <!--根据id进行查询-->
          <select id="findById" parameterType="int" resultType="user">
              select * from user where id=#{id}
          </select>
          
              <!--增加一个用户-->
          <insert id="save" parameterType="user" >
      ​
              insert into user(username,password) values(#{username},#{password})
          </insert>
      ​
          <!--删除一个用户-->
          <delete id="deleteById" parameterType="int">
              delete from user where id=#{id}
          </delete>
      ​
          <!--跟新用户-->
          <update id="updateById" parameterType="user" >
              update user set username = #{username} where id = #{id}
          </update>
      ​
      </mapper>
  2. 上面规则都正确了怎么调用呢?(注意这里getMapper中参入的参数是你要创建的实现类的接口.class)

    InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    ​
        //这里是参数是Dao层的接口,传入之后会自动帮你生成一个代理实现类
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    ​
      //生成的实现类 ,你直接调用方法即可
      List<User> userList = mapper.findAll();
    ​
    System.out.println(userList);
    ​
    User user = mapper.findById(1);
    ​
    System.out.println(user);
    ​
    ​

动态的sql语句

  1. 以前的sql语句我们通过id=? 来查找一个人 没有id 来查找全部人, 现在 我们动态的将两个方法结合在一起

    • 使用动态的sql 不仅可以查找单个人,也可以查找所有人,

    • 我们查找单个人的sql语句是

      select * from user where id=?或者select * from user where id=?and username=? and password=?

    • 我们查找全部sql

      select * from user

    • 现在讲两者集合在一起 用if 来判断 是否等于0或者null 如果where里面有值,那么 where 判断语句就出现变成select * from user where id=?and username=? and password=?,如果 id username ,password 三个都没值,那么where就自动消失 变成了select * from user

      注意! if之间有个and

      <mapper namespace="com.itheima.mapper.UserMapper">
          <select id="findUser" parameterType="user" resultType="user">
              select * from user
             <where>
                 <if test="id!=0">
                     and id=#{id}
                 </if>
                 <if test="username!=null">
                     and username=#{username}
                 </if>
                 <if test="password!=null">
                     and password=#{password}
                 </if>
             </where>
          </select>
  2. 查询一个区间的user

    • 查询id 等于一个区间内的user

    • 接口方法为

      List<User> queryBetween(List<Integer> ids);
    • sql语句为

      <select id="queryBetween" parameterType="list" resultType="user">
          select * from user
          <where>
              <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                  #{id}
              </foreach>
          </where>
      </select>
    • 测试

        ArrayList<Integer> ids = new ArrayList<Integer>();
      ​
           ids.add(1);
           ids.add(4);
           ids.add(6);
          List<User> userList = mapper.queryBetween(ids);
          System.out.println(userList);
      ​
      ​
      }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值