mybatis 基础详解

转 https://www.cnblogs.com/Mr-Kenson/p/8124680.html

 

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的简单增删查改就已经完成了, 对了 数据库要自己建表哦。

posted @ 2017-12-27 11:28  再看打你呦  阅读(180)  评论(0编辑  收藏  举报