Mybatis
1、Mybatis - ORM框架(Object Relational Mapping):对象关系映射 可以简化数据库操作
对象:指的是Java中的类
Relational :指的是关系型数据库
ORM: 指的是对象与数据库表格之间的对应关系
2、Spring框架: 可以理解为是一个容器,用来装对象,是一个可以做对象管理的一个容器,一般用于整合其他的技术
3、SpringMVC框架:一个分层的框架,主要对C层进行简化
4、RABC,基于角色的访问控制,通过数据库表格的设计来进行权限的控制。
2、什么是框架
框架就是模板就是骨架;
框架就是由一些聪明的程序员封装好的代码,普通程序员可以借助这些代码进行偷懒,使用框架可以大大的提高开发效率,框架的使用是很简单的,但是原理就比较复杂了。封装框架一般用到的技术有:反射、设计模式;
使用框架的流程:
- 需要找到框架提供的资料; *.jar
- 编写配置文件,用于告知框架一些基础信息;如mybatis需要连接数据库(就需要url、username、password等等的一些配置);配置文件的格式有: .properties 和 .xml
- 通过框架提供的API进行编码(也就是调用框架里的一些类和接口进行自己的编码);
3、Mybatis简介
1、Mybatis的官方文档: https://mybatis.org/mybatis-3/zh/index.html
2、Mybatis 的前身是 Apache 下的一款开源项目,叫 iBatis,后来代码迁移到了 GoogleCode 平台,并更名为:Mybatis,后来又迁移到了 GitHub 上。
3、Mybatis 各个版本的下载路径: https://github.com/mybatis/mybatis-3/releases
Mybatis是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。Mybatis几乎免去了所有的 JDBC 代码以及设置参数和获取结果集的工作。Mybatis 可以通过简单的 XML 或 注解来配置和映射原始类型、接口、和 Java POJO 为数据库中的记录;
4、Mybatis环境搭建
4.1、创建项目;
MyBatis是一个不依赖于容器的框架, 可以在se项目中使用.
4.2、将mybatis的jar包拷贝到项目中并加入依赖;
1、Mybatis的核心jar包:mybatis-3.5.2.jar
2、mysql的驱动包:mysql-connector-java-5.1.38.jar
3、junit测试包:junit-4.12.jar
4.3、编写 Mybatis 的核心配置文件;
- 是一个 xml 配置文件,命名无所谓,位置也没有要求,一般放置在 src 目录下(因为src目录下的内容将来都会被编译并存放到路径 classpath中)
- 编写 xml 文件时,需要引入
dtd
约束
<?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>
<!--配置环境 environments, 配置并管理多个环境-->
<environments default="dev">
<!--配置一个环境-->
<environment id="dev">
<!--事务管理器, MyBatis采用和JDBC一致的方式进行事务的管理-->
<transactionManager type="JDBC" />
<!--数据源, 使用连接池技术-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_ssm"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
4.4、数据库表准备
create table tb_user (
id integer primary key auto_increment,
username varchar(30) not null,
password varchar(32) not null,
realname varchar(30),
age int(3),
birthday date,
reg_time datetime
);
insert into tb_user values
(default, 'zhangsan', '123', '张三', 18, '2001-10-10', now()),
(default, 'lisi', '123', '李四', 19, '2000-12-10', now());
select * from tb_user;
4.5、提供对应表格的 POJO 类
4.6、编写映射配置文件
要求也是一个 xml 文件,命名无所谓,位置也无所谓,一般叫 xxxMapper.xml (xxx对应的一般是我们要操作的实体类)
<?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="a.b.c">
<!--id属性类似于方法名, resultType表示查询结果返回的类型-->
<select id="selAll" resultType="com.bjsxt.pojo.User">
select * from tb_user
</select>
</mapper>
需要在核心配置文件中进行映射文件的扫描配置:
<?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>
<!--配置环境 environments, 配置并管理多个环境-->
<environments default="dev">
<!--配置一个环境-->
<environment id="dev">
<!--事务管理器, MyBatis采用和JDBC一致的方式进行事务的管理-->
<transactionManager type="JDBC" />
<!--数据源, 使用连接池技术-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_ssm"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--扫描映射-->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
4.7、编写测试代码
public class TestMyBatis {
@Test
public void testSelAll() throws Exception {
// Resources - 资源加载工具, 默认去classpath加载资源
InputStream is = Resources.getResourceAsStream("mybatis.xml");
// SqlSessionFactoryBuilder - 工厂构建者
// SqlSessionFactory - 会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// SqlSession - 会话, 用于所有mybatis中操作方法的调用
SqlSession sqlSession = factory.openSession();
// 调用方法进行查询
List<User> list = sqlSession.selectList("selAll");
for (User user : list) {
System.out.println(user);
}
// 关闭资源
sqlSession.close();
}
5、环境搭建总结
5.1、配置文件详解
1、核心配置文件:
核心配置文件:mybatis.xml
- 根标签:
- 环境管理标签: 可用于管理多个环境配置,其中 default 属性用于指定当前使用的是具体哪个环境,配置的是子标签 的id;
- 环境配置标签: 用于配置一个环境,其中 id 属性进行唯一标识,可以区分多个环境;
- 事务管理标签 用于指定 Mybatis 使用何种方式进行事务的管理,type的可选值有:JDBC / MANAGED;
- JDBC:表示 Mybatis 采用和 JDBC 一致的方式进行事务的管理;
- MANAGED:表示 Mybatis 不对事务进行管理,交给容器进行管理;
- 数据源标签: 用于配置数据源(数据库连接池),type的可选值有:POOLED |UNPOOLED | JNDI;
- POOLED:表示采用连接池技术获取数据库连接;
- UNPOOLED:表示不采用连接池,每次都物理开关连接;
- JNDI:Java Naming and Directory Interface,java命名和目录接口;
- 映射扫描标签:, <mapper calss | url | resource>
- class:该属性用于扫描类的时候使用;
- rul:该属性用于扫描远程的信息使用;
- resource:用于扫描本地路径下的资源文件;
映射配置文件:UserMapper.xml
- 根标签: , 命令空间namespace必须要配置,命令空间有些类似于 java 中的 package ,在 mybatis 中,命令空间用于管理 sql 语句对应的 id . Mybatis 中定位 sql 语句的方式是: namespace.id
- 子标签:, 用于定义查询 sql 语句
- id:在同一个namespace中进行唯一标识;
- resultType:表名查询结果的类型,应该写类型的全限定路径,同时,如果返回的是集合,应该写集合类型的泛型;
5.2、表中的列与属性不同名问题
默认情况下,只要列名和属性名一致,Mybatis 会进行自动映射(Auto-Mapping); 但是如果列名和属性名不一致的话,不会映射数据,会赋值为 null ,此时如果需要为属性赋值,可以通过别名进行修改,将别名设置为与属性名同名即可;
<?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="a.b.c">
<!--id属性类似于方法名, resultType表示查询结果返回的类型-->
<select id="selAll" resultType="com.bjsxt.pojo.User">
select id, username, password, realname, age, birthday, reg_time regTime
from tb_user
</select>
</mapper>
如:以上配置文件中的:reg_time 可以设置表名:regTime 这样就和属性名一致了;
6、查询常用的三个方法
6.1、selectList
查询多条语句时使用,返回结果是一个 List 集合;
6.2、selectOne
查询单条数据时使用, 返回结果是一个对象/数值. 例如: 跟据主键查询, 返回单个对象; 统计查询.
6.3、selectMap
将查询到的结果封装成一个 Map 集合;
最核心的方法就是:selectList 而 selectOne 和 selectMap 底层调用的都是 seleceList。
注意:selectList和selectMap如果没有查到数据, 返回空集合; 而selectOne如果差不多数据,则返回null
7、日志记录框架 log4j
7.1、何为 log4j?
log for java,为 java 提供的日志记录工具,由 Apache 提供,是一个开源的日志记录工具;
7.2、使用 log4j 的步骤:
- 导包;
- 提供配置文件, 可以使用properties或xml, 一般使用properties. 命名必须叫log4j.properties, 位置必须放在src下;
- log4j的日志级别, 常用的日志级别有6个:
- FATAL, 致命的, 不是代码导致的, 一般是服务器宕机, 网络故障, 硬件故障;
- i. ERROR, 错误, 一般由程序故障导致;
- i. WARN, 警告, 一般不会影响程序的运行, 但是可能存在风险;
- INFO, 信息, 系统输出的一些简单信息;
- i. DEBUG, 调试, 程序要认为调试的输出信息;
- i. TRACE, 跟踪, 显示代码的详细执行流程;
- log4j输出信息的格式, 通过在log4j.properties中进行配置的.
# 设置log4j的根(整体)日志级别, 同时指定日志输出的位置: CONSOLE表示控制台, LOGFILE表示日志文件
log4j.rootCategory=INFO, CONSOLE
#log4j.rootCategory=INFO, CONSOLE, LOGFILE
# 设置局部位置的日志级别
#log4j.logger.org.apache.axis.enterprise=FATAL
# 设置控制台日志输出的格式
# 常用符号
# %m: message, 日志消息
# %n: 回车换行
# %d: 日期时间, 可以自定义日期时间格式, %d{yyyy-MM-dd HH:mm:ss}
# %p: 日志级别
# %l: 日志发生的具体位置
# %c: 定位, 包名.类名
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n
# 设置日志文件中日志输出的格式
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
-
常用的方法
public class TestLog4j { private static Logger logger = Logger.getLogger(TestLog4j.class); public static void main(String[] args) { logger.fatal("致命的错误"); logger.error("代码错误"); logger.warn("警告"); logger.info("普通消息"); logger.debug("调试信息"); logger.trace("跟踪信息"); } }
7.3、Mybatis 对 log4j 的支持
- 通过标签开启对log4j的支持
<!--指定MyBatis运行时环境的配置-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
- 导入jar包:log4j-1.2.17.jar
- 提供log4j.properties配置文件
- 修改日志级别
# 设置log4j的根(整体)日志级别, 同时指定日志输出的位置: CONSOLE表示控制台, LOGFILE表示日志文件
log4j.rootCategory=ERROR, CONSOLE
#log4j.rootCategory=INFO, CONSOLE, LOGFILE
# 设置局部位置的日志级别
log4j.logger.a.b.c=TRACE
8、提取数据库配置信息
-
提取配置信息为:db.properties
-
在核心配置文件:mybatis.xml 中通过 标签加载资源文件;
<!--加载资源文件-->
<properties resource="db.properties" />
- 修改数据库参数的配置
<!--配置环境 environments, 配置并管理多个环境-->
<environments default="dev">
<!--配置一个环境-->
<environment id="dev">
<!--事务管理器, MyBatis采用和JDBC一致的方式进行事务管理-->
<transactionManager type="JDBC" />
<!--数据源, 使用连接池技术-->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-用 ${} 取出db.properties 中的值-->