zoukankan      html  css  js  c++  java
  • MyBatis数据库连接的基本使用

    MyBatis部分:

    本部分内容只主要体现Mybatis的特点。

    (1)MyBatis是什么?

    开源的持久层框架,MyBatis的底层仍然是JDBC

    (2)编程步骤

    step1 Maven项目 pom.xml导包mybatis,ojdbc,junit,mysql驱动等

    <dependencies>
    <!--导入junit测试包 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>
    
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <classifier>sources</classifier>
    </dependency>
    
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <classifier>javadoc</classifier>
    </dependency> 
    
    <!-- 导入数据库包 -->
    <dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
    </dependency> 
    <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.1.0</version>
    </dependency> 
    
    <!-- 导入mybatis的包 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.0</version>
    </dependency>
    
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.8</version>
    <classifier>sources</classifier>
    </dependency>
    
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.8</version>
    <classifier>javadoc</classifier>
    </dependency>   
    
    <!-- 针对mysql的导包 -->
     <dependency>
     <groupId>org.wisdom-framework</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.34_1</version>
     </dependency>
    
    </dependencies>

    step2 添加MyBatis的配置文件SqlMapConfig.xml文件并配置,SqlMapperConfig中包含数据库的连接和Mapper两部分,其中Mapper中写好预编译的sql以及对应的id,将来要存入储存sql的Map中,其中sql做为value,id作为key

    <?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事务管理,事务控制交由mybatis -->
                <transactionManager type="JDBC"/>
                <!-- 数据库连接池,由mybatis管理 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/Admin_ycl"/><!--oracle数据库端口号1521,切记-->
                    <property name="username" value="root"/>
                    <property name="password" value="密码"/>
                </dataSource>
            </environment>
        </environments>
        <!-- 指定映射文件的地方 -->
        <mappers>
         <mapper resource="Entity/EmpMapper.xml"></mapper>
        </mappers>
    </configuration>

    step3 写实体类,实体类的属性名和表的字段名要一样(大小写可以忽略),如果为小写,数据库会自动将SQL语句小写转换成大写形式。实体类建议要实现JavaBean的规范:有一个包,实现序列化接口,有默认构造方法,有属性的set,get方法,建议还有一个toString()方法,方便测试用

    step4 添加EmpMapper.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">
    
    <mapper namespace="test"><!--命名空间为区分可能相同的业务id,如有很多find方法,save方法,分布在各个业务里,使用命名空间来区分-->
      <!-- id要求唯一 
           parameterType:填写实体类的完整名字
      -->
      <insert id="save" parameterType="Entity.Employee">
       INSERT INTO T_TABLE VALUES(1,#{name},#{age})
      </insert>
    </mapper>

    step5 调用Sqlsession对象提供的方法来访问数据库

    package test;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    import Entity.Employee;
    
    public class testCase {
        /**
         * 测试MyBatis连接数据库
         */
        @Test
        public void test1() {
            String config="SqlMapConfig.xml";
            //创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();        
            //创建SqlSessionFactory对象
            SqlSessionFactory ssf=ssfb.build(testCase.class.getClassLoader().getResourceAsStream(config));
            //获得sqlSession对象
            SqlSession session=ssf.openSession();
            //调用sqlsession提供的方法访问数据库
            Employee emp=new Employee();
            emp.setName("muwanqing");
            emp.setAge(22);
            //test.save为sql的id,命名空间为test下的,以及id为save的sql方法
            session.insert("test.save", emp);
            /**
             * mybatis的sqlsession对象在执行插入方法时,会读取test.save,得到id为save
             * 然后在sqlSessionFactory创建的预编译statement Map中,找到key为save的那条预编译sql
             * 然后执行prepareStatement.executeUpdate()方法更新数据
             * prepareStatemen中的问号参数从哪里来?从emp里来
             * 底层将执行prepareStatement.setString(1,emp.getName())...
             * 而哪个问号给与哪个参数,在EmpMapper里,已经按照顺序写好了
             */
            //添加,修改,删除都需要提交事务
            session.commit();
            //关闭sqlsession
            session.close();
        }

    测试结果:

    总结:

    MyBatis的工作原理

    1SqlMapperConfig中包含数据库的连接和Mapper两部分,其中Mapper中写好了预编译的sql,以及sql对应的id预编译的sql和id会当做value和key,被sqlSessionFactory读取sqlMapperConfig文件后,将映射文件中的sql存入一个Map中此时,这些map中的预编译sql是不会执行的

    (2)当从sqlSessionFactory中获取SqlSession,SqlSession会依据sql id,从上述map中寻找预编译sql然后根据第二个参数里绑定的值,一般是实体类中的属性值,将值获取后写入预编译sql,然后执行sql语句

    如果是执行查询操作,执行完sql后,会先将记录放在一个map对象里保存,有一条记录,就保存一个mapmap的key就是数据表的字段名,value就是数据表值,如entity中Employee的id,name,age作为key,对应的值就是value,保存在一个map中,再将map对象中的数据保存到对应的实体对象中。为何map中的对象能保存到实体对象中?因为前面进行了规范,实体类的属性名和数据表的字段名需保持一致,因此能根据属性名,找到对应的value然后利用set方法赋值到实体类

    Mybatis相比SpringJDBC差异点:

    1.连接池初始化:Mybatis会使用SqlSessionFactory读取SqlMapperConfig配置文件后创建连接池,不像SpringJDBC需要读取properties文件,然后创建连接池。Mybatis会帮忙创建连接池,在配置文件中设置驱动,用户名密码等即可。

    2.sql写的位置:Mybatis中会将sql写在专门的映射文件如EmpMapper.xml文件里,将来会被SqlSessionFactory读取后放入预编译sql Map中,而SpringJDBC会将sql专门写在一个类里,这个类会依赖注入配置好的JDBCTemplate后,然后在类中创建方法,调用JDBCTemplate的api,实现数据库更新

    3.sql调用的方式:Mybatis会使用sql的id,配合SqlSession来实现数据库操作,SpringJDBC会根据sql写好的类对应的方法实现调用

    4.两者都要创建数据库对应实体类

  • 相关阅读:
    is_numeric — 检测变量是否为数字或数字字符串
    intval — 获取变量的整数值
    php获取数组最后一个值
    js正則匹配经纬度(经纬度逗号隔开)
    安装netcat(-bash: netcat: command not found)
    提示-bash: telnet: command not found的解决方法
    Laravel中使用Redis
    鏈接Redis報錯`AUTH` failed: ERR Client sent AUTH, but no password is set [tcp://127.0.0.1:6379]
    使用composer遇到的坑
    laravel的ORM模型的find(),findOrFail(),first(),firstOrFail(),get(),list(),toArray()之间的区别
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/10353086.html
Copyright © 2011-2022 走看看