Mybatis入门案例:
sql测试表准备:(自行插入数据)
CREATE TABLE `tbl_employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`last_name` varchar(255) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`d_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept` (`d_id`),
CONSTRAINT `fk_emp_dept` FOREIGN KEY (`d_id`) REFERENCES `tbl_dept` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
第一步pom.xml创建坐标导入依赖:
<dependency>
<!--MyBatis框架Jar包-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<!--MySQL驱动包-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<!--log4j日志包-->
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<!--junit测试包-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
放入log4j.properties:
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
第二步:创建实体类:
@Data
public class Employee{
private Integer id;
private String lastName;
private String email;
private Integer gender;
}
dao的接口:
public interface EmployeeMapper {
/**
* 查询所有操作
*/
List<Employee> getAllEmp();
}
第三步: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">
<!--MyBatis主配置文件-->
<configuration>
<!--配置环境-->
<environments default="dev_mysql">
<!--配置mysql的环境,可以配置多个数据库-->
<environment id="dev_mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接数据库的4个基本信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<!-- 告知mybatis映射配置的位置 -->
<mappers>
<mapper resource="cn/codewhite/dao/EmployeeMapper.xml"/>
</mappers>
</configuration>
第四步:创建映射配置文件EmployeeMapper.xml
<?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">
<!--配置查询所有(是Dao里面的方法)-->
<mapper namespace="cn.codewhite.dao.EmployeeMapper">
<!-- List<Employee> getAllEmp();-->
<select id="getAllEmp" resultType="cn.codewhite.pojo.Employee">
select * from tbl_employee
</select>
</mapper>
案例测试:
@Test
public void test01() {
InputStream is = null;
SqlSession sqlSession = null;
try {
// 第一步:读取配置文件(获取输入流)
is = Resources.getResourceAsStream("mybatis-config.xml");
// 第二步:创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(is);
// 第三步:创建SqlSession.openSession();
sqlSession = sqlSessionFactory.openSession();
// 第四步:创建Dao接口的代理对象
EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
// 第五步:执行dao中的方法
List<Employee> allEmp = empMapper.getAllEmp();
//打印:
allEmp.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 第六步:释放资源
sqlSession.close();
if (is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如果遇到bug:
1.在mybatis-config.xml没有告知mybatis映射配置的位置
Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface cn.codewhite.dao.EmployeeMapper is not known to the MapperRegistry.
答案:在SqlMapConifg.xml加入以下内容
<!-- 告知mybatis关系映射配置的位置 -->
<mappers>
<mapper resource="cn/codewhite/dao/EmployeeMapper.xml"/>
</mappers>
总结:
第一步:创建maven工程并导入坐标依赖
第二步:创建实体类和dao的接口
第三步:创建Mybatis的主配置文件
mybatis-config.xml
第四步:创建映射配置文件
EmployeeMapper.xml
环境搭建的注意事项:
第一个:创建EmployeeMapper.xml和 EmployeeMapper.java时名称是为了和我们之前的知识保持一致。
在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper
所以:EmployeeDao 和 EmployeeMapper是一样的
第二个:在idea中创建目录的时候,它和包是不一样的
包在创建时:com.itheima.dao它是三级结构
目录在创建时:com.itheima.dao是一级目录
第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同
第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。
mybatis的入门案例
第一步:读取配置文件
第二步:创建SqlSessionFactory工厂
第三步:创建SqlSession
第四步:创建Dao接口的代理对象
第五步:执行dao中的方法
第六步:释放资源
小结问题:
1、接口式编程
原生: Dao ====> DaoImpl
mybatis: Mapper ====> xxMapper.xml
2、SqlSession代表和数据库的一次会话;用完必须关闭;close
3、SqlSession和connection一样它都是非线程安全。每次使用都应该去获取新的对象。
4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
(将接口和xml进行绑定)
EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
5、两个重要的配置文件:
mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等…系统运行环境信息
sql映射文件:保存了每一个sql语句的映射信息:
将sql抽取出来。
- 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
- 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
- 3、将sql映射文件注册在全局配置文件中
- 4、写代码:
- 1)、根据全局配置文件得到SqlSessionFactory;
- 2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
- 一个sqlSession就是代表和数据库的一次会话,用完关闭
- 3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
sql关系映射文件:存在dao包下的:EmployeeMapper.xml
全局配置文件:mybatis-config.xml
,并且在全局配置文件中不要忘了写映射文件的地址