前言
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
简而言之,框架是软件(系统)的半成品,框架封装了很多的细节,使开发者可以使用简单的方式实现功能,大大提高开发效率。
一、MyBatis框架概述
1.mybatis 是一个优秀的基于 java 的==持久层框架==,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis 通过xml 或注解的方式将要执行的各种statement 配置起来,并通过java 对象和statement 中sql的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql并将结果映射为 java 对象并返回。
采用 ORM 思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。
2.我们由于前面学习了jdbc现在我们可以回顾一下
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123456");
//3.定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
//4.获取预处理 statement
preparedStatement = connection.prepareStatement(sql);
//5.设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
//6.向数据库发出 sql 执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//7.遍历查询结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + "
"+resultSet.getString(" username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//8.释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.jdbc问题分析:
-
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
-
Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大, sql 变动需要改变java 代码。
-
使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
-
对结果集解析存在硬编码(查询列名), sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便
4.小结
MyBatis: 持久层的一个框架, 封装了JDBC. 操作数据库
二、Mybatis入门
1.需求
使用MyBatis查询所有的用户, 封装到List集合
2.分析
-
创建Maven工程(jar), 添加坐标
-
创建pojo
-
创建UserDao接口
-
创建UserDao映射文件
-
创建MyBatis核心配置文件SqlMapConfig.xml
-
编写java代码测试
3.实现
3.1准备工作
- 数据库
CREATE DATABASE mybatis_day01;
USE mybatis_day01;
CREATE TABLE t_user(
uid int PRIMARY KEY auto_increment,
username varchar(40),
sex varchar(10),
birthday date,
address varchar(40)
);
INSERT INTO `t_user` VALUES (null, 'zs', '男', '2018-08-08', '北京');
INSERT INTO `t_user` VALUES (null, 'ls', '女', '2018-08-30', '武汉');
INSERT INTO `t_user` VALUES (null, 'ww', '男', '2018-08-08', '北京');
3.2创建Maven工程
3.2.1创建Maven工程(jar)导入坐标
<dependencies>
<!--MyBatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
3.2.2创建User实体类
-
User .java
public class User implements Serializable{
private int uid; //用户id
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//get和set方法略
}
3.2.3创建 UserDao 接口
-
UserDao 接口就是我们的持久层接口(也可以写成 UserMapper) .我们就写成UserDao ,具体代码如下:
public interface UserDao { public List<User> findAll();
}
3.2.4创建 UserDao.xml 映射文件
注意: 该文件要放在com/itheima/dao里面, 不要写成com.itheima.dao
<?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属性: 接口类的全限定名-->
<mapper namespace="com.itheima.dao.UserDao">
<!--select标签: 查询
id属性: 方法名
resultType属性: 写方法返回值类型(如果是list,直接写实体类的全限定名)
标签体: sql语句
-->
<select id="findAll" resultType="com.itheima.bean.User">
select * from t_user;
</select>
</mapper>
3.2.5创建 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">
<configuration>
<!--配置连接数据库的环境 default:指定使用哪一个环境-->
<environments default="a">
<environment id="development">
<!--配置事务,MyBatis事务用的是jdbc-->
<transactionManager type="development"/>
<!--配置连接池, POOLED:使用连接池(mybatis内置的); UNPOOLED:不使用连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_day01?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--引入映射文件; resource属性: 映射文件的路径-->
<mapper resource="com/itheima/dao/UserDao.xml"/>
</mappers>
</configuration>
3.2.6测试
public class DbTest {
@Test
public void fun01() throws Exception {
//1. 读取SqlMapConfig.xml获得输入流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(is);
//3. 获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.获得UserDao代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//5.调用方法
List<User> list = userDao.findAll();
System.out.println(list);
//6.释放资源
sqlSession.close();
}
}
4.小结
-
创建Maven工程 导入坐标
-
创建pojo
-
创建Dao接口
-
创建Dao的映射文件
-
创建MyBatis核心配置文件SqlMapConfig.xml
-
编写Java代码
三.Mapper动态代理方式
1.目标
掌握Mapper动态代理方式规范
2.路径
-
入门案例回顾
-
规范
3.讲解
3.1.1Mapper.xml(映射文件)
定义mapper映射文件UserDao.xml,需要修改namespace的值为 UserDao接口全限定名。将UserDao.xml放在classpath的xxx.xxx.dao目录下
<?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.itheima.dao.UserDao">
<select id="findAll" resultType="User">
SELECT *FROM t_user
</select>
</mapper>
3.1.2Mapper.java(dao接口)
public interface UserDao {
/**
* 查询所有的用户
* @return
*/
List<User> findAll();
}
3.2.3测试
public class DbTest {
@Test
public void fun01() throws Exception {
//1. 读取SqlMapConfig.xml获得输入流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory(构建者模式)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(is);
//3. 获得SqlSession(工厂模式)
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.获得UserDao代理对象(代理模式)
UserDao userDao = sqlSession.getMapper(UserDao.class);
//5.调用方法
List<User> list = userDao.findAll();
System.out.println(list);
//6.释放资源
sqlSession.close();
}
}
3.2规范
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace必须和mapper(Dao)接口的全限定名相同。
2、Mapper.xml文件中select,update等的标签id的值必须和mapper(Dao)接口的方法名相同
3、Mapper.xml文件中select,update等的标签的parameterType必须和mapper(Dao)接口的方法的形参类型对应
4, Mapper.xml文件中select,update等的标签的resultType必须和mapper(Dao)接口的方法的返回值类型对应
5, Mapper.xml文件的文件名尽量和mapper(Dao)接口的名字一样
6, Mapper.xml文件的路径尽量和mapper(Dao)接口的路径在同一层目录
四.核心配置文件详解
1.目标
掌握SqlMapConfig.xml配置文件
2.路径
-
核心配置文件的顺序
-
properties
-
typeAliases
-
Mapper
3.讲解
3.1.核心配置文件的顺序
properties(引入外部properties文件)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
3.2.properties
-
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_day01?characterEncoding=utf-8
jdbc.user=root
jdbc.password=123456
引入到核心配置文件
<configuration>
<properties resource="jdbc.properties">
</properties>
<!--数据源配置-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<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>
....
</configuration>
3.3typeAliases(类型别名)
3.3.1定义单个别名
-
核心配置文件
<typeAliases>
<typeAlias type="com.itheima.bean.User" alias="user"></typeAlias>
</typeAliases>
修改UserDao.xml
<select id="findAll" resultType="user">
SELECT * FROM user
</select>
3.3.2批量定义别名
使用package定义的别名:就是pojo的类名,大小写都可以
核心配置文件
<typeAliases>
<package name="com.itheima.bean"/>
</typeAliases>
修改UserDao.xml
<select id="findAll" resultType="user">
SELECT * FROM user
</select>
3.4Mapper
3.4.1方式一:引入映射文件路径
<mappers>
<mapper resource="com/itheima/dao/UserDao.xml"/>
</mappers>
3.4.2方式二:扫描接口
注: 此方式只能用作:代理开发模式,原始dao方式不能使用.
配置单个接口
<mappers>
<mapper class="com.itheima.dao.UserDao"></mapper>
</mappers>
批量配置
<mappers>
<package name="com.itheima.dao"></package>
</mappers>
五.日志
我们在使用MyBatis的时候, 其实MyBatis框架会打印一些必要的日志信息, 在开发阶段这些日志信息对我们分析问题,理解代码的执行是特别有帮助的; 包括项目上线之后,我们也可以收集项目的错误日志到文件里面去; 所有我们采用专门的日志系统来处理.
导入坐标
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
拷贝log4j.properties到resources目录
##设置日志记录到控制台的方式
log4j.appender.std=org.apache.log4j.ConsoleAppender
log4j.appender.std.Target=System.err
log4j.appender.std.layout=org.apache.log4j.PatternLayout
log4j.appender.std.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n
##设置日志记录到文件的方式
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=mylog.txt
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
##日志输出的级别,以及配置记录方案
log4j.rootLogger= trace,std,file
级别:error > warn > info>debug>trace