MyBatis基础的增删改查讲解(三.一)

MyBatis基础的增删改查讲解

学习要点

搭建基础的MyBatis案例
搭建MyBatis注意的问题列表

搭建基础的MyBatis案例

MyBatis案例项目基础的目录结构

这里写图片描述

涉及到的User实体类
package com.pkk.entity;

/**
 * @author peikunkun
 * @version V1.0
 * @Title: MyBatisProject
 * @Package com.pkk.entity
 * @Description: <>
 * @date 2017/12/31 19:31
 */
public class User {

    private Integer id;
    private String  username;
    private String  password;


    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
mybatis-config.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>


    <!--指定MyBatis所用的日志具体实现-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>


    <!--起别名,别名的作用就是用简单明代替全限定类名-->
    <typeAliases>
        <!--
        通过package, 可以直接指定package的名字, mybatis会自动扫描你指定包下面的javabean,
        并且默认设置一个别名,默认的名字为: javabean 的首字母小写的非限定类名来作为它的别名。
        也可在javabean 加上注解@Alias 来自定义别名, 例如: @Alias(user)
        <package name="com.pkk.entity"/>
         -->
        <typeAlias alias="user" type="com.pkk.entity.User"/>
    </typeAliases>


    <!--环境配置,即连接的数据库-->
    <environments default="mysql">
        <environment id="mysql">
            <!--使用jdbc的事务提交与回滚设置-->
            <transactionManager type="JDBC"/>
            <!--配置数据源,POOLED是JDBC连接对象的数据源连接池的实现-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="username" value="***"/>
                <property name="password" value="***"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
            </dataSource>
        </environment>
    </environments>
    <!--mapper告诉了MyBatis去哪里找持久化的映射文件-->
    <mappers>
        <mapper resource="com.pkk.test/mappertest/userMapper.xml"></mapper>
    </mappers>

</configuration>
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:com.model.professional -->
<!--namespace保证唯一,习惯上是包名+配置文件的名称如com.pkk.test.mappertest(包名)+userMapper(userMapper.xml配置文件去掉.xml后缀)-->
<mapper namespace="com.pkk.test.mappertest.UserMapper">
    <!--普通的查询-查询的唯一标识selectUserById,查询参数类型为int或Integer,返回类型为hashmap,key为字段名,值在value中-->
    <select id="selectUserById" parameterType="int" resultType="hashmap">
        SELECT * FROM USER WHERE id =#{id}
    </select>


    <!--parameterMap=""已经废弃,老式风格的参数映射,flushCache为true时执行结束之后会刷新清空本地和二级缓存,默认为false,statementType默认为PREPARED预处理方式(即PreparedStatement)-->
    <!--STATEMENT是普通的吹模式(容易被注入方式注入sql语句中),CALLABLE(CallAbleStatement)调用储存过程,timeout为等待拉区数据的时间秒数,默认依据于驱动-->
    <delete id="deleteUserById" parameterType="int" flushCache="false" statementType="PREPARED" timeout="10">
        DELETE FROM USER WHERE id = #{id}
    </delete>


    <update id="updateUserById1" timeout="10" flushCache="false" parameterType="com.pkk.entity.User">
        <if test="id!=null">
            UPDATE USER u SET u.username = #{username,jdbcType=VARCHAR} , u.password = #{password,jdbcType=VARCHAR}
            where
            u.id = #{id}
        </if>
    </update>

