mybatis 的简单学习
- 理解框架的概念和作用
- 入门案例的编写
- 使用log4j 输出MyBatis日志
- 完成CRUD
- 理解核心配置文件中常用标签的含义
1.框架 : 软件的设计规范或者标准化的组件,我们可以使用框架中定义好的功能和组件,提高开发效率
2.学习框架的意义: 解决了技术的通用的问题,提高开发效率,提升系统的稳定性
3.mybatis 框架 是一个底层数据的框架
mybatis官网
框架包下载地址
MyBatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射
4.MyBatis的ORM方式
Object Relational Mapping 对象关系映射
Mybatis 的两种映射方式
xml 和 注解
5.入门案例的编写
1.数据库表的创建
CREATE SCHEMA `study_mybatis_01_01` DEFAULT CHARACTER SET utf8 ;
SET utf8 ;
use study_mybatis_01_01 ;
create table t_user (
id int primary key auto_increment,
username varchar(20) not null,
birthday date,
sex char(1) default '男',
address varchar(50)
);
insert into t_user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
insert into t_user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
insert into t_user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
insert into t_user values (null, '玉面狐','1995-03-22','女','积雷山摩云洞');
insert into t_user values (null, '玉兔精','2010-02-12','女','天竺国皇宫');
insert into t_user values (null, '豹子精','2008-05-03','男','隐雾山折岳洞');
2.User实体类
com.wnz.pojo.User.java
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
// 构造方法、setter、 getter、 toString方法省略……
}
3.UserMappper 接口
Dao层
com.wnz.dao.UserMappepr.java
import com.wnz.entity.User;
import java.util.List;
/**
数据访问层方法
*/
public interface UserMapper {
/**
* 查询所有
* @return
*/
List<User> selectAll();
}
- 接口映射文件
在src/main/resources目录下创建UserMapper.xml映射文件
映射文件的模板可以在http://www.mybatis.org/mybatis-3/zh/getting-started.html找到
- src/main/resources/UserMapper.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">
<!--
接口映射文件最外层标签
namespace 命名空间,指定接口的全限定名
-->
<mapper namespace="com.wnz.dao.UserMapper">
<!--
查询语句
id 接口中方法的名字
resultType 返回值类型
-->
<select id="selectAll" resultType="com.wnz.entity.User">
select * from t_user
</select>
</mapper>
- 核心配置文件
可以在Mybatis官网入门中找到配置模板
http://www.mybatis.org/mybatis-3/zh/getting-started.html
- src/main/resources/mybatis-config.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>
<environments default="default">
<!--环境变量-->
<environment id="default">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/study_mybatis_01_01?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
以上配置文件中的参数需要自己按照自己的实际操作的数据表进行修改
实际开发小技巧 这些配置文件可以事先编写模板利用工具直接生成
7.测试代码
- 通过框架提供的Resources类,加载mybatis-config.xml,得到文件输入流InputStream对象
- 实例化会话工厂建造类SqlSessionFactoryBuilder
- 通过上面的SqlSessionFactoryBuilder对象,读取核心配置文件的输入流,得到会话工厂SqlSessionFactory
- 使用SqlSessionFactory对象,创建SqlSession对象
- 它相当于JDBC中的Connection对象,提供了操作数据库的CRUD方法
- 它提供了一个getMapper()方法,获取接口的实现对象。
- 获取接口的对象UserMapper,得到接口的代理对象
- 执行数据库的查询操作,输出用户信息
- 关闭会话,释放资源
8.`package com.wnz.dao;
import com.wnz.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserMapperTest {
@Test
public void selectAll() throws IOException {
//1. 获取核心配置文件,得到输入流对象
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2. 构造会话工厂建造类
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 通过建造类得到会话工厂
SqlSessionFactory factory = builder.build(inputStream);
//4. 通过会话工厂得到会话对象
SqlSession session = factory.openSession();
//5. 通过会话对象得到UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//6. 执行查询操作
List<User> users = userMapper.selectAll();
for (User user : users) {
System.out.println(user);
}
//7. 关闭会话
session.close();
}
}`
9.Logging (日志)
3.1 重要性
- 系统日志
记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。
系统日志包括系统日志、应用程序日志和安全日志。 - 业务日志
记录web服务器接收处理请求以及运行时错误等各种原始信息以.log结尾的文件。我们通过对日志进行统计、分析、综合,就能有效地掌握网站运行状况,发现和排除错误原因,了解客户访问分布等,更好的加强系统的维护和管理。
3.2 官方说明
mybatis官方对于日志的打印给出了详细的说明,可以参考https://mybatis.org/mybatis-3/logging.html
根据官方说明,我们可以得出以下两点:
- 我们只需要提供上述一种日志对应的jar包依赖以及对应的配置文件即可。
- 如果项目中引入了多种日志实现,我们可以显式地指定具体使用哪一个日志实现。
3.3 项目应用
如果我们希望项目中使用log4j,可以通过下面的步骤实现:
-
pom.xml引入log4j的坐标
-
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
mybatis-config.xml加入日志设置
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
- 在src/main/resoures目录下创建log4j.properties文件,内容如下:
log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
重点强调 : log4j.rootLogger=DEBUG, stdout
DEBUG 执行代码
3.4 测试 显示 详细 日志文件
- CRUD案例
4.1 需求
使用MyBatis完成下面的SQL操作
- 查询id为3的用户信息
- 修改id为2的用户信息
- 删除id为1的用户信息
- 添加一个新用户
名字:红孩儿
生日:2020-11-11
性别:男
住址:号山火云洞
4.2 代码实现
- UserMapper.java
添加以下method
/**
* 根据id查询
* @param id
* @return
*/
User selectById(@Param("id") Integer id);
/**
* 更新
* @param user
* @return
*/
int update(User user);
/**
* 根据id删除
* @param id
* @return
*/
int deleteById(@Param("id") Integer id);
/**
* 插入
* @param user
* @return
*/
int insert(User user);```
```sql
- UserMapper.xml
添加以下sql映射
<!--
查询用户
parameterType 参数的类型,可以省略
-->
<select id="selectById" parameterType="java.lang.Integer" resultType="com.itheima.entity.User">
select * from t_user where id = #{id}
</select>
<!--
修改用户
parameterType 参数的类型,可以省略
-->
<update id="update" parameterType="com.itheima.entity.User">
update t_user set username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} where id=#{id}
</update>
<!--
删除用户
parameterType 参数的类型,可以省略
-->
<delete id="deleteById" parameterType="int">
delete from t_user where id=#{id}
</delete>
<!--
添加操作
parameterType 参数的类型,可以省略
-->
<insert id="insert" parameterType="com.itheima.entity.User">
insert into t_user(username,birthday,sex,address)
values (#{username},#{birthday},#{sex},#{address})
</insert>
完整代码:
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Date;
import java.util.List;
public class UserMapperTest {
private SqlSession session;
private UserMapper userMapper;
/**
* 执行单元测试前,先打开会话且获取userMapper
* 测试方法中直接使用userMapper
*/
@Before
public void before() throws IOException {
//1. 得到输入流对象
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2. 构造会话工厂建造类
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 通过建造类得到会话工厂
SqlSessionFactory factory = builder.build(inputStream);
//4. 通过会话工厂得到会话对象
session = factory.openSession();
//5. 会话对象得到UserMapper接口的代理对象
userMapper = session.getMapper(UserMapper.class);
}
/**
* 测试方法执行完成后,先提交事务,再关闭会话
*/
@After
public void after() {
// 提交事务
session.commit();
// 关闭会话
session.close();
}
@Test
public void selectAll() {
//6. 执行查询操作
List<User> users = userMapper.selectAll();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void selectById() {
User user = userMapper.selectById(3);
System.out.println(user);
}
@Test
public void update() {
//User user = new User(2,"狐狸精", Date.valueOf("1996-05-10"),"女","狐狸洞");
User user = new User(2, "白骨精", Date.valueOf("1992-11-12"), "女", "白虎岭白骨洞");
int row = userMapper.update(user);
System.out.println("更新了" + row + "行");
}
@Test
public void deleteById() {
int row = userMapper.deleteById(1);
System.out.println("删除了" + row + "行记录");
}
@Test
public void insert(){
User user = new User(null,"红孩儿",Date.valueOf("2020-11-11"),"男","号山火云洞");
int row = userMapper.insert(user);
System.out.println("插入了"+row+"行记录");
}
}```
本次初级入门 已完成 后续 会有高级和 重点总结回顾