1. 什么是框架?
* 他是我们软件开发中的一种解决方案,不同的框架解决的是不同的问题。
2. 使用框架的好处:
* 框架封装了很多的细节,使开发者可以使用极简的方式实现功能开发
3. 持久层的解决技术
1. JDBC技术
2. Spring的JdbcTempate
3. Apache的DBUtils
* 以上都不是框架,JDBC是规范,JdbcTempate和DBUtils都只是对JDBC的简单封装,而不是一种解决方法,或者说封装的不够细致。
4. Mybatis概述:
1. Mybatis是一个持久层框架,用java编写的。他封装了jdbc的很多细节,使得开发者只需要关注sql语句本身。
2. 使用了ORM思想实现了结果集的封装。
* ORM:Object Relational Mapping 对象关系映射
* 简单来说:就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
3. Mybatis好处:
1. 在dao层,我们只需要写接口,而不需要写实现的实体类,只专注于sql语句本身
2. 支持动态sql语句。
3. 支持多表查询。
4. 能够使用延迟加载技术,提高资源利用率和用户体验
5. 自带缓存技术。(如果是传统开发需要借助Redis数据库)
5. 补充说明:
1. mybatis是基于JDK动态代理对接口进行代理的。
2. 动态代理的技术:
1. JDK的动态代理。它是基于接口方式实现的,要求所代理的类是一个接口类或者继承了接口,对一般的类就无法代理,spring默认是这种;
2. CGLIB动态代理。通过设置proxy-target-class="true",可以启动CGLIBD的动态代理,CGLIB直接生成二进制码,使得普通类也可以实现AOP。
1. 用maven建立项目,并在pom.xml中加入mybatis的依赖jar包
<!--导入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
3. 在resource目录下建立:SqlMapConfig.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>
<!-- 引入外部资源:mysql配置文件 -->
<properties resource="druid.properties"></properties>
<!--使用typeAliases配置别名,用于指定java目录下的包的别名-->
<typeAliases>
<!--用于指定java目录下的包的别名,指定包的别名后,后面用到改包中的类时,直接用类名,且类名不区分大小写-->
<package name="cn.wanghao.mybatis.domain"></package>
</typeAliases>
<!--配置环境-->
<environments default="mysql"> <!--default的值是任意取的,但是必须与下面的id的值一致-->
<!--配置mysql的配置环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="${driverClassName}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 指定映射类 -->
<mappers>
<!--用于指定存放xml文件的包的别名,就不需要写mapper标签了及resource或者class属性了-->
<package name="cn.wanghao.mybatis.dao"></package>
</mappers>
</configuration>
4. 在resource目录下必须一次次的建立文件夹:cn再建wanghao再建mybatis再建UserDao.xml。
5. 在UserDao.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="cn.wanghao.mybatis.dao.UserDao"> <!-- namespace的值是需要配置的dao层下的接口类 -->
<!-- id是要简化的方法名; resultType返回值的类型类路径 -->
<select id="findAll" resultType="User">
select * from user;
</select>
<insert id="insert" parameterType="User" keyColumn="">
insert into user(userName, passwd, gender, age, brithPlace, email) values (#{userName},#{passwd},#{gender},#{age},#{brithPlace},#{email});
</insert>
</mapper>
1. 用maven建立项目,并在pom.xml中加入mybatis的依赖jar包
<!--导入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
2. 在domain目录下建立的实体类和dao层接口类,且dao层的接口类中的方法用注解的方式进行注解:
3. 在resource目录下建立:SqlMapConfig.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>
<!-- 引入外部资源:mysql配置文件 -->
<properties resource="druid.properties"></properties>
<!--使用typeAliases配置别名,用于指定java目录下的包的别名-->
<typeAliases>
<!--用于指定java目录下的包的别名,指定包的别名后,后面用到改包中的类时,直接用类名,且类名不区分大小写-->
<package name="cn.wanghao.mybatis.domain"></package>
</typeAliases>
<!--配置环境-->
<environments default="mysql"> <!--default的值是任意取的,但是必须与下面的id的值一致-->
<!--配置mysql的配置环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="${driverClassName}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 指定映射类 -->
<mappers>
<!-- 为dao层下进行注解配置的接口类的包指定别名,指定包的别名后,就不需要写mapper标签了及resource或者class属性了-->
<package name="cn.wanghao.mybatis.dao"></package>
</mappers>
</configuration>
1. 使用要求:
1、持久层接口和持久层接口的映射配置必须在相同的包下(即:UserDao.java与UserDao.xml目录结构一样)
2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名 (比如:cn.wanghao.mybatis.dao.UserDao)
3、SQL 语句的配置标签
这个问题,在我们传的参数是VO对象,或者返回的是VO对象时,可以会遇到!
解决方法有两种:
1. 修改sql语句,用as语句做修改
* 比如:select id as userId from user;
2. 在持久层接口的映射配置文件中使用 标签
* 使用步骤:
1. 定义 查询的结果列名与实体类的属性名的对应关系
* 比如:
* 注意:在resultMap标签里面,如何你确定表字段名和实体类的属性名一样,可以不写该属性的或者标签
2. 使用上面定义的对应关系
* 谁要使用上面的对应关系就
1. 删除resultType属性
2. 用resultMap属性设置,其属性值为上面的id值
* 比如:
select * from user;
public List findRolesByMap(@Param("roleName") String roleName, @Param("note") String note);
在mybatis中 允许map接口通过键值对传递多个参数,把接口方法定义为:
public List findRolesByMap(Map
此时,传递给映射器的是一个map对象,使用它在SQL中设置对应的参数
select id,role_name as roleName,note from t_role where role_name like concat('%#{roleName}%')
and note like concat('%#{note}%')
注意,参数roleName和note,要求的是map的键,也就是需要按照如下方式传递参数。
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
Map paramenterMap=new HashMap();
parameterMap.put("roleName","1");
parameterMap.put("note","1");
List roles=roleMapper.findRolesByMap(parameterMap);