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>
<!--打印SQL及结果-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 包的类型别名,配置完后,该包下所有类的别名都默认是自己的类名 -->
<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这三个要修改好。
总结
在Maven下创建Mybatis过程
1.创建Maven项目(该步骤略过)
2.引入依赖(一个mybatis,两个日志)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zpwd</groupId>
<artifactId>mybatis_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!--日志logging-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
<!--带模板的maven项目需要指定xml文件,让其变为可编译-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
3.配置配置文件(数据库、日志、SqlMapConfig.xml)
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/zpwd?useUnicode=true&characterEncoding=utf8
jdbc.user = root
jdbc.password = root
# 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
<?xml version="1.0" encoding="UTF-8"?>
<!--声明根节点类型:configuration-->
<!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.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper映射器,配置持久层的包(以前是dao,现在叫mapper,就是持久层) -->
<!-- -->
<mappers>
<package name="com.zpwd.mapper"></package>
</mappers>
</configuration>
4.创建Mapper层(一个Mapper.java、一个Mapper.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.EmpMapper">
<!--如果形参是基本数据类型:#{}中写啥都行,标准写法#{value}-->
<select id="getEmpByEmpno" parameterType="int" resultType="com.zpwd.pojo.Emp">
select * from emp where empno = #{value}
</select>
<!--返回值是集合,返回值写泛型。如果是Map,返回值写map:Map<String,Object> 、List<Map<String,Object>>-->
<select id="getEmpListByEname" parameterType="String" resultType="com.zpwd.pojo.Emp">
select * from emp where ename = #{value}
</select>
<select id="getMapByEmpno" parameterType="int" resultType="map">
select * from emp where empno = #{value}
</select>
<!--如果形参是对象,#{}中写对象的属性名-->
<select id="getEmpByEmp" parameterType="Emp" resultType="Emp">
select * from emp where empno = #{empno} and ename = #{ename}
</select>
<!--mybatis增删改xml中不存在返回值-->
<insert id="inserEmp" parameterType="Emp" >
insert into emp (ename,empno,job)
values (#{ename},#{empno},#{job})
</insert>
<!--动态sql-->
<select id="getEmpList" parameterType="Emp" resultType="Emp">
select * from emp
<where>
<if test="ename != null and ename != ''">
and ename =#{ename}
</if>
</where>
</select>
<!--sql片段-->
<sql id="commentserch">
</sql>
</mapper>
注意点:
数据库中bit类型的数据发送给jsp文件后,0为false,1为true。
Dao操作的不会出现这种情况!只有mybatis
网友评论