MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理注册驱动、创建Connection、创建Statement、手动设置参数、结果集检索及映射等繁杂的过程代码。
注:lib包需解压
db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm_db1 jdbc.username=root jdbc.password=123456
SqlMapConfig.xml
创建domain包,定义Javabean
定义mapper包,创建接口
查询所有
测试类
public class Test01_SelectAll {
public static void main(String[] args) throws IOException {
//1 加载配置文件
InputStream is= Resources.getResourceAsStream("SqlMapConfig.xml");
//2 获得工厂
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//3 通过工厂获得会话(连接)
SqlSession sqlSession=factory.openSession();
//4 获得功能接口
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//4 调用功能
List userList = userMapper.selectAll();
//5 打印查询结果
for (User user : userList) {
System.out.println(user);
}
}
}
UserMapper代码
@Select("select * from user")
public List selectAll();
添加
测试类
public class Test03_Insert {
public static void main(String[] args) throws IOException {
// 模拟数据
User user = new User();
user.setUid("u004");
user.setUsername("111");
user.setPassword("fanlonggege");
//1 加载配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2 获得工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 通过工厂获得会话
SqlSession sqlSession = factory.openSession();
//4 通过会话获得功能接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//5 添加
Integer result = userMapper.insert(user);
// 提交
sqlSession.commit();
//6 处理数据
System.out.println(result);
//7 释放资源
sqlSession.close();
}
}
UserMapper代码
@Insert("INSERT INTO `user`(uid,username,`password`) VALUES(#{uid},#{username},#{password})")
public Integer insert(User user);
模糊查询
测试类
public class Test02_Like {
public static void main(String[] args) throws IOException {
//1 加载配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2 获得工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 通过工厂获得会话
SqlSession sqlSession = factory.openSession();
//4 通过会话获得功能接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//5 查询
List list = userMapper.selectByName("三");
//6 处理数据
for (User user : list) {
System.out.println(user);
}
//7 释放资源
sqlSession.close();
}
}
UserMapper代码
@Select("SELECT * FROM `user` WHERe `name` LIKE '%${name}%'")
public List selectByName(@Param("name") String name);
更新
测试类
public class Test04_Update {
public static void main(String[] args) throws IOException {
// 模拟数据
User user = new User();
user.setUid("u004");
user.setUsername("利古拉斯");
user.setPassword("123456");
user.setName("789");
//1 加载配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2 获得工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 通过工厂获得会话
SqlSession sqlSession = factory.openSession();
//4 通过会话获得功能接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//5 添加
Integer result = userMapper.update(user);
// 提交
sqlSession.commit();
//6 处理数据
System.out.println(result);
//7 释放资源
sqlSession.close();
}
}
UserMapper代码
@Update("UPDATE `user` SET username=#{username},`password`=#{password}, `name`=#{name} WHERe uid = #{uid};")
public Integer update(User user);
核心配置文件详解:
properties 用于抽取经常修改的内容
方式1:直接抽取
方式2:将进行修改的内容抽取到properties文件中
开启驼峰映射
加载一个类
加载一个包
API详解
导入MybatisUtils
public class MyBatisUtils {
// 会话工厂
private static SqlSessionFactory factory;
static{
try {
// 1.1 加载核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 获得工厂
factory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static ThreadLocal local = new ThreadLocal<>();
private static SqlSession openSession(){
SqlSession sqlSession = local.get();
if(sqlSession == null){
sqlSession = factory.openSession();
local.set(sqlSession);
}
return sqlSession;
}
public static T getMapper(Class clazz){
return openSession().getMapper(clazz);
}
public static void close() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.close();
}
}
public static void commitAndclose() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.commit();
close();
}
}
public static void rollbackAndclose() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.rollback();
close();
}
}
}
编写Vo,条件查询封装类
public class UserVo {
private String beginTime;
private String endTime;
//get set方法
编写功能接口
@Select("SELECT * FROM `user` WHERe birthday >= #{beginTime} AND birthday <= #{endTime}")
public List condition(UserVo userVo);
测试
public static void main(String[] args) throws IOException {
//1 通过会话获得功能接口
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
//2 更新
UserVo userVo = new UserVo();
userVo.setBeginTime("2010");
userVo.setEndTime("2020");
List list = userMapper.condition(userVo);
// 打印结果
list.forEach(System.out::println);
//3 提交并关闭
MyBatisUtils.commitAndclose();
}
输出:结果集映射
- 结果集映射:查询结果 与 JavaBean之间的映射关系。表的列名和JavaBean的属性名对应关系。
- @Results 用于配置JavaBean和表的映射关系的
- @Result 配置JavaBean一个属性和 表的一个列之间对应关系。
- @ResultMap 共享已经映射关系
- 实例1:JavaBean和表映射关系
@Select("select * from user")
@Results({
@Result(column = "user_name",property = "userName"),
@Result(column = "password", property = "password")
})
public List selectAll();
实例2:共享映射关系
@Select("SELECT * FROM `user` WHERe `name` LIKE '%${name}%'")
@ResultMap("userResultMap")
public List selectByName(@Param("name") String name);
多表操作:一对多
JavaBean:User
public class User {
private String uid;
private String userName;
private String password;
private String name;
private String email;
private Date birthday;
private String sex;
private Integer state;
private String code;
JavaBean:Order
public class Order {
private String oid; // 订单编号
private Date ordertime; // 下单时间
private Double total; // 订单总金额
private Integer state; // 订单状态 0 未支付 1 已支付 2已发货 3已收货
private String address; // 收货人地址
private String name; // 收货人姓名
private String telephone; // 收货人电话
private String uid;
对应关系
public class User {
// 一对多关系:一个用户拥有多个订单
private List orderList = new ArrayList<>()
UserMapper
public interface UserMapper {
@Select("select * from user")
@Results(id="userResultMap", value={
@Result(column = "user_name",property = "userName"),
@Result(column = "password", property = "password")
})
public List selectAll();
}
OrderMapper
查询指定用户的所有的订单
public interface OrderMapper {
@Select("SELECT * FROM orders WHERe uid = #{uid}")
public List selectAllByUid(@Param("uid") String uid);
}
user测试
public class Test01_SelectAll {
public static void main(String[] args) throws IOException {
//1 加载配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2 获得工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 通过工程获得会话(连接)
SqlSession sqlSession = factory.openSession();
//4 获得功能接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//5 进行查询
List list = userMapper.selectAll();
//6 处理数据
for(User user: list) {
System.out.println(user);
}
//7 释放资源
sqlSession.close();
}
}
order测试
public class Test02_SelectAllOrderByUId {
public static void main(String[] args) throws IOException {
//1 加载配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2 获得工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 通过工程获得会话(连接)
SqlSession sqlSession = factory.openSession();
//4 获得功能接口
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
//5 进行查询
List list = orderMapper.selectAllByUid("u001");
//6 处理数据
list.forEach(System.out::println);
//7 释放资源
sqlSession.close();
}
}



