• Mybatis学习记录(一)---- 简单的CRUD


    1 mybatis是什么?

    mybatis是一个持久层的框架,是apache下的顶级项目。

    mybatis托管到googlecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。

    mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。

    mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)

    2 mybatis框架

    clip_image001

    3 入门程序

    3.1 需求

    • 根据用户id(主键)查询用户信息
    • 根据用户名称模糊查询用户信息
    • 添加用户
    • 删除 用户
    • 更新用户

    3.2 环境

    • java环境:jdk1.8.0_51
    • eclipse:Mars
    • mysql:5.7
    • mybatis运行环境(jar包):
    • 从https://github.com/mybatis/mybatis-3/releases下载,mybatis-3.3.0版本

    clip_image002

    项目文件结构:

    clip_image003

    3.3 log4j.properties

    clip_image004

    3.4 SqlMapConfig.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中还可以配置一些属性名和属性值  -->
            <!-- <property name="jdbc.driver" value=""/> -->
        </properties>
        
        
        
        <!-- 全局配置参数,需要时再设置 -->
        <!-- <settings>
        
        </settings> -->
        
        <!-- 别名定义 -->
        <typeAliases>
            
            <!-- 针对单个别名定义
                type:类型的路径
                alias:别名
             -->
            <!-- 批量别名定义指定包名,mybatis自动扫描包中的entities类,自动定义别名,别名就是类名(首字母大写或小写都可以)-->
            <package name="com.joe.mybatis.entities"/>
            
        </typeAliases>
        
        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
            <!-- 使用jdbc事务管理,事务控制由mybatis-->
                <transactionManager type="JDBC" />
            <!-- 数据库连接池,由mybatis管理-->
                <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>
        
        
        
        
        <!-- 加载 映射文件 -->
        <mappers>
            <mapper resource="sqlmap/User.xml"/>
            
            <!--通过resource方法一次加载一个映射文件 -->
            <mapper resource="mapper/UserMapper.xml"/>
            
            <!-- 通过mapper接口加载单个 映射文件
            遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
            上边规范的前提是:使用的是mapper代理方法
             -->
            
            <!-- 批量加载mapper
            指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
            遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
            上边规范的前提是:使用的是mapper代理方法
             -->
            <!--  <package name="com.joe.mybatis.mapper"/> -->
    
        </mappers>
        
    </configuration>

    3.5 根据用户id(主键)查询用户信息

    3.5.1 创建POJO

    package com.joe.mybatis.entities;
    
    import java.util.Date;
    
    public class User {
    
    private int id;
    
    private String username;
    
    private String sex;
    
    private Date birthday;        
    
    private String address;
    
    public int getId() {
    
    return id;
    
    }
    
    public void setId(int 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.5.2 映射文件

    映射文件命名:

    User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

    在映射文件中配置sql语句。

    <?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进行分类化管理,理解sql隔离 
    注意:使用mapper代理方法开发,namespace有特殊重要的作用
    -->
    <mapper namespace="test">
    
    <!-- 在 映射文件中配置很多sql语句 -->
        <!-- 需求:通过id查询用户表的记录 -->
        <!-- 通过 select执行数据库查询
        id:标识 映射文件中的 sql
        将sql语句封装到mappedStatement对象中,所以将id称为statement的id
        parameterType:指定输入 参数的类型,这里指定int型 
        #{}表示一个占位符号
        #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
        
        resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
         -->
        <select id="findUserById" parameterType="int" resultType="com.joe.mybatis.entities.User">
            SELECT * FROM USER WHERE id=#{value}
        </select>
    </mapper>

    3.5.3 编写测试程序

    // 根据id查询用户信息,得到一条记录结果
        @Test
        public void findUserByIdTest() throws IOException {
    
            // mybatis配置文件
            String resource = "SqlMapConfig.xml";
            // 得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建会话工厂,传入mybatis的配置文件信息
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 通过工厂得到SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过SqlSession操作数据库
            // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
            // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
            // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
            // selectOne查询出一条记录
            User user = sqlSession.selectOne("test.findUserById", 1);
            System.out.println(user);
            // 释放资源
            sqlSession.close();
    
        }

    3.5.4 测试结果:

    clip_image005

    3.6 根据用户名称模糊查询用户信息

    3.6.1 映射文件

    使用User.xml,添加根据用户名称模糊查询用户信息的sql语句。

    clip_image006

    3.6.2 程序代码

    @Test
        public void findUserByNameTest() throws IOException {
    
            // mybatis配置文件
            String resource = "SqlMapConfig.xml";
            // 得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建会话工厂,传入mybatis的配置文件信息
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 通过工厂得到SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过SqlSession操作数据库
            // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
            // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
            // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
            // selectOne查询出一条记录
            List<User> list = sqlSession.selectList("test.findUserByName", "hex");
            
            for (User user : list) {
                System.out.println(user);
            }
            // 释放资源
            sqlSession.close();
    
        }

    3.6.3 测试结果

    clip_image007

    3.7 添加用户

    自增主键返回

    • mysql自增主键,执行insert提交之前自动生成一个自增主键。
    • 通过mysql函数获取到刚插入记录的自增主键:
    • LAST_INSERT_ID()
    • 是insert之后调用此函数。

    3.7.1映射文件

    在 User.xml中配置添加用户的Statement

    clip_image008

    3.7.2 程序代码

    @Test
        public void insertUserTest() throws IOException {
    
            // mybatis配置文件
            String resource = "SqlMapConfig.xml";
            // 得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建会话工厂,传入mybatis的配置文件信息
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 通过工厂得到SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过SqlSession操作数据库
            
            User user=new User();
            user.setUsername("Pepper");
            user.setBirthday(new Date());
            user.setSex("女");
            user.setAddress("NewYork");
            sqlSession.insert("test.insertUser", user);
            
            System.out.println(user.getId());
            
            sqlSession.commit();
            // 释放资源
            sqlSession.close();
    
        }

    3.7.3 测试结果

    clip_image010

    3.7.4 非自增主键返回(使用uuid())

    使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

    执行思路:

    先通过uuid()查询到主键,将主键输入 到sql语句中。

    执行uuid()语句顺序相对于insert语句之前执行。

    clip_image011

    通过oracle的序列生成主键:

    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">

    SELECT 序列名.nextval()

    </selectKey>

    insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})

    3.8 删除用户

    3.8.1 映射文件

    clip_image012

    3.8.2 代码:

    // 根据id删除 用户信息
        @Test
        public void deleteUserTest() throws IOException {
    
            // mybatis配置文件
            String resource = "SqlMapConfig.xml";
            // 得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建会话工厂,传入mybatis的配置文件信息
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 通过工厂得到SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过SqlSession操作数据库
            // 传入id删除 用户
            sqlSession.delete("test.deleteUser", 3);
            
            sqlSession.commit();
            // 释放资源
            sqlSession.close();
    
        }

    3.8.3 测试结果

    clip_image013

    3.9 更新用户

    3.9.1 映射文件

    clip_image014

    3.9.2 代码

    //更新用户信息
        @Test
        public void updateUserTest() throws IOException {
    
            // mybatis配置文件
            String resource = "SqlMapConfig.xml";
            // 得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建会话工厂,传入mybatis的配置文件信息
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 通过工厂得到SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过SqlSession操作数据库、
            
            //更新用户信息
            User user=new User();
            //必须设置Id
            user.setId(4);
            user.setUsername("Pepper·Potts");
            user.setBirthday(new Date());
            user.setSex("女");
            user.setAddress("NewYork");
            sqlSession.update("test.updateUser", user);
            
            sqlSession.commit();
            // 释放资源
            sqlSession.close();
    
        }

    3.9.3 测试结果

    clip_image015

    4 总结

    4.1 parameterType

    在映射文件中通过parameterType指定输入 参数的类型。

    4.2 resultType

    在映射文件中通过resultType指定输出结果的类型。

    4.3 #{}和${}

    • #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

             如果接收简单类型,#{}中可以写成value或其它名称。

    • #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
    • ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
    • ${}接收输入参数,类型可以是简单类型,pojo、hashmap。

             如果接收简单类型,${}中只能写成value。

    • ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

    4.4 selectOne和selectList

    • selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
    • selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。

             如果使用selectOne报错:

             org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but   found:  记录条数

    5 mybatis和hibernate本质区别和应用场景

    hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。

    对sql语句进行优化、修改比较困难的。

    应用场景:

    适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

    mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

    应用场景:

    适用与需求变化较多的项目,比如:互联网项目。

    企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

  • 相关阅读:
    AES算法加解密Java工具类AESUtil
    并发与高并发(二十二)高并发の服务降级与服务熔断思路
    并发与高并发(二十一) 高并发の应用限流思路
    并发与高并发(二十)高并发の应用拆分思路
    da5_模块
    day5_集合
    day5_递归调用
    day5_判断价格输入是否是正整数或正小数
    day5_函数_判断小数
    day5_函数_文件读写_用一个函数来满足文件的读或者写_应用默认参数
  • 原文地址:https://www.cnblogs.com/doctorJoe/p/5278244.html
Copyright © 2020-2023  润新知