Mybatis基础-完整CRUD操作

步骤一:mybatis基本配置

1)创建Java项目,在lib下导入mybatis所需要的Jar包,包括链接mysql的mysql-connector-java-5.1.7-bin.jar。

2)在src目录下新建一个mybatis的配置文件

mybatis_conf.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>
    <properties resource="db.properties"></properties>

    <!-- 启用别名 -->
    <typeAliases>
        <package name="com.feng.domain" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}" />
                <property name="url" value="${jdbc.jdbcUrl}" />
                <property name="username" value="${jdbc.user}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- 配置 自动扫描 包下的 sql映射文件-->
    <mappers>
        <package name="com.feng.dao" />
    </mappers>
</configuration>

 db.properties

jdbc.user = root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/mybatis0814?useUnicode=true&characterEncoding=utf-8

步骤二:

1)新建表t_user,因为Mybatis不会自动创建数据表,和hibernate不一样,只专注sql

2)定义表的实体类,必须一一对应,否则需要在映射里面设置resultMap结果集映射

User

package com.feng.domain;

import java.util.Date;

public class User
{
    // 和表中的字段一一对应,否则需要在对应的Mapper配置文件用到resultMap结果集映射。
    private Integer id;
    private String username;
    private int age;
    private Date registerDate;
    
    public User(){}

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getRegisterDate() {
        return registerDate;
    }

    public void setRegisterDate(Date registerDate) {
        this.registerDate = registerDate;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", age=" + age
                + ", registerDate=" + registerDate + "]";
    }

 3)在dao的包下,新建sql映射配置xml

UserMapper.xml   必须和实体类对应  格式:实体类+Mapper ,否则自动扫描不出来

<?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,取包名+映射文件 -->
<mapper namespace="com.feng.dao.UserMapper">
<!-- 对应的id为映射接口的方法 ,parameterType 设置为入参的类型,因为我在配置文件中启用了别名,自动扫描domain包,所以不需要写包名,如果没有就是com.feng.domain.User
    resultType就是返回的结果集类型,如果是基本类型,mybaits已经封装好了,直接写类型就好;如果是实体类,就要写上实体类的类型,也是可以别名的。
    useGeneratedKeys="true" keyProperty="id"   :启用这段后,可以得到新增的数据的主键id
    #{}里面新增的实体属性值,用#{},也可以用${value};推荐用#{},因为会自动使用parperstatement,防止sql注入
-->
    <insert id="addUser" parameterType="User"  useGeneratedKeys="true" keyProperty="id">
        insert into t_user(username,age,registerDate)
        values(#{username},#{age},#{registerDate})
    </insert>
    <delete id = "deleteUser" parameterType="Integer"  >
        delete from t_user where id = #{id}
    </delete>
    <update id = "updateUser" parameterType="User" >
        update t_user 
        set 
            username = #{username},age=#{age},registerDate=#{registerDate}
        where 
             id = #{id}
    </update>
    <!-- 多个数据 和 单个 数据 ,他们的类型都是一样,都是User -->
    <select id = "getUserById" parameterType="Integer" resultType = "User">
        select * from t_user where id = #{id}
    </select>
    <select id = "getAllUser" resultType="User">
        select * from t_user
    </select>
    <select id = "getAllUser1" parameterType="map" resultType="User">
        select * from t_user where age > #{age} and username = #{username}
    </select>
</mapper>

这里注意一点,update、delete 返回值是:更新或删除的行数;无需指明resultClass;但如果有约束异常而删除失败,只能去捕捉异常。 

insert,返回值是:新插入行的主键(primary key);需要包含<selectKey>语句,才会返回主键,否则返回值为null。

4)操作接口

UserMapper.java

package com.feng.dao;



import java.util.List;
import java.util.Map;

import com.feng.domain.User;

public interface UserMapper 
{
    //增加一个用户
    public void addUser(User user);
    
    //删除一个用户
    public void deleteUser(Integer id);
    
    //修改用户信息
    public void updateUser(User user);
    
    //得到一个用户
    public User getUserById(Integer id);
    
    //得到所有用户
    public List<User> getAllUser();
    
    // 多入参情况下用map
    public List<User> getAllUser1(Map<String, Object> map);

}

步骤三

1)新建测试类Test_Crud.java

package com.feng.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;

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.feng.domain.User;

public class Test_Crud {

    private SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws IOException {
        // 使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream inputStream = Resources
                .getResourceAsStream("mybatis_conf.xml");
        // 创建SqlSessionFactory工厂
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void addUser() {
        // 创建并且打开sqlsession
        SqlSession sqlSession = null;
        try {

            sqlSession = sqlSessionFactory.openSession();
            User user = new User();
            user.setAge(22);
            user.setRegisterDate(new Date());
            user.setUsername("feng");
            sqlSession.insert("com.feng.dao.UserMapper.addUser", user);
            sqlSession.commit();
            System.out.println(user.getId());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

    @Test
    public void deleteUser() {
        // 创建并且打开sqlsession
        SqlSession sqlSession = null;
        try {

            sqlSession = sqlSessionFactory.openSession();
            sqlSession.delete("com.feng.dao.UserMapper.deleteUser", 2);
            sqlSession.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

    @Test
    public void updateUser() {
        // 创建并且打开sqlsession
        SqlSession sqlSession = null;
        try {

            sqlSession = sqlSessionFactory.openSession();
            User user = new User();
            user.setAge(22);
            user.setId(1);
            user.setRegisterDate(new Date());
            user.setUsername("wei");
            sqlSession.update("com.feng.dao.UserMapper.updateUser", user);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

    @Test
    public void getUserById() {
        // 创建并且打开sqlsession
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();

            User user = sqlSession.selectOne(
                    "com.feng.dao.UserMapper.getUserById", 1);
            System.out.println(user.toString());
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

    @Test
    public void getAllUser() {
        // 创建并且打开sqlsession
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();

            java.util.List<User> list = sqlSession
                    .selectList("com.feng.dao.UserMapper.getAllUser");
            for (User user : list) {
                System.out.println(user.toString());
            }
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

    @Test
    // 多入参情况下,用map
    public void getAllUser1() {
        // 创建并且打开sqlsession
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("age", 20);
            map.put("username", "feng");

            java.util.List<User> list = sqlSession.selectList(
                    "com.feng.dao.UserMapper.getAllUser1", map);
            for (User user : list) {
                System.out.println(user.toString());
            }
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

}

最后的结构图如下

原文地址:https://www.cnblogs.com/jinghuyue/p/9487377.html