MyBatis入门

mybatis入门 基础知识重点,内容量多

    1、对原生态jdbc程序(单独使用jdbc开发)问题总结
    2、mybatis框架原理    (掌握)
    3、mybatis入门程序
        用户的增、删、改、查
    4、mybatis开发dao两种方法:
        原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)
        mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)
    5、mybatis配置文件SqlMapConfig.xml
    mybatis核心:
        6、mybatis输入映射(掌握)
        7、mybatis输出映射(掌握)
    8、mybatis的动态sql(掌握)


1、对原生态jdbc程序中问题总结

(1)数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响性能。

设想使用数据库连接池管理数据库连接。

(2)将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。

设想sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。

(3)向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

设想sql语句及占位符号和参数全部配置在xml中

(4)从ResutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。

设想将查询的结果集,自动映射成java对象。

2、mybatis框架

mybatis是什么?

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

mybatis托管到goolecode下,再后来托管到github下:https://github.com/mybatis/mybatis-3/releases

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

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

2.1 mybatis框架原理


2.2 快速上手开发步骤:

需求:简单CRUD操作

持久层mybatis 开发步骤:

1、搭建环境:

    mybatis运行环境(jar包): mybatis所需jar包(核心包,lib文件夹中的依赖包)、

         mysql数据库驱动包、单元测试jar包、log4j.properties日志文件

mybatis框架文件目录

2、配置文件:

     XXXMapper.xml

    SqlMapConfig.xml(名称不固定):配置数据源,事务,映射目录,别名,全局配置等

3、单元测试

    写单元测试,测试CRUD方法


2.3工程结构

1、映射文件 User.xml 

映射文件命名: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">


    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
        SELECT * FROM USER WHERE id=#{value}
    </select>
    
    <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
        SELECT * FROM USER WHERE username LIKE '%${value}%'
    </select>
    
    <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

        <!-- 自增主键适用,添加数据返回主见 -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})


        <!--  主键是UUID生成的

        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})

        -->
    </insert>
    
    <!-- 删除用户:根据id删除用户,需要输入 id值  -->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{value}
    </delete>
    
    <!-- 根据id更新用户
    分析:
    需要传入用户的id
    需要传入用户的更新信息
    parameterType指定user对象,包括 id和更新信息,注意:id必须存在
    #{id}:从输入 user对象中获取id属性值
     -->
    <update  id="updateUser"  parameterType="cn.itcast.mybatis.po.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 
         where id=#{id}
    </update>
    
</mapper>

2、创建mybatis配置文件:sqlMapConfig.xml

在sqlMapConfig.xml中加载User.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>
    
    <!-- 和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>
        <!--通过resource方法一次加载一个映射文件,可以不在同一包下 -->
        <mapper resource="sqlmap/User.xml"/>

        
        <!-- 通过mapper接口加载单个 映射文件
        遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中。
        上边规范的前提是:使用的是mapper代理方法 -->
        <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
        
        <!-- 批量加载mapper
        指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
        遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中。
        上边规范的前提是:使用的是mapper代理方法 -->
        <package name="cn.itcast.mybatis.mapper"/>
    </mappers>
    
</configuration>

3、程序编写

public class MybatisFirst {

    // 根据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);


        // list中的user和映射文件中resultType所指定的类型一致
        List<User> list = sqlSession.selectOne("test.findUserByName", "小明");


        // 插入用户对象
        User user = new User();
        user.setUsername("王小军");
        user.setBirthday(new Date());
        user.setSex("1");
        user.setAddress("河南郑州");

        sqlSession.insert("test.insertUser", user);

        // 提交事务
        sqlSession.commit();


        // 传入id删除 用户
        sqlSession.delete("test.deleteUser", 39);

        // 提交事务
        sqlSession.commit();


        // 更新用户

        User user = new User();
        //必须设置id
        user.setId(41);
        user.setUsername("王大军");
        user.setBirthday(new Date());
        user.setSex("2");
        user.setAddress("河南郑州");

        sqlSession.update("test.updateUser", user);
        // 提交事务
        sqlSession.commit();

 

        // 释放资源
        sqlSession.close();

    }

上面即是mybatis的快速入门,可以进行单表的CRUD操作。


总结

 1、parameterType

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

 2、resultType

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

 3、#{} 和 ${}

#{}表示一个占位符号,

#{}接收输入参数,类型可以是简单类型(int,string等),pojo、hashmap。

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

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

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。

${}接收输入参数,类型可以是简单类型,pojo、hashmap。

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

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

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: 4

5、插入数据时,返回主键

mysql:

1、自增主键返回

mysql自增主键,执行insert提交之前自动生成一个自增主键。

通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID()

是insert之后调用此函数。

    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into user( username, birthday, sex, address) value( #{username}, #{birthday}, #{sex}, #{address})

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

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

执行思路:

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

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

    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
        SELECT uuid()
    </selectKey>
    insert into user( id, username, birthday, sex, address) value( #{id}, #{username}, #{birthday}, #{sex}, #{address})

oracle

通过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})

 


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

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

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

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

 

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

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

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值