    <!--id属性值必须唯一,是insert标签-->
    <!--parameterType指明插入时用的数据类型-->
    <!--useGeneratedKeys=true指定使用数据库总动增长策略,需要底层数据库支持,默认为false-->
    <insert id="saveUser" parameterType="com.pkk.entity.User" useGeneratedKeys="true">
        <!-- 底层的SQL语句 通过#{}来进行获取值和赋值-->
        INSERT INTO USER (username,password) VALUE (#{username},#{password})
    </insert>


    <!--
    针对于Mysql需要设置order="AFTER"
    因为SelectKey需要注意order属性,像MySQL一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
    像Oracle这样取序列的情况,需要设置为before,否则会报错。将selectKey放在insert之后,通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值。插入之后获得ID赋值到传进来的对象中(对象中必须有相应的属性setter方法)
    useGeneratedKeys使用自增(依据底层数据库)
    parameterType:请求参数类型
    flushCache:为true时执行结束之后会刷新清空本地和二级缓存,默认为false
    timeout:拉去数据超时时间【单位:秒】
    resultType:结果类型
    order:序列产生时间,是在插入之前(Oracle)还是插入之后(Mysql)
    keyProperty:查询的序列映射给id属性,实体需要有setter方法
    statementType:操作模式,默认为PREPARED预处理方式(即PreparedStatement)STATEMENT是普通的吹模式(容易被注入方式注入sql语句中),CALLABLE(CallAbleStatement)调用储存过程
    -->
    <insert id="saveUser1" parameterType="com.pkk.entity.User" useGeneratedKeys="true" flushCache="false" timeout="10">
        <!-- 底层的SQL语句 通过#{}来进行获取值和赋值-->
        INSERT INTO USER (username,password) VALUE (#{username},#{password})
        /*将selectKey放在insert之后,通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值。插入之后获得ID赋值到传进来的对象中(对象中必须有相应的属性)*/
        <selectKey resultType="int" order="AFTER" keyProperty="id" statementType="PREPARED">
            SELECT LAST_INSERT_ID() AS id
        </selectKey>
    </insert>


    <!--
    针对于Oracle需要设置order="Before"
    因为SelectKey需要注意order属性,像MySQL一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
    像Oracle这样取序列的情况,需要设置为before,否则会报错。将selectKey放在insert之后,通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值。插入之后获得ID赋值到传进来的对象中(对象中必须有相应的属性setter方法)
    useGeneratedKeys使用自增(依据底层数据库)
    parameterType:请求参数类型
    flushCache:为true时执行结束之后会刷新清空本地和二级缓存,默认为false
    timeout:拉去数据超时时间【单位:秒】
    resultType:结果类型
    order:序列产生时间,是在插入之前(Oracle)还是插入之后(Mysql)
    keyProperty:查询的序列映射给id属性,实体需要有setter方法
    statementType:操作模式,默认为PREPARED预处理方式(即PreparedStatement)STATEMENT是普通的吹模式(容易被注入方式注入sql语句中),CALLABLE(CallAbleStatement)调用储存过程
    -->
    <insert id="saveUser2" parameterType="com.pkk.entity.User" useGeneratedKeys="true" flushCache="false" timeout="10">
        <!--这句话会在插入user之前执行(order="BEFORE"),该句话执行完之后,会生成一个ID,传进来的参数User对象里的id字段就会被赋值成sequence的值。-->
        <selectKey resultType="int" order="BEFORE" keyProperty="id" statementType="PREPARED">
            select SEQ_USER_ID.nextval as id from dual
        </selectKey>
        <!-- 底层的SQL语句 通过#{}来进行获取值和赋值-->
        INSERT INTO USER (username,password) VALUE (#{username},#{password})
    </insert>


</mapper>
TestUtil的java工具类
package com.pkk.test;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/**
 * Created by peikunkun on 2018/1/21 0021.
 */
public class TestUtil {


    /**
     * 获取连接
     *
     * @return
     */
    public static SqlSession getSqlSession() {
       /*获取当前mybatis配置文件*/
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
        /*创建sqlSessionFactory对象*/
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        /*创建SQLSession对象操作持久层对象*/
        SqlSession session = sqlSessionFactory.openSession();

        return session;
    }

    /**
     * 关闭连接和进行提交
     *
     * @return
     */
    public static void commitAndCloseSession(SqlSession session) {
        if (session != null) {
            session.commit();
            session.close();
        }
    }

}
增加方法
package com.pkk.test.mappertest;

import java.util.Random;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.pkk.entity.User;
import com.pkk.test.TestUtil;

/**
 * Created by peikunkun on 2018/1/21 0021.
 */
public class insert {
    private SqlSession session = null;

    public static void main(String[] args) {
        System.out.println("欢迎使用MyBatis的添加操作");
    }

    @Before
    public void before() {
        session = TestUtil.getSqlSession();
    }


    @Test
    public void insert1() {
        /*创建User对象,同时User要有构造方法 public User(String username, String password) {}和 public User(){}*/
        User user = new User("root" + new Random().nextInt(), "password" + new Random().nextInt());
        /*执行插入操作*/
        int result = session.insert("com.pkk.test.mappertest.UserMapper.saveUser", user);
        System.out.println("添加结果:" + result);

    }

    /**
     * @param
     * @return void
     * @Description: <针对Mysql类型先执行插入操作后产生序列>
     * @author peikunkun
     * @date 2017年2018/1/22 15:06
     * @version V1.0
     */
    @Test
    public void insert2() {
        /*创建User对象,同时User要有构造方法 public User(String username, String password) {}和 public User(){}*/
        User user = new User("root" + new Random().nextInt(), "password" + new Random().nextInt());
        /*执行插入操作*/
        int result = session.insert("com.pkk.test.mappertest.UserMapper.saveUser1", user);
        System.out.println("添加结果:" + result);

    }


    /**
     * @param
     * @return void
     * @Description: <针对Oracle类型先进行产生-查询序列,在执行其他操作【此操作需要修改数据库的配置】>
     * @author peikunkun
     * @date 2017年2018/1/22 15:06
     * @version V1.0
     */
    @Test
    public void insert3() {
        /*创建User对象,同时User要有构造方法 public User(String username, String password) {}和 public User(){}*/
        User user = new User("root" + new Random().nextInt(), "password" + new Random().nextInt());
        /*执行插入操作*/
        int result = session.insert("com.pkk.test.mappertest.UserMapper.saveUser2", user);
        System.out.println("添加结果:" + result);

    }

    @After
    public void end() {
        TestUtil.commitAndCloseSession(session);
    }

}
删除方法
package com.pkk.test.mappertest;

import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.pkk.test.TestUtil;

/**
 * Created by peikunkun on 2018/1/21 0021.
 */
public class delete {
    private SqlSession session = null;

    public static void main(String[] args) {
        System.out.println("欢迎使用MyBatis的删除操作");
    }

    @Before
    public void before() {
        session = TestUtil.getSqlSession();
    }


    @Test
    public void delete1() {
        int result = session.delete("com.pkk.test.mappertest.UserMapper.deleteUserById", 2);
        System.out.println("删除结果:" + result);

    }

    @After
    public void end() {
        TestUtil.commitAndCloseSession(session);
    }

}
更改数据方法
package com.pkk.test.mappertest;

import java.util.Random;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.pkk.entity.User;
import com.pkk.test.TestUtil;

/**
 * Created by peikunkun on 2018/1/21 0021.
 */
public class update {
    private SqlSession session = null;

    public static void main(String[] args) {
        System.out.println("欢迎使用MyBatis的更新操作");
    }

    @Before
    public void before() {
        session = TestUtil.getSqlSession();
    }


    @Test
    public void update1() {
        int id = (int) (new Random().nextInt(10) + 1);
        /*创建User对象,同时User要有构造方法 public User(String username, String password) {}和 public User(){}*/
        User user = new User(id, "账号" + String.valueOf(new Random().nextInt()), "密码" + String.valueOf(new Random().nextInt()));
        System.out.println("更新的id:" + id);
        /*执行更新操作*/
        int result = session.update("com.pkk.test.mappertest.UserMapper.updateUserById1", user);
        System.out.println("更新结果:" + result);

    }

    @After
    public void end() {
        TestUtil.commitAndCloseSession(session);
    }

}
查询方法
package com.pkk.test.mappertest;

import com.pkk.test.TestUtil;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by peikunkun on 2018/1/21 0021.
 */
public class select {
    private SqlSession session = null;

    public static void main(String[] args) {
        System.out.println("欢迎使用MyBatis的查询操作");
    }

    @Before
    public void before() {
        session = TestUtil.getSqlSession();
    }


    @Test
    public void select1() {
        Map<String, String> map = session.selectOne("com.pkk.test.mappertest.UserMapper.selectUserById", 1);
        System.out.println(map);

    }

    @After
    public void end() {
        TestUtil.commitAndCloseSession(session);
    }

}
Maven的pom文件的支持
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.pkk</groupId>
    <artifactId>MyBatis1</artifactId>
    <version>1.0-SNAPSHOT</version>


    <!--使用maven插件和使用全局jdk1.8-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>


    <properties>
        <!--配置默认pom的配置-->
        <file.encoding>UTF-8</file.encoding>
        <java.source.version>1.8</java.source.version>
        <java.target.version>1.8</java.target.version>

        <!--以来组件的版本号-->
        <mybatis.version>3.2.8</mybatis.version>
        <mysql.version>5.1.38</mysql.version>
        <log4j.version>1.2.17</log4j.version>
        <junit.version>4.12</junit.version>
    </properties>


    <dependencies>
        <!--添加MyBatis的支持-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

        <!--Mysql的支持-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <!--产生日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <!--单元测试的支持-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>

</project>

搭建MyBatis注意的问题列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值