MyBatis数据库连接的基本使用

Posted 斐波那切

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis数据库连接的基本使用相关的知识,希望对你有一定的参考价值。

MyBatis部分:

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

(1)MyBatis是什么?

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

(2)编程步骤

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

<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.两者都要创建数据库对应实体类

 

以上是关于MyBatis数据库连接的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

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

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

MyBatis查询mysql数据返回null

Mybatis框架第二篇

SpringBoot整合Mybatis连接Oracle数据库

mybatis基本操作