zoukankan      html  css  js  c++  java
  • mybatis 基础详解

    mybatis 是一个开源的 用于对数据库操作的框架, 读者基本都大体了解其基本功能, 我就不多解释了 直接上demo吧。

    我用的是maven管理包, 如下

    <dependencies>
            <dependency>
                <groupId>org.springFramework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>3.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.40</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.2.8</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.7</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.7</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.6.4</version>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.1.3</version>
            </dependency>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2.2</version>
            </dependency>
            <dependency>
                <groupId>asm</groupId>
                <artifactId>asm</artifactId>
                <version>3.3.1</version>
            </dependency>
        </dependencies>

    如果不是用的maven管理包, 也可以找下列包进行导入, 一下是javaWeb项目的目录结构,在这里我主要是用maven来做,其实都一样的。

     导好包之后呢,我们就要开始做mybatis项目了。

    -- 1:在src下写入配置文件sqlMapConfig.xml,可以参照下方 

    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        <!-- 属性定义
        加载一个properties文件
        在 properties标签 中配置属性值
         -->
        <properties resource="db.properties">
            <!-- <property name="" value=""/> -->
        </properties>
        
        <!-- 定义 别名 -->
        <typeAliases>
            <!--
            单个别名的定义
            alias:别名,type:别名映射的类型  -->
            <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
            <!-- 批量别名定义
            指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写)
             -->
            <package name="cn.itcast.mybatis.po"/>
            
        </typeAliases>
        
        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
            <!-- 使用jdbc事务管理-->
                <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>
        
        <!--加载mapper映射
        如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。
         -->
        <mappers>
            <!-- 通过resource引用mapper的映射文件 -->
            <mapper resource="sqlmap/User.xml" />
            <!-- <mapper resource="mapper/UserMapper.xml" /> -->
            <!-- 通过class引用mapper接口 
            class:配置mapper接口全限定名
            要求:需要mapper.xml和mapper.java同名并且在一个目录 中
            -->
            <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
            <!-- 批量mapper配置 
            通过package进行自动扫描包下边的mapper接口,
            要求:需要mapper.xml和mapper.java同名并且在一个目录 中
            
            -->
            <package name="cn.itcast.mybatis.mapper"/>
            
            
        </mappers>
        
        
    </configuration>

    -- 2: 配置完sqlMapConfig之后我们就先把实体类弄好吧。  src下创建一个实体类

    import java.util.Date;
    
    public class User {
        private Integer id;
        private String username;
        private String sex;
        private Date birthday;
        private String address;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
                    + address + "]";
        }
        
        
    }

    -- 3: 然后我们就开始写映射文件了

    <?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">
    <!-- nameSpace 命名空间为了对sql进行隔离, 方便管理 后面 这个属性值有其他的作用 -->
    <mapper namespace="test">
        <!-- id 唯一标识 标识一个statement 我们将select、 insert... 称为statement #{id} : 标识一个占位符 
            如果#{}要传入一个简单类型(基本类型), {}中的值 任意 parameterType : 是参数的类型 通过#{} 来接受ParamterType输入参数 
            resultType: 结果类型: 指定映射的单条记录 javabean 类型 -->
        <select id="findUserById" parameterType="int"
            resultType="com.weibang.mybatis.beans.User">
            SELECT * FROM user WHERE id=#{id}
        </select>
    
        <!-- 根据用户名模糊称来查询数据 ${} 标识sql的的拼接, 通过这个东西修饰的, 会不加任何修饰拼接在sql中 -->
        <select id="findUserByName" parameterType="String"
            resultType="com.weibang.mybatis.beans.User">
            SELECT * FROM user WHERE username LIKE '%${value}%'
        </select>
    
        <!-- 添加用户 接受简单参数(基本类型)的时候 名字随意, 接受引用类型的时候,名字要与javabean类型一致 -->
        <insert id="InsertUser" parameterType="com.weibang.mybatis.beans.User">
            <!-- 需求: User 对象插入到数据中之后, 新记录的主键要通过User对象返回,通过user获取主键值 里面定义了获取主键的sql, 
                当 Insert语句执行完之后,就会执行selectKey中的东西,就能获取自增的主键 order:用来确定什么时候进行获取主键 两个值, 一个befer 
                一个after keyProperty: 要将主键值付给哪个属性 resultType: SELECT LAST_INSERT_ID() 的结果类型 
                为int 所以填int就可以了 -->
            <selectKey keyProperty="id" order="AFTER" resultType="int">
                SELECT
                LAST_INSERT_ID()
            </selectKey>
            INSERT INTO user (username,birthday,sex,address)
            VALUES(#{username},#{birthday},#{sex},#{address})
        </insert>
        <!-- mysql 的UUID生成主键 <insert id="InsertUser" parameterType="com.weibang.mybatis.beans.User"> 
            <selectKey keyProperty="id" order="AFTER" resultType="String"> SELECT UUID() 
            </selectKey> INSERT INTO user (username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) 
            </insert> -->
        <!-- 用户删除 -->
        <delete id="deleteUser" parameterType="int">
            delete from user where id
            = #{id}
        </delete>
        <!-- 用户更新 要求: 要求传入的user中必须要包括一个id 如果没有id 那么就全部更新了 -->
        <update id="updateUser" parameterType="com.weibang.mybatis.beans.User">
            update user set
            username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
            where id = #{id}
        </update>
    </mapper>

    -- 4: 映射文件写好了之后, 我们其实就可以进行测试了, 我们这里用的是junit测试

    import java.io.IOException;
    import java.io.InputStream;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    
    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;
    
    import com.weibang.mybatis.beans.User;
    
    public class First_test {
        private SqlSessionFactory sqlsessionFactory;
         
        // 创建会话工厂
        @Before
        public void init() throws IOException {
            // 创建会话工厂
            // 配置文件(sqlMapConfig.xml)
            String resource = "SqlMapConfig.xml";
            // 将配置文件加载到输入流中
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建会话工厂
            sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        
        @Test
        public void testFindById() {
            // 通过sqlsessionFactory来创建sqlsession
            SqlSession sqlsession = sqlsessionFactory.openSession();
            // 第一个参数: statement的位置,等于namespace+statement的ID
            // 第二个参数: 传入的参数
            User user = null;
            try {
                 user= sqlsession.selectOne("test.findUserById", 1);
                
            }catch(Exception e) {
                e.printStackTrace();
            } 
            finally {
                // 关闭sqlsession
                sqlsession.close();
            }
            System.out.println(user);
            
        }
        
        /**测试: 根据名字模糊查询*/
        @Test
        public void testFindByName()throws Exception {
            SqlSession sqlsession = sqlsessionFactory.openSession();
            List<User> user = null;
            try {
                user = sqlsession.selectList("test.findUserByName", "小明");
            }catch(Exception e) {
                e.printStackTrace();
            } 
            finally {
                sqlsession.close();        
                }
            System.out.println(user);
        }
        
        /**
         * mybatis 插入 并且获取插入的主键值
         */
        
        @Test
        public void testInsertUser() {
            SqlSession sqlsession = sqlsessionFactory.openSession();
            User user = new User();
            user.setUsername("kenson2");
            user.setBirthday(new Date());
            user.setSex("1");
            user.setAddress("江西南昌");
            int a = 0;
            try {
                a= sqlsession.insert("test.InsertUser", user);
                
            }catch(Exception e) {
                e.printStackTrace();
            } 
            finally {
                sqlsession.commit();
                sqlsession.close();        
                }
            System.out.println("受影响的行数:"+a);
            System.out.println("返回的主键值 "+user.getId());
        }
        /**
         * 测试  根据id删除用户
         */
        @Test
        public void testDelete() {
            SqlSession sqlsession = sqlsessionFactory.openSession();
            int row=0;
            try {
                row =sqlsession.delete("test.deleteUser", 31);
                sqlsession.commit();
            } catch (Exception e) {
                // TODO: handle exception
            }finally {
                sqlsession.close();
            }
            System.out.println("已经删除的行数:"+row);
        }
        /**
         * 测试更新操作
         */
        @Test
        public void testUpdate() {
            SqlSession sqlsession = sqlsessionFactory.openSession();
            User user = new User();
            user.setId(32);
            user.setUsername("kangcheng");
            user.setBirthday(new Date());
            user.setSex("1");
            user.setAddress("福建");
            int row =0;
            try {
                 row= sqlsession.update("test.updateUser", user);
                 sqlsession.commit();
            } catch (Exception e) {
                // TODO: handle exception
            }finally {
                sqlsession.close();
            }
            System.out.println("已经更新了:"+row+"行");
        }
        
        
    }

    OK  到这里 我们mybatis的简单增删查改就已经完成了, 对了 数据库要自己建表哦。

  • 相关阅读:
    7.21 高博教育 数组 内存
    【基础扎实】Python操作Excel三模块
    PAT 甲级 1012 The Best Rank
    PAT 甲级 1011  World Cup Betting
    PAT 甲级 1010 Radix
    链式线性表——实验及提升训练
    循环程序设计能力自测
    链表应用能力自测
    PAT 甲级 1009 Product of Polynomials
    1008 Elevator (20分)
  • 原文地址:https://www.cnblogs.com/Mr-Kenson/p/8124680.html
Copyright © 2011-2022 走看看