zoukankan      html  css  js  c++  java
  • Mybatis入门程序

    作为一个java的学习者,我相信JDBC是大家最早接触也是入门级别的数据库连接方式,所以我们先来回忆一下JDBC作为一种用于执行SQL语句的Java API是如何工作的。下面的一段代码就是最基本的JDBC开发流程。

    在上代码之前要先导入JDBC的jar包,由于我用的数据库是mysql,所以要先导

    入如下的jar包

     

    接下来的就是加载数据库驱动,获取数据库链接之类的工作了,当然了这些工作都是通过代码来完成的。为了和接下的mybatis配置文件对比,我在这里采用的预处理的方式进行查询,代码如下:

    public class Testjdbc {
    
        public static void main(String[] args) {
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
    
            try {
                // 加载数据库驱动
                Class.forName("com.mysql.jdbc.Driver");
    
                // 通过驱动管理类获取数据库链接
                connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123456");
                // 定义sql语句 ?表示占位符
                String sql = "select * from user where username = ?";
                // 获取预处理statement
                preparedStatement = (PreparedStatement) connection.prepareStatement(sql);
                // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
                preparedStatement.setString(1, "王五");
                // 向数据库发出sql执行查询,查询出结果集
                resultSet = preparedStatement.executeQuery();
                // 遍历查询结果集
                while (resultSet.next()) {
                    System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 释放资源
                if (resultSet != null) {
                    try {
                        resultSet.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if (preparedStatement != null) {
                    try {
                        preparedStatement.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if (connection != null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }    
    }

    然后用过JDBC的人也都知道它有这样那样的缺点,总结下来有以下几点:

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

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

    1. 以上的JDBC代码中明显将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统的维护。

    解决方法:将sql语句配置到xml配置文件中,这样即使sql变化,也不需要对java代码重新编译

    1. 向preparedStatement中设置参数时,对占位符位置和设置参数值硬编码在java代码中,同样不利于系统维护

    解决方法:同样可以将占位符和参数配置在xml文件中

    1. 从resultSet中遍历结果集数据时,存在硬编码

    解决方法:将查询的结果集自动映射为java对象

    说完了JDBC,大家也都看到了JDBC的种种不便,于是Hibernate、Mybatis等等的对象关系映射框架便应运而生,而名义上虽说都是ORM框架,Hibernate和Mybatis在细枝末节上还是有很大不同的,但是本文是探讨Mybatis框架。

    首先Mybatis是什么?

     

    1. mybatis是一个持久层的框架,是apache下的顶级项目(已托管在github上面)
    2. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需求的sql语句
    3. mybatis可以向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象(输出映射)。

    Mybatis架构:

    接下来用mybatis写一个入门程序

    首先讲一下我们的需求,在我的数据库里有一张用户的表,表结构如下

     

    我现在要做的是根据用户的id(主键)查询用户信息

    在开始撸代码之前,先要搭好环境

    eclipse本人采用的是java EE的版本,然后可以去https://github.com/mybatis/mybatis-3/releases该网站下载mybatis的jar包导入到工程里面去

    再然后就是就是上面已经提到了的mysql的驱动包

    除了上面架构图所提到的sqlMapConfig.xml配置文件外,还需要一个包来存映射文件(映射文件是什么后面会提到),即sqlMap。

    最后创建log4j.properties文件方便查看日志

    所以整个项目的架构如下

     

    为方便查阅,这里直接贴出整个项目代码

    首先是log4j.properties文件

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # 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

    然后是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>
        <!-- 和spring整合后 environments配置将废除 -->
        <environments default="development">
            <environment id="development">
                <!-- 使用jdbc事务管理 -->
                <transactionManager type="JDBC" />
                <!-- 数据库连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url"
                        value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                    <property name="username" value="root" />
                    <property name="password" value="123456" />
                </dataSource>
            </environment>
        </environments>
    </configuration>

    这串配置文件无非是配置事务管理和数据库连接池,每个ORM框架都是必备的所以不深究

    紧接着就是我们的重头戏映射文件

    映射文件命名:

    User.xml, 而在mapper代理开发映射文件名称叫xxxMapper.xml, 比如:UserMapper.xml

    而我们在映射文件里要干的活就是配置sql语句,最直观的对比就是hibernate直接在映射文件中将java对象映射为关系(即数据库中的表),而在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">
    <mapper namespace="test">
        <select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User">
           select * from user where id=#{id};
        </select>
    </mapper>

    有一下几点申明:

    1. namespace命名空间,作用是对sql进行分类化管理,理解为sql隔离

    注意:使用mapper代理方法开发,namespace有特殊作用

    1. 通过select执行数据库查询, id标识映射文件中的sql,将sql语句封装到mappedStatement对象中,所以将id称之为statement的id
    2. #{}:表示一个占位符  #{id}: 其中的id表示接收输入的参数,参数名称就是id, 如果输入参数是简单类型,#{}中的参数名称可以任意
    3. parameterType指的是输入参数类型,在这里输入的是id当然是整型,parameterType指的是输出结果所映射的java类型,由于sql语句查到的是一组数据,所以在这里需要一个java对象来接收。

    User类如下:

    之后就是将映射文件加载到全局配置文件SqlMapConfig文件中去

    就是在该文件加上一句

      <mappers>

        <mapper resource="sqlMap/User.xml"/>

    </mappers>

    到这里整个配置文件就完成了,接下来的工作就是编写程序来测试了

    按照之前的架构一步一步来,最后写成的程序如下:

    public class MybatisTest {
        @Test
        public void findUserByIdTest() throws IOException{
    
            
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
            SqlSession sqlSession=sqlSessionFactory.openSession();
            
            User user=sqlSession.selectOne("test.findUserById",1);
            
            System.out.println(user);
        }
    }

    在这里值得注意的地方有两个,第一个是输入流(inputStream)来源于mybatis配置文件

    第二个地方是是selectOne方法里的两个参数:

    第一个参数:映射文件中statement的id,在这里则要写成 namespace+’.’+statement的id

    第二个参数:指定和映射文件中所匹配的parameterType类型的参数

    结果如下:

    写到这里,Mybatis从配置文件到测试代码整个Mybatis入门程序已经写完了,请期待本人接下来的更新

    一杯敬朝阳,一杯敬月光
  • 相关阅读:
    C#字符串常见处理
    应用各种领域逻辑模式组织业务逻辑层
    谈谈C#的异常处理机制
    android适配器Adapter
    Struts+Tomcat搭建
    Android特性与系统架构
    常用控件应用之文本框(TextView)特效
    Activity中与ListActivity中使用listview区别
    Android四大基本组件介绍与生命周期
    ftp原理
  • 原文地址:https://www.cnblogs.com/scuury/p/8546553.html
Copyright © 2011-2022 走看看