MyBatis的使用流程
1. 加载MyBatis核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
2. 构建SqlSessionFactory工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
3. 通过工厂打开SqlSession
SqlSession session = factory.openSession();
4. 通过session执行查询操作
List<User> list = session.selectList("top.byfree.mapper.UserMapper.selAll");
使用了3个常用的查询方法中的一个,详情见mybatis01中的3个常用的查询方法
5. 关闭资源
session.close();
带参数的查询
Mapper中的配置
单个参数
<select id="selByName" resultType="user" parameterType="string">
select * from user where name=#{0}
</select>
paramenterType属性:写的是参数的类型,本来是要写全限定路径的,但是mybatis提供了基础类型的别名
别名表
SQL语句中的占位符
使用#{}使用参数:
index 从0开始
param+数字 param1 param2 从1开始
**注意:**如果只有一个参数{}内写什么都可以访问的到,但是不建议这么做因为代码阅读性不好
多个参数
<select id="sel" resultType="user" parameterType="user">
select * from user where name=#{name} and password=#{password}
</select>
**paramenterType属性:**多参数一般是传入一个实体类或者是map集合
注意:即使传入的是一个map集合我们写实体类名仍然不会报错,前提是map键名和实体类的属性名对应。
SQL语句中的占位符
使用#{键名或者实体类属性名}
多参数查询使用流程
// 前四步的链式简写
SqlSession session = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis.xml"))
.openSession();
// 传入的user对象
User u = new User();
u.setName("jelly");
u.setPassword("123");
// 或者传入一个map集合
Map<String, String> map = new HashMap<>();
map.put("name", "jelly");
map.put("password", "123");
User user = session.selectOne("top.byfree.mapper.UserMapper.sel", user or map);
System.out.println(user);
session.close();
多参数的使用方式很简单,将多个参数封装成一个实体类或者map对象传入即可,具体见上代码。
增删改(DML)操作
事务(Transaction)
事务是数据库操作的最小单元
一个事务的SQL语句要么同时成功要么都不成功
MyBatis中配置了事务管理器,type属性设置位JDBC,表示MyBatis采用和原生JDBC相同的事务管理机制
在MyBatis执行开始的时候,将自动提交功能关闭了,所以,在执行DML操作的时候要手动提交事务
使用SqlSession对象下的commit方法可以提交事务
而rollback方法用于回滚事务
设置事务的自动提交
在创建SqlSession对象的时候会使用openSession方法,此方法会传入一个boolean类型的参数,用于决定session对象是否自动提交事务
false(默认):不会自动提交事务,需要我们手动提交,建议使用,因为自动提交会发生意料之外的错误
treu:mybatis会自动提交事务
封装MyBatisUitl工具类
因为在使用mybatis的时候步骤有很多冗余,故而可以将其封装成一个工具类,简化操作
private static SqlSessionFactory factory = null;
static {
InputStream is = null;
try {
is = Resources.getResourceAsStream("mybatis.xml");
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(is);
}
public static SqlSession getSession () {
SqlSession session = null;
if (factory != null) {
// openSession 默认参数false关闭自动提交事务
// 写true是开启自动提交事务
session = factory.openSession();
}
return session;
}
增加(插入)操作(insert)
配置文件
<insert id="insUser" parameterType="user">
insert into user(name, password, invitationcode, Telephone) values (#{name}, #{password}, #{invitationcode}, #{Telephone})
</insert>
#{}的使用与上讲述的查询中的无异
使用
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setName("小新");
user.setPassword("jkl");
user.setInvitationcode("jojo");
user.setTelephone("1231564");
int num = session.insert("top.byfree.mapper.UserMapper.insUser", user);
if (num > 0) {
// 提交事务
session.commit();
System.out.println("成功");
} else {
session.rollback();
System.out.println("失败");
}
使用了封装的MyBatisUtil工具类,具体看上工具类封装代码
session.commit()方法用于提交事务
session.rollback()用于回滚事务
session.insert()方法返回的是一个int类型的数字,用于表示变更了数据库中的多少条数据,可以借此判别操作成功或失败
修改操作(update)
配置文件
<update id="upd" parameterType="user">
update user set password = #{password} where name=#{name}
</update>
同上#{}使用方式一样
使用
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setName("jelly");
user.setPassword("456");
int num = session.update("top.byfree.mapper.UserMapper.upd", user);
if (num > 0) {
// 提交事务
System.out.println("成功");
session.commit();
} else {
System.out.println("失败");
session.rollback();
}
session.close();
删除操作(delete)
配置文件
<delete id="del" parameterType="string">
delete from user where name=#{0}
</delete>
使用
SqlSession session = MyBatisUtil.getSession();
int n = session.delete("top.byfree.mapper.UserMapper.del", "jelly");
session.commit();
session.close();
偷懒没写判别成功与否,具体和上述操作一致
小趣味
因为在jdbc底层是没区分insert和update和delete的只有一个update用于修改操作
而mybatis是对jdbc的封装所以可以推想这里的insert和update和delete底层都是用的jdbc的update方法
所以我们这三个方法名可以随便写,结果都没有变化,但是为了便于阅读,还是尽量见名知义,不要搞恶趣味了。
Q.E.D.