Mybatis
Mybatis是SSM框架中的M。操作持久层,代替dao,hibernate。提供半自动数据查询。
一.MyBatis的框架原理(掌握)
Mybatis是一个持久层的架构,是apache下的顶级项目。
Mybatis原先是托管在googlecode下,再后来是托管在Github上。
Mybatis让程序员将主要的精力放在sql上,通过Mybatis提供的映射方式,自由灵活生成(半自动,大部分需要程序员编写sql)满足需要sql语句。
Mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活的映射成java对象。(输出映射)
二.Mybatis框架
mybatis架构图.jpg三.Mybatis简单应用(IDE:idea intellij)
完成对数据库emp表的查询(查询一条,查询全部,条件查询)
1.准备jar包(maven上自选版本)
mybatis-3.4.6.jar(核心依赖)
commons-logging-1.2.jar(日志)
log4j-1.2.17.jar(日志)
2.web-inf下创建lib文件夹,标记为resource root,将项目所需的依赖粘贴进去,并标记为library
3.在工作空间下创建一个统一存放为配置的文件夹resources,并标记为resource root。
①.在resources建立一个连接数据库的db.properties
jdbc.driverClassName = oracle.jdbc.driver.OracleDriver
jdbc.url= jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc.username = scott
jdbc.password = tiger
②.在resources建立一个log4j.properties文件,配置开发时运行日志相关内容,必须要知道有这个文件,但是文件内容对于小白来说可以不知道。
# Global logging configuration
#在开发环境日志级别要设置为DEBUG、生产环境要设置为INFO或者ERROR
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
③在resources建立SqlMapConfig.xml文件,文件名称虽然随意,但是约定熟成,用mybatis操作数据库配置的文件名称都是这个。
<?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>
<!-- 如果不配置db.properties,下面的连接池可直接定义driver,url,username,password -->
<properties resource="db.properties"></properties>
<!-- 包的类型别名,配置完后,该包下所有类的别名都默认是自己的类名 -->
<typeAliases>
<package name="com.zpwd.pojo"/>
<!-- 自定义单个包下其中的一个类的别名 -->
<!-- <typeAlias type="com.zpwd.pojo.Emp" alias="Emp"></typeAlias> -->
</typeAliases>
<!--数据源配置 这块用 Oracle数据库 -->
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper映射器,配置持久层的包(以前是dao,现在叫mapper,就是持久层) -->
<!-- -->
<mappers>
<package name="com.zpwd.mapper"></package>
</mappers>
</configuration>
注意点:
- <properties resource="db.properties"></properties>调用的是db.properties文件,如果没有配置db.properties,可再下方driver,url,username,password 处填写真实的连接池。
- <mappers>
<package name="com.zpwd.mapper"></package>
</mappers>
指的是SqlMapConfig.xml配置的是哪个包下的文件,使配置文件和包进行连接。 - <typeAliases>
<package name="com.zpwd.pojo"/>
</typeAliases>
指的是SqlMapConfig.xml配置的是哪个包下mapper.xml文件中出现的类的所在包的路径,使用该种写法后,可以mapper.xml中不需写类名的全称(包名.类名)
4.创建一个Java bean
注意:类名称和属性一定要与数据库中的表名称和字段名称一一对应。
自己补全getter() 、setter()方法(alt+insert)
java bean代码
package com.zpwd.pojo;
import java.util.Date;
public class Zpwd {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private double sal;
private double comm;
private Integer deptno;
}
5.创建一个mapper包,该包可以认为是代替dao的包。
dao模式:一个接口,一个实现类
mapper:一个接口,一个对应的.xml文件(接口名和xml文件名称必须完全一致)
接口写的是查询规则,根据人员ID查询一条,查询全部数据,根据条件查询返回雇员信息集合
!!!该框架下如果形参为两个以上的条件,必须使用对象,换句话说,不接受两个及以上的形参。
ZpwdMapper.java
public interface ZpwdMapper {
Zpwd serchByEmpno(Integer empno);
List<Zpwd> serchAll();
List<Zpwd> serchByDeptnoSal(Zpwd zpwd);
}
ZpwdMapper.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">
<mapper namespace="com.zpwd.mapper.ZpwdMapper">
<select id="serchByEmpno" parameterType="Integer" resultType="Zpwd">
select * from zpwd where empno = #{value}
</select>
<!-- 返回值为list或set集合时,需要写泛型(与map不同) -->
<select id="serchAll" resultType="Zpwd">
select * from zpwd
</select>
<select id="serchByDeptnoSal" parameterType="Zpwd" resultType="Zpwd">
select * from zpwd where deptno = #{deptno} and sal > #{sal}
</select>
</mapper>
注意点:
- 该框架下如果形参为两个以上的条件,必须使用对象,换句话说,不接受两个及以上的形参
- 接口名和xml文件名称必须完全一致
<mapper namespace="com.zpwd.mapper.ZpwdMapper">指向的就是ZpwdMapper.java文件 - id中的内容是方法名称。
- parameterType: 是参数类型,当形参是一个的时候,用#{value}代替。当形参是对象时,xml会解析成#{getter(属性)},但是getter去掉,直接写成#属性}
- resultType:是返回值类型,当返回值是list,set集合时,使用泛型(map除外)
<?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,开头大写Mapper,小写mapper这三个要修改好。