MyBatis基础入门--知识点总结

小编 2026-07-15 阅读:1887 评论:0
对原生态jdbc程序的问题总结下面是一个传统的jdbc连接oracle数据库的标准代码:publ...

对原生态jdbc程序的问题总结

下面是一个传统的jdbc连接oracle数据库的标准代码:

public static void main(String[] args) throws Exception {         Connection con = null;// 创建一个数据库连接            PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement            ResultSet result = null;// 创建一个结果集对象            try            {                Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序                System.out.println("开始尝试连接数据库!");                String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:ORCl";// 127.0.0.1是本机地址,XE是精简版Oracle的默认数据库名                String user = "scott";// 用户名,系统默认的账户名                String password = "scott";// 你安装时选设置的密码                con = DriverManager.getConnection(url, user, password);// 获取连接                System.out.println("连接成功!");                String sql = "select * from tuser where username=?";// 预编译语句,“?”代表参数                pre = con.prepareStatement(sql);// 实例化预编译语句                pre.setString(1, "wang");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引                result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数                while (result.next())                    // 当结果集不为空时                    System.out.println("学号:" + result.getInt("id") + "姓名:"                            + result.getString("username"));            }            catch (Exception e)            {                e.printStackTrace();            }            finally            {                try                {                    // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源                    // 注意关闭的顺序,最后使用的最先关闭                    if (result != null)                        result.close();                    if (pre != null)                        pre.close();                    if (con != null)                        con.close();                    System.out.println("数据库连接已关闭!");                }                catch (Exception e)                {                    e.printStackTrace();                }            }            }

对于传统jdbc连接数据库的操作有一些问题,问题及相应的解决构想总结如下:

  1. 数据库连接,使用时创建,不使用时释放.对数据库进行频繁的开始和释放连接,造成数据库资源浪费.

    方案:使用数据库连接池管理连接

  1. 将sql语句,占位符,参数,硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护

    方案:将sql语句,占位符,参数等配置到xml文件中,修改sql语句,无需重新编译项目.

  1. 从resultSet中遍历结果集数据时,存在硬编码,不利于维护

    方案:将查询结果,自动映射成java对象

Myatis和Hibernate的区别

  由于jdbc的这些问题,由此出现很多的ORM框架比较流行的有hibernate,Mybatis等,这些框架底层对jdbc进行了封装,使开发人员将精力放在业务上,大大提高了开发的效率,那么mybatis和hibernate有哪些异同呢?  

   Hibernate是一个标准的ORM(对象关系映射)框架,不需要程序员编写sql语句,sql语句自动生成,对sql语句的修改,优化是比较困难的.

         适用于需求变化不多的中小型项目,比如后台管理系统,ERP,OA系统

   Mybatis专注于sql语句本身,需要程序员自己编写sql语句,优化比较方便,mybatis不是一个完全的ORM框架,是一个半自动化的ORM框架.

         适用于需求变化比较多的互联网项目.

入门项目(简单的数据库查询,根据用户id查询用户信息)

  1.导入jar包 

ant-1.9.6.jar

ant-launcher-1.9.6.jar

asm-5.0.4.jar

cglib-3.2.2.jar

commons-logging-1.2.jar

javassist-3.20.0-GA.jar

log4j-1.2.17.jar

log4j-api-2.3.jar

log4j-core-2.3.jar

mybatis-3.4.1.jar

ognl-3.1.8.jar

ojdbc6.jar

slf4j-api-1.7.21.jar

slf4j-log4j12-1.7.21.jar

  2. src目录下新建mybatis的配置文件mybatis-config.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>    <environments default="development">        <environment id="development">            <transactionManager type="JDBC" />            <!-- 配置数据库连接信息 -->            <dataSource type="POOLED">                <property name="driver" value="oracle.jdbc.driver.OracleDriver" />                <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />                <property name="username" value="scott" />                <property name="password" value="scott" />            </dataSource>        </environment>    </environments>    <mappers>        <mapper resource="sqlMap/User.xml"/>    </mappers></configuration>

   3.配置log4j.properties,将sql语句以及相关信息打印到控制台上,便于分析查看:

     a.src目录(classpath)下新建log4j.properties: 

# Global logging configuration  log4j.rootLogger=ERROR, stdout  # MyBatis logging configuration...  log4j.logger.org.mybatis.example.BlogMapper=TRACE  # Console output...  log4j.appender.stdout=org.apache.log4j.ConsoleAppender  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 

    b.在mybatis-config.xml中加入以下配置:

<settings>        <setting name="logImpl" value="STDOUT_LOGGING" /></settings>

    我当时没有加这个配置,结果控制台连个毛也不给我打印,加上这句配置,就好了.

    4.新建一个pojo类User,包含属性id,username,password及对应get/set方法,代码省略

    5.d.src目录下新建sqlMap文件夹,其下新建一个User.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">  <mapper namespace="test">  <!--parameterType:指定传入参数的类型    resultType:指定返回结果的类型    #{}:表示一个占位符,如果需要填入的是简单数据类型,可以填入value或其他名称    ${}:表示拼接字符串  -->  <select id="findUserById" parameterType="int" resultType="com.wang.pojo.User">      select * from tuser where id = #{value}    </select>  </mapper>  

  6.测试代码:

@Test    public void findUserById() throws IOException{        //mybatis配置文件        String resource ="sqlMapConfig.xml";        //得到配置文件的流        InputStream inputStream=Resources.getResourceAsStream(resource);        //创建会话工厂,传入mybatis配置文件信息        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(inputStream);        //通过工厂得到session        SqlSession session = ssf.openSession();        //通过session操作数据库        User user=session.selectOne("test.findUserById", 1);        System.out.println(user);        session.close();    }

 

  这是一个简单的使用mybatis的小例子,下面介绍几个配置文件中需要关注的几点:

typeAliases(别名)

  mapper.xml,定义很多的statement,statement需要parameterType,resultType指定输入,输出类型.如果在指定类型时,输入类型全路径,不方便进行开发,可以针对parameterTyperesultType指定的类型定义一些别名,mapper.xml中通过别名定义,方便快捷.

     <typeAliases>        <!-- 单个别名的定义 -->        <!-- <typeAlias type="com.wang.pojo.User" alias="user"/> -->        <!-- 批量别名的定义 自动扫描指定包下的po类,默认别名为类名(首字母大写或小写都可以) -->        <package name="com.wang.pojo"/>    </typeAliases>

mapper映射器

  使用mapper代理的方法只需要程序员编写mapper接口即可(就是dao接口),程序员在编写mapper.xml(映射文件)和mapper.java时需要遵循一些规范:

    1.mapper.xml中的namespace就是mapper.java的类全路径.

    2.mapper.xml中的statement的id和mapper.java中的方法名一致.

    3.mapper.xml中的parameterType和resultType和mapper.java中的参数类型和返回值类型一致.

<mappers>        <!-- 单个映射文件的加载,通过resource 一次加载一个 -->        <!-- <mapper resource="sqlMap/User.xml"/>        <mapper resource="sqlMap/UserMapper.xml"/> -->        <!-- 通过mapper接口加载配置文件,需要将mapper接口类型和对应的mapper.xml放在一个目录下        且保持名称一致 -->        <mapper class="com.wang.mapper.UserMapper"/><!-- 批量加载mapper配置文件,推荐使用 -->        <package name="com.wang.mapper"/>    </mappers>

 

输出映射

resultType

  使用resultType进行输出映射,只有查询出来的列名和pojo的属性名一致,才会映射成功

  只要查询出来的列名有一个和pojo类中的属性名一致,就会创建pojo对象,如果全部的都不一致,就不会创建pojo对象

  ResultType的类型 不仅可以是pojo 还可以是map,或者简单数据类型

  像select Count(*) from user;这种sql resultType类型为int

  返回值不管是User(pojo对象)还是List<User>(pojo列表),resultType的值都是一样的,User. 

resultMap

  使用resultMap可以实现高级输出映射.

         如果查询出来的列名和pojo属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系.

    1.       先定义resultMap(mapper.xml):

<!-- 定义resultMap          type:映射的java对象类型,可以使用被别名          id:resultMap的唯一标示           -->  <resultMap type="user" id="userResultMap">      <!-- id表示查询结果集中的唯一标示(主键列)          column:查询出来的列名          property:对应的pojo类中的属性名       -->      <id column="iddd" property="id"/>      <!-- result表示普通列 -->      <result column="name" property="username"/>  </resultMap>

    2.    使用resultMap:

<select id="findUserById" parameterType="int" resultMap="userResultMap">      select id iddd ,username name from tuser where id = #{value}    </select>

 

 

 

 

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表