2020-04-02Mybatis

作者: summer96 | 来源:发表于2020-04-02 17:31 被阅读0次

    Mybatis简介

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

    Mybatis编程

    mybatis的mapper编程

    1.新建项目
    2.导包

      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
      </dependencies>
    

    3.新建log4j.properties文件,用于打印日志
    写入:

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout    
    # MyBatis logging configuration...
    log4j.logger.org.mybatis.example.BlogMapper=TRACE
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    

    4.新建实体类Users,与数据库中的表相对应
    5.新建UserMapper.xml文件
    写入:

    <?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="com.mybatis.UserMapper">
    <!-- namespace 里可以随意起名 但要与测试类中  openSession.selectOne("com.mybatis.UserMapper.selectEmp", 1)  里的名字一样 --> 
    <!-- namespace:名称空间   id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取到id值-->
     <select id="selectEmp" resultType="com.mybatis.Users"><!--所传进来的id值由selectEmp中获取,返回值类型为Users类-->
     select * from users where id = #{id}
     </select>
    </mapper>
    

    6.新建全局配置文件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">
    <configuration>
     <environments default="development">
     <environment id="development">
     <transactionManager type="JDBC"/>
     <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="123456"/>
     </dataSource>
     </environment>
     </environments>
     <mappers>
     <mapper resource="UserMapper.xml"/>
     </mappers>
    </configuration>
    

    7.新建测试类测试
    写入:

    package com.mybatis;
    import java.io.IOException;
    import java.io.InputStream;
    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;
    
    public class mybatisTest {
        /**
         * 1.根据xml配置文件创建一个SqlSessionFactory对象
         * @throws IOException
         */
        @Test
        public void test() throws IOException {
                 //加载核心配置文件
            String resource = "SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
                //创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
            //2.获取sqlSession实例,能直接执行已经映射的sql语句
            SqlSession openSession=sqlSessionFactory.openSession();
            try {
            Users users=openSession.selectOne("com.mybatis.UserMapper.selectEmp", 1);    //将id值设置为1,用selectEmp传给SqlMapConfig.xml
            System.out.println(users);
            }finally {
                openSession.close();
            }
        }
    }
    

    8.测试运行

    当Users类中的变量名与建表时的名称未对应时,应该在UserMapper.xml文件中写入别名:

    select * from users where id = #{id}
    //将原语句改为:
    select id,name username,password from users where id = #{id}
    //建表时所创建字段名称为name,而在实体类中写为username
    

    模糊查询

    selecy * from user where username like '%${value}%'
    //${}里只能写 value
    //也可以写成 "%"#{}"%"  #{} 里的数值可以随意写
    

    mybatis的接口类编程

    1.写一个接口,与UserMapper.xml文件动态绑定
    接口类如下所示:

    package com.mybatis;
    
    public interface UserMapper {
        public Users getUserId(Integer id);
    }
    

    2.绑定到UserMapper.xml中
    如下所示:

    <?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="com.mybatis.UserMapper">
    <!-- namespace:名称空间,必须指定为接口全类名   
    id:唯一标识 方法名
    resultType:返回值类型 
    #{id}:从传递过来的参数中取到id值
    
    public Users getUserId(Integer id);
    -->
     <select id="getUserId" resultType="com.mybatis.Users">
     select * from users where id = #{id}
     </select>
    </mapper>
    

    3.编写测试类

    //获取sqlsessionFactory方法
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        } 
        
        @Test
        public void test01() throws IOException{
            //1.获取sqlsessionFactory
            SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
            //2.获取SqlSession对象
            SqlSession openSession = sqlSessionFactory.openSession();
            try {
            //3获取接口的实现类对象
              //会为接口自动创造一个代理对象
            UserMapper mapper=openSession.getMapper(UserMapper.class);
            Users user=mapper.getUserId(1); 
               System.out.println(mapper.getClass());//获取mapper的对象名
            System.out.println(user);
            }finally {
                openSession.close();
            }
        }
    

    接口式编程的好处:
    接口中编写的方法具有更强的类型检查,有明确的返回值,相当与抽出来一个规范。
    mybatis会自动为其创建一个代理对象,所以推荐使用接口式编程。

    SqlSession代表数据库的一次会话,用完必须关闭
    SqlSession和Connetcion一样,都是非线程安全,所以不可以写成成员变量,会引起资源竞争,所以每次使用都应该获取新的对象,不能共享。
    mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
    (将接口与xml绑定)
    UserMapper userMapper = sqlSession.getMpper(UseraMapper.class);
    两个重要配置文件。
    mybatis全局配置文件(SqlMapconfig),包含了数据库连接池信息,事务管理信息等。。。。系统运行环境
    sql映射文件(UserMapper),保存了每一个sql语句映射信息,将sql抽取出来

    别名问题:
    在xml文件里设置

    <resultMap type="Orders" id="orders">
        <result column="user_id" property="userId"/>
    </result>
    //column 是数据库中的名字   property 是类中的属性
    <select id="selectOrderList" resultMap=" orders">
        select id,user_id,number FROM orders
    </select>   
    //resultType改为resultMap  resultMap中的内容与id一致
    

    sql语句拼接

    <!-- 根据性别和名字查询用户 where 可以在sex为null或空值时 去掉username前的 and 但不能去掉后 and -->
    <select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
        select * from user
        <where>
            <if text="sex != null and sex != ' '">
                sex = #{sex}
             </if>
             <if test="username !=null and username != ' '">
                 and username = #{username}
              </if>
        </where>
     </select>  
    <!-- 根据性别和名字查询用户 where 可以在sex为null或空值时 去掉username前的 and 但不能去掉后 and -->
    <select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
        select * from user
        <where>
            <if text="sex != null and sex != ' '">
                sex = #{sex}
             </if>
             <if test="username !=null and username != ' '">
                 and username = #{username}
              </
    

    mybatis的注解式编程

    只写接口,不写mapper.xml文件

    public interface UsersMapper2 {
        @Select("select * from users where id = #{id}")
        public Users findUsersById(String id);
    }
    

    测试类中:

    SqlSessionFactory sqlSessionFactory;
        @Before
        public void before() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
        }
        @Test
        public void test02() throws IOException {
            //创建会话
            SqlSession sqlSession=sqlSessionFactory.openSession();
            //执行
            UsersMapper2 users2=sqlSession.getMapper(UsersMapper2.class);
            Users user = users2.findUsersById("01");
            System.out.println(user);
            //关闭
            sqlSession.close();
            
        }
    

    相关文章

      网友评论

        本文标题:2020-04-02Mybatis

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