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