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的工作原理

(1)SqlMapperConfig中包含数据库的连接和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对象里保存,有一条记录,就保存一个map,map的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.两者都要创建数据库对应实体类

原文地址:https://www.cnblogs.com/youngchaolin/p/10353086.html

时间: 2024-07-30 14:28:57

MyBatis数据库连接的基本使用的相关文章

myBatis数据库连接配置错误

一.控制台错误提示信息:org.springframework.jdbc.CannotGetJdbcConnectionException : nested exception is org.apache.commons.dbcp.SQLNestedException 六月 27, 2016 3:13:45 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet [Spri

MyBatis数据库连接的基本使用-补充

补充1  MyBatis使用过程中,返回值类型可能是Map,不一定是实体类 返回查询结果也可以是一个Map,不一定是实体类 (1)mybatis会先将查询结果返回为一个map,字段名作为key,字段值作为value,保存在map中,后面再转化为实体类 (2)如果不写实体类,就返回一个Map,想得到其中的字段值,需要调用map.get()方法来获取值,缺点就是需要先知道字段名 EmpMapper.xml中配置: <!-- 返回map类型的结果 --> <!-- 也可以将返回结果简写成map

MyBatis数据库连接的基本使用-补充Mapper映射器

补充 Mapper映射器的使用: Mapper映射器,google添加.Mapper映射器是将mapper.xml中配置的sql id,parameterType和resultMap按照规则一一映射到接口中,后续MyBatis创建完接口实例后,可以直接调用对象中的方法操作数据库,其底层还是调用了sqlSession的 API (1)什么是Mapper映射器 符合映射文件要求的一个接口:Mybatis会生成符合该接口要求的对象 (2)接口要求 a 方法名要与mapper.xml配置文件中sql的i

Mybatis深入之数据库连接池原理

Mybatis深入之数据库连接池原理 简介 主要记录Mybatis数据库连接池实现原理.如何使用连接池来管理数据库连接的.连接池如何向外提供数据库连接.当外部调用使用完成之后是如何将数据库连接放回数据库连接池的. 准备 有前面的相关文章的铺垫.这里就不再从Mybatis数据库相关信息的初始化以及何时创建一个真正的数据库连接并且向外提供使用的.这两方面的过程可以参见Mybatis深入之DataSource实例化过程和Mybatis深入之获取数据库连接两篇文章. 了解Mybatis数据库连接池如何配

Mybatis深入之获取数据库连接

Mybatis深入之获取数据库连接 简介 主要记录Mybatis何时获取数据库连接以及获取数据库连接的过程.难点在于明白在使用Mybatis数据库连接池情况下的数据库连接的获取过程. 何时获取数据库连接 Mybatis只有在真正执行sql操作的时候才会去获取数据库连接.至于如何验证: 不深入源码 简单来讲就是有意将数据库配置信息写成.在一个sql执行过程中看哪一步抛数据库连接异常. public static void main(String[] args) throws Exception {

MyBatis入门学习(一)

所须要jar包:mybatis-3.x.x.jar .假设须要和spring整合,还须要增加相关的包 1:看项目文件夹 红颜色不要关心 2:依照步骤: 1:增加jar包 2:创建数据源(configuration.xml)创建数据库(此处省略) <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config

Mybatis深入之DataSource实例化过程

Mybatis深入之DataSource实例化过程 简介 主要介绍Mybatis启动过程中DataSource实例化的过程.为后面解析一个完整SQL执行过程做个前章. Mybatis中DataSource体系 MybatisDataSource整体简介 Mybatis中关于数据库的类都在org.apache.ibatis.datasource包中 Mybatis配置文件中关于数据库的配置: <environments default="development"> <e

MyBatis学习门户网站(一)

需要jar包:mybatis-3.x.x.jar .假设需要和spring综合,此外,我们需要增加相关的包 1:看到项目文件夹 不要在意红色 2:依照步骤: 1:增加jar包 2:创建数据源(configuration.xml)创建数据库(此处省略) <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Con

mybatis 入门学习

所需要jar包:mybatis-3.x.x.jar .如果需要和spring整合,还需要加入相关的包 1:看项目目录 红颜色不要关心 2:按照步骤: 1:加入jar包 2:创建数据源(configuration.xml)创建数据库(此处省略) <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config