Mybatis入门(一)-- 柚子真好吃
前言:本人刚刚入行小白,处于学习阶段,文章可能含有些许错误和较多瑕疵。望各位大神多多指教~~
一、Mybatis简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,
将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、Mybatis环境搭建
- 首先需要下载Mybatis,下载地址:https://github.com/mybatis/mybatis-3/releases ;
进入网页后如图点击; - 下载后解压文件即可,其中我们需要的是
mybatis-3.4.6.jar-------------------核心包
/lib/文件夹下所有的jar包---------依赖包 - 将以上全部jar包 导入 MyEclipse 下的/WEB-INF/lib 下,这样基本环境就搭建完成了;
三、Mybatis前期的准备工作
-
创建日志配置文件(可做可不做)目的是清楚查看控制台的输出
log4j.propertieslog4j.rootLogger=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] %m%n
-
创建数据库,本例使用 Navicat (俗称:猫爪子)
1)创建数据库名称为‘shop’(可自行定义名称)
2)创建’user’表,包含字段id,username,password,role,desci
3)表中插入相应数据
-
创建实体类(User.java)
package com.redfield.pojo;
/**
* @author Redfield
*
* @date 2019年1月1日
*/
public class User {
private int id;
private String username;
private String password;
private String role;
private String desci;
//无参构造
public User() {
super();
}
//有参构造
public User(int id, String username, String password, String role, String desci) {
super();
this.id = id;
this.username = username;
this.password = password;
this.role = role;
this.desci = desci;
}
//getter 和 setter 方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getDesci() {
return desci;
}
public void setDesci(String desci) {
this.desci = desci;
}
//重写toString方法,方便测试查看信息
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", role=" + role + ", desci="
+ desci + "]";
}
}
四、Mybatis工作原理
- 读取MyBatis配置文件applicationContext-mapper.xml。该文件作为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,其主要内容为获取数据库的连接。
- 加载映射文件UserMapper.xml。UserMapper.xml即SQL映射文件,该文件中配置操作数据库的SQL语句,需要在applicationContext-mapper.xml文件中加载。
- 构建会话工厂。通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory。
- 创建SqlSession对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL的所有方法。
- MyBatis底层定义一个 Executor 接口来操作数据库,它会根据SqlSession传递的参数动态生成需要执行的SQL语句,同时负责查询缓存的维护。
- 在Executor 接口的执行方法中,包含一个MappedStatement类型的参数,该参数是对映射信息的封装,用于储存要映射的SQL语句的id,参数信息。
五、Mybatis基础实现
- 编写MyBatis配置文件applicationContext-mapper.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">
<!-- development为开发模式 -->
<configuration>
<environments default="development">
<!-- 每个 environment 元素定义的环境 ID -->
<environment id="development">
<!-- 事务管理器JDBC -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/shop" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/redfield/mapper/UserMapper.xml" />
</mappers>
</configuration>
- 创建映射文件com.redfield.mapper包,并在其中创建UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.redfield.mapper.UserMapper">
<select id="selectAllUsers" resultType="com.redfield.pojo.User">
select * from user;
</select>
<insert id="insertOneUser" parameterType="com.redfield.pojo.User">
insert into
user(id,username,password,role,desci)
values(#{id},#{username},#{password},#{role},#{desci})
</insert>
</mapper>
①namespace:指定唯一的命名空间;
②select 标签:用于配置查询操作的信息;
③insert 标签:用于配置添加操作的信息;
④id:代表元素在映射文件中的唯一标识;
⑤resultType:返回值类型;
⑥parameterType:传递的参数的类型;
⑦#{xxx} xxx代表User对象类型的属性;
-
测试类编写Test01.java
①查询功能实现
public static void main(String[] args) { //加载配置文件 applicationContext-mapper.xml InputStream is = Test01.class.getClassLoader().getResourceAsStream("applicationContext-mapper.xml"); //构建 SqlSessionFactory SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); //构建SqlSession SqlSession session = sessionFactory.openSession(); //执行查询操作,并用List集合接收 List<User> list = session.selectList("com.redfield.mapper.UserMapper.selectAllUsers"); for (User user : list) { System.out.println(user); //输出 } }
②控制台输出
③添加功能实现User user = new User(); //创建User对象 user.setId(1003); //添加属性 user.setUsername("SmallGreen"); user.setPassword("lili"); user.setRole("admin"); user.setDesci("绿绿绿"); int i = session.insert("com.redfield.mapper.UserMapper.insertOneUser", user); System.out.println(i);
④控制台输出
我们可以看到控制台输出了“1”,说明添加操作成功了! 下面来看下数据库中的数据
id | username | password | role | desci |
---|---|---|---|---|
1001 | Redfield | 123 | user | ss |
1002 | Green | 123 | admin | ss |
然而数据并没有添加,这是为什么呢?
原因很简单,是因为我们少了一条提交语句
//提交事务
session.commit();
//关闭SqlSession
session.close();
这样过后我们再查询数据库就会发现有数据了
id | username | password | role | desci |
---|---|---|---|---|
1001 | Redfield | 123 | user | ss |
1002 | Green | 123 | admin | ss |
1003 | SmallGreen | lili | admin | 绿绿绿 |
这样我们简单的MyBatis的程序就执行完成了~~~~~