mybatis update 字段为null_学习笔记--MyBatis(一)

这篇博客介绍了MyBatis的基本概念,包括其作为持久层框架和ORM映射的功能。作者解释了MyBatis的工作原理,涉及SqlSessionFactory和SqlSession的创建,以及如何通过代理对象执行CRUD操作。文章还概述了在IDEA环境下配置MyBatis进行CRUD操作的步骤,包括创建项目、添加依赖、定义实体类和接口以及编写配置文件和映射文件。
摘要由CSDN通过智能技术生成

1.MyBatis是什么?

MyBatis是一个框架,是一个持久层框架,又称为ORM框架。

什么是持久层呢?我的理解是把数据保存、存储起来的操作,就是直接操作数据库的。

ORM,Object Relational Mapping,对象关系映射。对象好比如Java实体类,关系就比如数据库的关系。意思就是我们对持久化对象进行的操作(CRUD等),ORM框架会将这些操作映射到对数据库的操作,也就是框架代替我们写了原始的操作数据库的代码,不再需要我们每次都自己去加载驱动、创建数据库连接等等工作。

2.MyBatis的工作原理

(1)读取MyBatis的主配置文件,获取数据库连接,加载映射文件。

(2)构建SqlSessionFactory会话工厂,并且使用工厂生产SqlSession会话对象。

(3)使用会话对象创建Dao接口的代理对象。

(4)使用代理对象来调用接口方法。

(5)处理结果集。

(6)释放资源。

3.MyBatis实现CRUD

我使用的环境:IDEA2018+jdk1.8+maven3.6.1

(1)创建maven项目,导入mybatis,mysql,Junit等相关依赖。

c1aff370f3fa4bef2ee634c14218bcbc.png
导入依赖

(2)创建实体类以及用户持久层接口

/**
 * 用户实体类
 */
public class User implements Serializable {

    private Integer userId;
    private String userName;
    private String userSex;
    private Integer userAge;

    // getter  setter toString()省略
}
/**
 * 用户持久层接口
 */
public interface UserDao {

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();

    /**
     * 新增一个用户
     */
    void insertOne(User user);

    /**
     * 修改用户
     * @param user
     */
    void updateUser(User user);

    /**
     * 根据id删除用户
     * @param id
     */
    void deleteUserById(Integer id);

}

(3)创建MyBatis主配置文件mybatisConfig.propeties(名字可以自取)

<?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">
<!-- mybatis主配置文件 -->
<configuration>

    <!-- 读取配置JDBC连接参数的文件 -->
    <properties resource="jdbcConfig.properties"></properties>

    <!-- 为实体类起别名 -->
    <typeAliases>
        <package name="com.jodi.domain"></package>
    </typeAliases>

    <!-- 配置环境 -->
    <environments default="mysql">
        <environment id="mysql">
            <!-- 配置JDBC事务 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置连接池 -->
            <dataSource type="POOLED">
                <!-- 配置连接参数 -->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <!-- 配置映射文件的位置 -->
    <mappers>
        <mapper resource="com/jodi/dao/UserDao.xml" />
    </mappers>

</configuration>

(4)创建持久层接口的映射文件UserDao.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">
<!-- namespace指定接口 -->
<mapper namespace="com.jodi.dao.UserDao"> 

    <!-- 配置resultMap 用于解决实体类属性和数据库字段不一致的问题-->
    <resultMap id="userMap" type="user">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id" />
        <!-- 非主键字段的对应 propertry(实体类属性) column(数据库字段) -->
        <result property="userName" column="name" />
        <result property="userSex" column="gender" />
        <result property="userAge" column="age" />
    </resultMap>

    <!-- 查询所有 -->
    <!-- <select id="findAll" resultType="com.jodi.domain.User"> -->
    <select id="findAll" resultMap="userMap">
        select * from user
    </select>

    <!-- 新增一个用户 -->
    <insert id="insertOne" parameterType="com.jodi.domain.User" >
      <!-- 获取新增的id -->
      <selectKey keyProperty="id" keyColumn="id" resultType="java.lang.Integer" order="AFTER">
          select last_insert_id()
      </selectKey>
        insert into user (name, gender, age) values (#{name}, #{gender}, #{age})
    </insert>

    <!-- 修改用户 -->
    <update id="updateUser" parameterType="com.jodi.domain.User" >
        update user set gender = #{gender} where id = #{id}
    </update>

    <!-- 根据id删除用户 -->
    <delete id="deleteUserById" parameterType="java.lang.Integer">
        delete from user where id = #{id}
    </delete>

</mapper>

(5)编写测试类

public class Testmybatis {

    /**
     * 1. 读取配置文件
     * 2. 创建SqlSessionFactory工厂
     * 3. 使用工厂生产SqlSession对象
     * 4. 使用SqlSession对象生成UserDao接口的代理对象
     * 5. 使用代理对象调用接口方法
     * 6. 释放资源
     */

    private InputStream is = null;
    private SqlSession sqlSession = null;
    private UserDao userDao = null;

    /**
     * 初始化
     * @throws IOException
     */
    @Before
    public void init() throws IOException{
        // 1.读取配置文件
        is = Resources.getResourceAsStream("mybatisConfig.xml");
        // 2.SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3.创建SqlSession会话对象
        sqlSession = sqlSessionFactory.openSession();
        // 4.创建dao接口的代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    /**
     * 释放资源
     * @throws IOException
     */
    @After
    public void destory() throws IOException{
        // 提交事务
        sqlSession.commit();
        
        sqlSession.close();
        is.close();
    }

    /**
     * 查询所有用户
     * @throws IOException
     */
    @Test
    public void TestFindAll() {
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
    }

    /**
     * 新增一条记录
     */
    @Test
    public void testInsertOne(){
        User user = new User();
        user.setUserName("jodi");
        user.setUserSex("男");
        user.setUserAge(6);
        //System.out.println("before -" + user);
        userDao.insertOne(user);
        //System.out.println("after -" + user);
    }

    /**
     * 修改用户
     */
    @Test
    public void testUpdateUser(){
        User user = new User();
        user.setUserSex("女");
        user.setUserId(6);
        userDao.updateUser(user);
    }

    /**
     * 根据id删除用户
     */
    @Test
    public void testDeleteUserById(){
        userDao.deleteUserById(6);
    }

}

全文只是个人的笔记,可能没有太大参考价值,如有错误,欢迎大佬指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值