目录
使用mybatis进行简单的查询案例:
使用Mybatis完成CRUD:
增加用户:
1.增加用户需要注意的是如果需要返回增加的id有2种方式(没有写顶部代码了复制上面即可,放入关键代码)
2.主键不一定是int类型... 主键也可以是字符串类型。有数据库合并,数据库集群的时候。
删除用户:
修改用户:需要先根据id查用户在进行修改
查询用户:
思维导图:
首先知道什么是框架:
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。简单来说框架是软件的半成品. 我们开发者使用框架开发, 更加的简单, 提高开发效率。
了解什么是MyBatis:
官方介绍是:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。简单来说就是:持久层的一个框架, 封装了JDBC. 操作数据库。官网: mybatis – MyBatis 3 | Introduction
准备环境:
数据库:
CREATE TABLE user(
uid int PRIMARY KEY auto_increment,
username varchar(40),
sex varchar(10),
birthday date,
address varchar(40)
);
INSERT INTO `user` VALUES (null, 'zs', '男', '2021-09-08', '北京');
INSERT INTO `user` VALUES (null, 'ls', '女', '2021-09-30', '深圳');
INSERT INTO `user` VALUES (null, 'ww', '男', '2021-09-08', '上海');
创建用的Maven
idea:2020.1.3版本
jdk用的1.8版本
创建Maven工程(java), 添加mybatis的依赖坐标
创建pojo (javabean)
创建UserDao接口
创建UserDao映射文件 (xml配置文件)
创建MyBatis核心配置文件SqlMapConfig.xml (xml配置文件)
编写java代码测试
1.添加依赖
junit
junit
4.12
test
org.mybatis
mybatis
3.4.6
mysql
mysql-connector-java
5.1.47
org.projectlombok
lombok
1.18.18
2.创建pojo (javabean)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private int uid;
private String username;
private String sex;
private Date birthday;
private String address;
}
3.创建UserDao接口
public interface UserDao {
/**
* 查询所有用户
* @return
*/
List FindAll();
}
4.创建UserDao映射文件 (xml配置文件)
注意:这里需要用斜杠不能像包一样用 . (点) 。
5.创建MyBatis核心配置文件SqlMapConfig.xml (xml配置文件)(引入的Dao接口的映射文件需要写全路径),并且内部的核心配置文件的顺序不可乱放,深入了解可以百度或者走官方查看。
其中4步骤和5步骤的代码最上开头部分不用记知道有这个就行,可以去官网复制或者其他地方或者下面复制,但要把MyBatis核心配置文件和Dao的映射文件开头那区分开来不是一样的
标签:environments : 用于配置环境,它里面可以定义多个环境,使用 environment来定义
到底是用哪一个环境,取决于 default属性写的是哪个 environment的id值
environment : 用于定义环境,
id :声明一个标识,唯一标识
transactionManager : 事务管理员
dataSource :用不用连接池 用:POOLED,不用UNPOOLED, 还有一个值是:JNDI MyBatis 会从 JNDI 服务上(tomcat ... jboss...)查找 DataSource 实例,然后返回使用. 只有在web项目里面才有的,用的是服务器里面的. 默认会使用tomcat里面的dbcp
注意:Dao接口和Dao映射文件的地方和名字要一样。核心配置文件需要放置在resources下
7.编写java代码测试(格式建议可以用上图那样简单明了)
需要注意:图上单元测试说的,在Maven工程下或环境下他会认为你的测试类名要有test单词,所以一般建议用testxxx这样,简单明了而且不用写注释就知道,不然会出现单元测试时候运行了不打印的情况。(在导mybatis的包时候是也就是Resources的时候是:org.apache.ibatis.io,因为早期apache公司创建mybatis时用的ibatis名字后来才改的mybatis,只不过后来没改包名字一直用的ibatis)
import com.demon.bean.User;
import com.demon.dao.UserDao;
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 TestUserDao {
//查询所有用户
@Test
public void testFindAll() throws IOException {
//1.读取核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建构建器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建器创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = builder.build(is);
//4.问工厂要SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//5.问SqlSession对象要UserDao的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//6.直接调用方法
List list = userDao.FindAll();
for(User user:list){
System.out.println(user);
}
//7.关闭sqlSession
sqlSession.close();
}
}
打印结果:
注意:打印的那出现那么多红的是正常的,因为我用了打印出日志的依赖。
数据库:
--------------------------------------------------------------------------------------------------------------------------------
在上面发现单元测试类中出现了一部分代码可封装,所以SqlSessionFactory工具类的抽取。
注意:工具类的提交事务,提交事务: mybatis没有默认提交事务 ,它把setAutoCommit(false), 所以对于增删改操作,要记得提交事务。
但可以在内部修改成默认的提交事务。也就是:sqlSessionFactory.openSession(true);自动提交事务。反之false
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 java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory =null;
//使用静态代码块是为了使得工厂只有一个
static {
try {
//读取核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建构建器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//使用构建器创建SqlSessionFactory工厂
sqlSessionFactory = builder.build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获得SqlSession对象
* @return
*/
public static SqlSession getsqlSession(){
//问工厂要SqlSession对象,
//openSession(true)手动修改为自动提交事务。false为不自动
return sqlSessionFactory.openSession();
}
/**
*关闭sqlSession提交事务
* @param sqlSession
*/
public static void commit(SqlSession sqlSession){
sqlSession.commit();
sqlSession.close();
}
/**
*关闭sqlSession
* @param sqlSession
*/
public static void close(SqlSession sqlSession){
sqlSession.close();
}
}
UserDao接口:
/**
* 添加用户
* @param user
* @return 受影响的行数
*/
int AddUser(User user);
UserDao.xml(Dao接口的映射文件):
INSERT INTO user VALUES(null , #{username} , #{sex} , #{birthday} , #{address})
单元测试:
//添加一个用户
@Test
public void testAddUser() throws IOException {
SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();
//问SqlSession对象要UserDao的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//直接调用方法
User user = new User();
user.setUsername("zs1");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("深圳");
userDao.AddUser(user);
//关闭sqlsession和提交事务
SqlSessionFactoryUtils.commit(sqlSession);
}
1.1用SelectKey标签添加
INSERT INTO t_user VALUES(null , #{username} , #{sex} , #{birthday} , #{address})
SELECT LAST_INSERT_ID()
1.2.用属性配置
INSERT INTO t_user VALUES(null , #{username} , #{sex} , #{birthday} , #{address})
字符串类型的主键通常就是UUID生成的一串32个字符的字符串。 数据库合并!
INSERT INTO t_user VALUES(null , #{username} , #{sex} , #{birthday} , #{address})
select uuid()
UserDao接口:
/**
* 删除一个用户
* @param id
* @return
*/
int deleteUser(int id);
UserDao.xml(Dao接口的映射文件):
delete from user where uid=#{uid}
单元测试:
//删除一个用户
@Test
public void testdeleteUser() throws IOException {
SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();
//5.问SqlSession对象要UserDao的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//6.直接调用方法
userDao.deleteUser(4);
//关闭sqlsession和提交事务
SqlSessionFactoryUtils.commit(sqlSession);
}
UserDao接口:
public interface UserDao {
/**
* 查询一条用户
* @return 受影响的行数
*/
User FindUser(int uid);
/**
* 修改用户
* @param user
* @return
*/
int updateUser(User user);
}
UserDao.xml(Dao接口的映射文件):
update user set username=#{username} , sex=#{sex} , birthday=#{birthday} , address=#{address} where uid=#{uid}
单元测试:记得一定要提交事务否则数据库不会更改信息
public class TestUserDao {
//修改用户
@Test
public void testupdateUser() throws IOException {
SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
//直接调用方法
User user = userDao.FindUser(1);
user.setUsername("王五");
int i = userDao.updateUser(user);
System.out.println(i);
//关闭sqlsession和提交事务
SqlSessionFactoryUtils.commit(sqlSession);
}
}
有以下的情况:
1.查询一条语句(参数为:id,name......)
1.1.参数一个(#{}和${}区别在查询代码后面)
1.1.1#{}
1.1.2${}
1.2参数为多个
1.3参数为多个且类型不同(注意:可以不给parameterType赋值)
UserDao接口:
/**
* 查询一条用户
* @return 受影响的行数
*/
//普通查询一条语句
//id查询
User FindUser(int uid);
//字符串查询
User FindUser7(String user)
;
//用mybatis自带的@Param注解取别名
User FindUser5(@Param("username") String username,@Param("sex") String sex);
UserDao.xml(Dao接口的映射文件):
单元测试:(把方法名改了就可验证)
//模糊查询
@Test
public void testFindUser1() throws IOException {
SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();
//5.问SqlSession对象要UserDao的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//6.直接调用方法
List list = userDao.FindUser3("a");
System.out.println(list);
//7.关闭sqlSession
SqlSessionFactoryUtils.close(sqlSession);
}
注意: #{}和${}区别
#{}
表示一个占位符号
通过#{}
可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 数据库 类型转换
#{}
可以有效防止 sql 注入
#{}
可以接收简单类型值或 pojo 属性值
如果 parameterType 传输单个简单类型值(String,基本类型), #{}
括号中可以是 value 或其它名称。
${}
表示拼接 sql 串
通过${}
可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换.
${}
不能防止 sql 注入
${}
可以接收简单类型值或 pojo 属性值
如果 parameterType 传输单个简单类型值.${}
括号中只能是 value
=====以上就是小白的我对于mybatis的一个入门的理解,如果有错希望能帮我指出。QAQ=====
下面也是我用xmind做的一个