节数 |
知识点 |
要求 |
第一节(封装MyBatis工具类) |
工厂对象只需要一个, 借助静态代码块 |
了解 |
第二节(MyBatis中带条件的查询) |
#{}占位符 |
掌握 |
#{}支持三种方式参数的传递 |
掌握 |
|
${}拼接符 |
掌握 |
|
${}尽量使用两种方式传参:map,对象 |
掌握 |
|
第三节(MyBatis中的CUD操作) |
事务管理 |
掌握 |
cud操作的实现 |
掌握 |
|
分析源码, update |
掌握 |
|
第四节(类型别名配置) |
内建别名 |
掌握 |
自己配置类型别名 |
掌握 |
|
<typeALias>, |
了解 |
package com.bjsxt.util;
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.InputStream;
public class MyBatisUtil {
// 声明工厂对象
private static SqlSessionFactory factory;
// 通过静态代码块对工厂进行初始化, 只初始化一次
static {
try {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("工厂无法初始化...");
}
}
/**
* 获取SqlSession对象
*
* @return
*/
public static SqlSession getSession() {
return factory.openSession();
}
}
2. MyBatis中带条件的查询
在MyBatis中, 提供了一些方法可以接收执行SQL语句时的参数. 但是, 不同形式的传参获取方式不同. 获取方式有两种:
类似于jdbc中通过PreparedStatement进行操作的方式, 会将sql语句中需要参数的位置使用?进行占位, 后续由传进来的参数进行参 数的绑定. 当使用#{}接收参数时, 参数传递的方式有三种:
简单类型指的是: 基本数据类型, 包装类型, String, java.sql.*
当参数是简单类型时, MyBatis会忽略SQL语句中参数的个数和占位符的名称, 然后将参数进行自动绑定. parameterType属性可以定义参数的类型, 如果定义, 传参时要求参数类型必须和指定的类型一致, 否则抛出ClassCastException.
@Test
public void test1() {
SqlSession session = MyBatisUtil.getSession();
User user = session.selectOne("selById", "2");
System.out.println(user);
session.close();
}
Map是KV结构, 可以通过key定位value.
当参数是Map集合时, SQL语句中的#{}里应该写Map集合的key值, MyBatis会通过key只找到value然后进行参数绑定. 如果key不存在, 不会报错, 会使用null进行参数绑定.
@Test
public void testLogin() {
SqlSession session = MyBatisUtil.getSession();
Map params = new HashMap<>();
params.put("username", "zhangsan");
params.put("password", "123");
User user = session.selectOne("sel4Login", params);
System.out.println(user);
session.close();
}
除了简单类型和Map类型以外的其他类型.
当参数是对象类型时, SQL语句中的#{}里应该写对象的getter方法对应的属性名. 当getter不存在时, 抛出异常:
@Test
public void testLogin2() {
SqlSession session = MyBatisUtil.getSession();
User params = new User();
params.setUsername("lisi");
params.setPassword("123");
User user = session.selectOne("sel4Login", params);
System.out.println(user);
session.close();
}
类似于jdbc中通过Statement进行操作的方式, 会直接将传递的参数和SQL语句进行字符串的拼接. 一般当SQL语句结构不确定时使用.
@Test
public void testSel2() {
SqlSession session = MyBatisUtil.getSession();
Map params = new HashMap<>();
params.put("tableName", "tb_user");
params.put("columnName", "age");
params.put("columnValue", 18);
params.put("order", "birthday desc");
List list = session.selectList("sel2", params);
System.out.println(list);
session.close();
}
3.MyBatis实现增删改(CUD)操作
CUD操作会破坏数据库中原有的数据, 所以必须进行事务管理. 事务的四大特性: ACID(原子性, 一致性, 隔离性, 持久性).
JDBC中, 通过Connection对象对事务进行管理:
MyBatis中, 事务管理通过SqlSession对象进行.
insert into tb_user values (default, #{username}, #{password}, #{realname}, #{age}, #{birthday}, #{regTime})
@Test
public void testAdd() {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setUsername("zhaomin");
user.setPassword("123");
user.setRealname("赵敏");
user.setAge(20);
user.setRegTime(new Date());
try {
session.insert("insUser", user);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
session.close();
}
2.修改
update tb_user set age=#{age} where id=#{id}
@Test
public void testUpd() {
SqlSession session = MyBatisUtil.getSession();
Map map = new HashMap<>();
map.put("age", 25);
map.put("id", 6);
try {
session.update("updUser", map);
session.commit();
} catch (Exception e) {
session.rollback();
e.printStackTrace();
}
session.close();
}
3.删除
delete from tb_user where id=#{id}
@Test
public void testDel() {
SqlSession session = MyBatisUtil.getSession();
try {
session.delete("delUser", 5);
session.commit();
} catch (Exception e) {
session.rollback();
e.printStackTrace();
}
session.close();
}
4.别名设置
5.密码加密
package com.bjsxt.util;
import java.security.MessageDigest;
public class Md5Util {
/**
* 接收一个明文密码, 返回加密以后的密文
*
* @param pwd
* @return
*/
public static String md5(String pwd) throws Exception {
// 创建MessageDigest对象
MessageDigest digest = MessageDigest.getInstance("MD5");
// 对明文进行加密
byte[] temp = digest.digest(pwd.getBytes());
// 准备StringBuilder用于保存结果
StringBuilder builder = new StringBuilder();
// 遍历字节数组, 一个字节转换为长度为2的字符串
for (byte b : temp) {
// 去除负数
String s = Integer.toHexString(b & 0xff);
// 补零
if(s.length() == 1) {
builder.append(0);
}
builder.append(s);
}
return builder.toString();
}
}