美文网首页我爱编程
Mybatis框架入门

Mybatis框架入门

作者: guanalex | 来源:发表于2018-04-01 18:06 被阅读39次

    刚学习了Spring,肯定不能少了mybatis,两者既有优势又有劣势。MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 只要简单的配置和原始映射,将接口和 Java 的 POJO( 普通的Java 对象)映射成数据库中的记录.自我感觉使用起来很好。本周主要是学习了mybatis一些简单的使用过程。如mybatis框架原理、mybatis用户的增、删、改、查。mybatis开发dao两种方法:原始dao开发方法(程序需要编写dao接口和dao实现类)、mybaits的mapper接口(相当于dao接口)代理开发方法、mybatis配置文件SqlMapConfig.xml。
    mybatis核心:(mybatis输入映射、mybatis输出映射)、mybatis的动态sql。

    mybatis对数据库用户的增加、删、改、查

    (1)原始dao开发方法:
    1、配置SqlMapConfig.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">
    <!-- 
        这个xml文件主要是用来配置mybatis的环境、数据源、事物等
     -->
    
      <configuration>
       <properties resource="config/db.properties">
        <!--properties中还可以配置一些属性名和属性值  -->
        <!-- <property name="jdbc.driver" value=""/> -->
    </properties>
    <!-- 批量定义类地址别名 -->
     <typeAliases>
     
        <package name="sqlmap"/>
     </typeAliases>
    
    
    
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理,事务控制由mybatis-->
            <transactionManager type="JDBC" />
        <!-- 数据库连接池,由mybatis管理-->
            <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="config/User.xml"/>
             <!--注意在使用接口代理时要配置加载的映射文件-->
        <mapper resource="dailiDao/UserMapper.xml"/>
        <!-- 批量加载映射文件 -->
        <package name="sqlmap"/>
    </mappers>
    
    </configuration>
    

    2、创建User类

    package mybatisjdbc;
      public class User {
     //对应数据库定义的字段
         private Integer  id;
         private String  mail;
         private String name;
    public String getName() {
        return name;
      }    
    public void setName(String name) {
    this.name = name;
    }
    public Integer getId() {
            return id;
    }
    public void setId(Integer id) {
      this.id = id;
    }
      public String getMail() {
            return mail;
    }
      public void setMail(String mail) {
        this.mail = mail;
    }
    }
    

    3、代码实现

      package mybatisjdbc;
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.List;
      import javax.annotation.Resource;
      import org.apache.ibatis.io.Resources;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
        import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      org.junit.Test;
    
        public class mybatisTest {
    
    //@Test
    public void finUserbyid() throws IOException{
        //加载配置文件
        String resource="config/SqlMapconfig.xml";
        //得到配置文件流
        InputStream       inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,把mybatis配置信息传入
        SqlSessionFactory sqls=new       SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlsession
        //SqlSession sqlsession=sqls.openSession();
        SqlSession sqlSession = sqls.openSession();
    
        //通过sqlsession操作数据库
        /*
         *  参数说明:
         *  第一个参数为映射文件User.xml的id,其值为namespace.+id
         *  第二个参数为映射文件User.xml的parameterType类型的参数
         *  sqlSession+查询对应的api
         * */
          User user=sqlSession .selectOne("test.finUser", 1);
          System.out.println(user.getMail()+user.getId());
        
          sqlSession.close();
        
        
        
        
          }
        //根据用户输入模糊查询
      //@Test
      public void finUserbyname() throws IOException{
        //加载配置文件
        String resource="config/SqlMapconfig.xml";
        //得到配置文件流
        InputStream   inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,把mybatis配置信息传入
        SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlsession
        //SqlSession sqlsession=sqls.openSession();
        SqlSession sqlSession = sqls.openSession();
    
        //通过sqlsession操作数据库
        /*
         *  参数说明:
         *  第一个参数为映射文件User.xml的id,其值为namespace.+id
         *  第二个参数为映射文件User.xml的parameterType类型的参数
         * */
         List<User> user= sqlSession.selectList("test.finUsername", "xiao");
          System.out.println(user);
        
          sqlSession.close();
        
        
        
        
        }
          //添加用户信息
    //@Test
    public void addUser() throws IOException{
        //加载配置文件
        String resource="config/SqlMapconfig.xml";
        //得到配置文件流
        InputStream inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,把mybatis配置信息传入
        SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlsession
        //SqlSession sqlsession=sqls.openSession();
        SqlSession sqlSession = sqls.openSession();
    
        User user=new User();
        user.setId(6);
        user.setName("mybatis");
        user.setMail("999999");
         
        //通过sqlsession操作数据库
        /*
         *  参数说明:
         *  第一个参数为映射文件User.xml的id,其值为namespace.+id
         *  第二个参数为插入的对象
         *  无返回值
         * */
         sqlSession.insert("test.addUser",user);
         //提交事务
         sqlSession.commit();
        //关闭连接
          sqlSession.close();
    
    }
    //根据id删除用户
    //@Test
    public void deleteUser() throws IOException{
        //加载配置文件
        String resource="config/SqlMapconfig.xml";
        //得到配置文件流
        InputStream inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,把mybatis配置信息传入
        SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlsession
        //SqlSession sqlsession=sqls.openSession();
        SqlSession sqlSession = sqls.openSession();
         
        //通过sqlsession操作数据库
        /*
         *  参数说明:
         *  第一个参数为映射文件User.xml的id,其值为namespace.+id
         *  第二个参数为插入的对象
         *  无返回值
         * */
         sqlSession.insert("test.deletebyid",4);
         //提交事务
        sqlSession.commit();
        //关闭连接
          sqlSession.close();
    
            }
      //根据id修改用户信息
    @Test
    public void updateUser() throws IOException{
        //加载配置文件
        String resource="config/SqlMapconfig.xml";
        //得到配置文件流
        InputStream inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,把mybatis配置信息传入
        SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlsession
        //SqlSession sqlsession=sqls.openSession();
        SqlSession sqlSession = sqls.openSession();
    
        User user=new User();
        user.setId(6);
        user.setName("Spring");
        user.setMail("999888");
         
        //通过sqlsession操作数据库
        /*
         *  参数说明:
         *  第一个参数为映射文件User.xml的id,其值为namespace.+id
         *  第二个参数为插入的对象
         *  无返回值
         * */
         sqlSession.insert("test.update",user);
         //提交事务
         sqlSession.commit();
        //关闭连接
          sqlSession.close();
    
      }
    

    mybaits的mapper接口代理开发dao

    简单的理解就是把接口方法的实现交给mybatis,即在接口中定义方法即可在应用中直接使用完成对数据库的操作。

    (1)定义mapper接口

       package dailiDao;
    
      import mybatisjdbc.User;
        /**
         *  使用mapper代理是注意mapper.java接口中的方法名和mapper.xml    中statement的id一致
         *  mapper.java接口中的方法输入参数类型和mapper.xml中statement  的parameterType指定的类型一致
         *  mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致
       * 
     */
    
    public interface UserMapper {
    //根据id查询用户,这里使用mapper代理机制
    public User findUserById(int id) throws Exception;
    }
    

    (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的作用是对SQL进行分类管理
     -->
    <mapper namespace="test">
       <!-- 
       在映射文件中会配置许多sql语句,通过select执行对数据库查询
      id:表示映射文件中的SQL语句,通过将SQL语句封装到mapperstatement中,所以将id称为staement的id
     -->
     <!-- 
      #{}相当于占位符
      #{value}其中的value表示传入的参数,括号里面的value可随便取.
      parameterType:为输入的参数类型
      resultType:为指定数据库查询返回的映射java对象,一般为定义的某个对象的路径
      -->
    <select id="finUser" parameterType="int" resultType="mybatisjdbc.User">
       select * from user where id=#{value}
    
    </select>
    <!-- 根据用户输入进行模糊查询 -->
    <!-- 
       ${}表示拼接sql串,但会引起SQL注入问题
       ${value}表示接收参数内容,如果传入参数是简单的类型只能用value
     -->
    <select id="finUsername" parameterType="String" resultType="mybatisjdbc.User">
        select * from user where name like '%${value}%'
    </select>
    <!-- 添加用户信息 -->
    <insert id="addUser" parameterType="mybatisjdbc.User" >
      <!-- 当参数parameterType为类类型时,查询语句的值为其属性名 -->
          insert into user(id,name,mail) value(#{id},#{name},#{mail})
    </insert>
    <!-- 根据id删除用户 -->
    <delete id="deletebyid" parameterType="Int">
         delete  from user where id=#{vlaue}
    </delete>
    <update id="update" parameterType="mybatisjdbc.User">
       update user set name=#{name},mail=#{mail} where id=#{id}
    </update>
    
    </mapper>
    

    (3)测试类

     package dailiDao;
    
     import java.io.IOException;
     import java.io.InputStream;
    
      import mybatisjdbc.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.Before;
      import org.junit.Test;
    
      public class dailiTest {
          private SqlSessionFactory sqls;
        @Before//使用时先执行这个方法
        public void init() throws IOException{
        String resource="config/SqlMapconfig.xml";
          //得到配置文件流
            InputStream       inputStream=Resources.getResourceAsStream(resource);
    //创建会话工厂得到会话SqlSessionFactory,把mybatis配置信息传入
     sqls=new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    
    @Test
      public void test() throws Exception{
      //调用工厂会话得到sqlsession
        SqlSession sqlsession= sqls.openSession();
            //调用UserMapper方法可以直接实现数据库查询,而不用实现这个接口的方法,mapper代理直接实现创建mapper对象
       UserMapper usermapper=sqlsession.getMapper(UserMapper.class);
      User user=usermapper.findUserById(2);
      sqlsession.close();
      System.out.println(user.getName());
      }
    
     }
    

    以上是两种mybatis开发dao层的方法,可能第二种比较乱一点,但是弄懂了相比第一种方法更容易使用。很多要注意的地方都在代码中写注释了,不懂的可以去查相应的就会容易理解一点。

    相关文章

      网友评论

        本文标题:Mybatis框架入门

        本文链接:https://www.haomeiwen.com/subject/aikacftx.html