1.MyBatis 概念
1.1 MyBatis 简介
MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis避免了几乎所有的JDBC代码、
手工设置参数和结果集重获。MyBatis只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO
到数据库记录。
相对Hibernate和ApacheOJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。
1.2 MyBatis的特点
1.简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习, 易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现
2.灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过 sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
3.解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更 易单元测试。sql和代码的分离,提高了可维护性。
4.提供映射标签,支持对象与数据库的orm字段关系映射。
5.提供对象关系映射标签,支持对象关系组建维护。
6.提供xml标签,支持编写动态sql。
2. 入门程序搭建
2.1 准备数据库和数据
CREATE TABLE `aa`.`user`( `id` INT NOT NULL , `name` VARCHAR(255) , `age` INT , PRIMARY KEY (`id`) ); INSERT INTO `user`(`id`,`name`,`age`) VALUES ( '1','aa','12'); INSERT INTO `user`(`id`,`name`,`age`) VALUES ( '2','bb','13'); INSERT INTO `user`(`id`,`name`,`age`) VALUES ( '3','cc','14'); INSERT INTO `user`(`id`,`name`,`age`) VALUES ( '4','dd','15');
2.2 创建一个maven工程,并导入mybatis核心包、依赖包以及mysql驱动
<dependencies> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
2.3 准备pojo实体类
package com.sky.pojo; public class Dept{ private Integer id; private String name;
//省略set/get方法 }
2.4 创建配置文件
1.配置全局核心配置文件mybatis-config.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中节点的位置是有先后顺序的--> <configuration> <!--配置别名,在mapper中可以直接使用别名--> <typeAliases> <typeAlias type="pojo.Dept" alias="Dept"/> <typeAlias type="pojo.Employee" alias="Employee"/> </typeAliases> <environments default="default"> <environment id="default"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!-- 数据库连接信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <!--必须配置characterEncoding=UTF-8--> <property name="url" value="jdbc:mysql://localhost:3306/ssh?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="1111"/> </dataSource> </environment> </environments> <!--实体类的映射文件,在dao包下创建完Mapper文件后在此追加即可--> <mappers> <mapper resource="dao/DeptMapper.xml"/> </mappers> </configuration>
2.配置实体类对应的映射文件
<?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"> <!-- namespace:配置名称空间,对配置的statement进行分类管理,此时名称可以任意 当使用Mapper代理时,namespace具有特殊的含义与功能--> <mapper namespace="DEPT"> <!-- 插入语句: id:可以通过id找到执行的statement,statement唯一标识 resultType:结果类型 --> <!-- 查询所有用户 --> <select id="getAllDept" resultType="com.sky.pojo.Dept"> SELECT ID,NAME FROM DEPT </select> </mapper>
3.配置log4j.properties属性文件
# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
log4j.rootLogger=DEBUG, stdout,
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
3.测试
@Test public void test01() throws IOException { //1.加载核心全局配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.构建SqlSessionFactory对象:会话工厂 SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(inputStream); //3.构建SqlSession对象:执行已经映射的sql语句,调用openSession()默认开启事务不自动事务。 SqlSession session = factory.openSession(); List<User> list = session.selectList("queryAllUser"); //提交事务 session.commit(); //关闭SqlSession对象 session.close(); System.out.println(list); }