原生态JDBC程序问题总结:

  1、数据库连接,使用时就创建,不使用立即释放。该操作是对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
    解决:使用数据库连接池管理数据库连接。

  2、将sql语句硬编码到java代码中,若sql语句修改,需要重新编译java代码,不利于维护。
    解决:将sql语句配置在xml配置文件中,即使sql变化,也不需要对java代码进行重新编译。

  3、在向PreparedStatement中设置参数时,对占位符位置和设置参数值,硬编码在Java代码中,不利于维护。
    解决:将sql语句及占位符和参数全部配置在xml配置文件中。

  4、从ResutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于维护。
    解决:将查询的结果集,自动映射成Java对象。

Mybatis简述:

  mybatis是一个持久层框架,是Apache下的顶级项目。mybatis的前身是ibatis。mybatis开始是托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)
  mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动)满足需要sql语句。
  mybatis可以将向PreparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成Java对象(输出映射)

Mybatis框架原理:

  SqlMapConfig.xml:mybatis的全局配置文件,名称不固定;配置了数据源、事务等mybatis运行环境。mybatis还需要配置mapper.xml、mapper.xml等,mapper.xml就是映射文件(配置sql语句)。
  SqlSessionFactory:会话工厂。根据配置文件创建工厂。作用就是创建SqlSession。
  SqlSession:会话。是一个接口,面向用户的接口。作用,进行crud数据库操作。
  Executor:执行器。是一个接口,存在俩个实现:基本执行器、缓存执行器。作用,SqlSession内部通过执行器进行crud数据库操作。
  mapped statement:底层封装对象。作用,对crud数据库操作存储封装,包含sql语句、输入参数、输出结果类型。

Mybatis入门程序:

  映射文件:


<?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语句:
        select标签执行数据库查询
            id:标识映射文件中的sql,将sql语句封装到mappedStatement对象中,所以将id称为statement的id
            parameterType:指定输入参数的类型。
            resultType:输出类型。指定sql输出结果的所映射的java对象类型,select指定resultType表示将单条记录映射成的Java对象。
            #{}:表示一个占位符号
            #{id}:其中的id表示接入输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意;可以是value或其他名称。
             -->
    <select id="findUserById" parameterType="参数的类型。如:int" resultType="">
        select * from t_User where id=#{id}
    </select>
    <!-- 无论sql语句返回的是单条记录或多条记录都是所映射的Java对象类型
        ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。使用${}拼接sql,会引起sql注入。
        ${value}:接收输入参数的内容,若传入类型是简单类型,${}中只能使用value -->
    <select id="findUserByName" parameterType="String" resultType="cn.ccir.mybatis.entity.User">
        select * from t_User where username like '%${value}%'
    </select>
    <!-- 添加配置 
        parameterType:指定输入参数类型是pojo(普通的java对象)
        #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 -->
    <insert id="insertUser" parameterType="cn.ccir.mybatis.entity.User">
        
        <!-- 将插入数据的自增主键值返回,返回到user对象中
            select LAST_INSERT_ID():得到刚insert的记录主键值,只适用于自增主键
            keyProperty:将查询到主键值设置到parameterType指定对象的那个属性
            order:select LAST_INSERT_ID()的执行顺序,相对于insert语句来说它的指定顺序
            resultType:指定select LAST_INSERT_ID()的结果类型 -->>
        <selectKey keyProperty="id" order="AFTER" resultType="java.long.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        <!---->
        <!-- 将插入数据的非自增主键值返回,uuid()得到主键,在insert语句之前执行。
            通过uuid()得到主键,将主键设置到user对象的id属性中。其次在insert执行时,从user对象中去除id属性值 -->
        <selectKey keyProperty="id" order="BEFORE" resultType="java.long.String">
            select uuid()(mysql)/select 序列名.nextval()(oracle)
        </selectKey>
        insert into user(id,username,birthday,sex,address)value(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>
    
    <!-- 删除配置 -->>
    <delete id="deleteUserById" parameterType="java.lang.Integer">
        delete from t_User where id=#{id}
    </delete>
    
    <!-- 修改配置
        parameterType:指定user对象,包括id和更新信息。注:id必须在User对象中存在
        #{}:从输入User对象中获取id属性值 -->>
    <update id="updateUserById" parameterType="cn.ccir.mybatis.entity.User">
        update t_User set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
</mapper>
UserMapper.xml

相关文章:

  • 2021-12-28
  • 2021-09-24
  • 2022-01-01
  • 2021-06-23
  • 2021-09-21
  • 2021-09-10
  • 2021-11-03
  • 2021-07-16
猜你喜欢
  • 2021-05-21
  • 2022-03-10
  • 2021-12-22
  • 2022-03-02
  • 2021-07-25
  • 2021-05-24
  • 2022-01-03
相关资源
相似解决方案