1、MyBatis是一个基于Java的持久层框架,而持久化是指数据从瞬时状态变为持久状态,持久层是完成持久化工作的代码块-Dao层。即,MyBatis帮助开发人员将数据存入数据库中和从数据库中取数据。通过框架可以减少重复代码,提高开发效率。MyBatis是一个半自动化的ORM框架。
2、MyBatis使用
>导包:
核心包:mybatis-3.2.7.jar
依赖包:
数据库驱动包:
>编写MyBatis的核心配置文件
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
>创建sqlSessionFactory
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
/*
* 通过配置文件 创建SqlSessionFactory 是一个SqlSession的工厂类
*/
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis.cfg.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
/*
* SqlSession通过映射执行sql语句( 通过id找到对应的sql语句,执行sql语句)
*/
public static SqlSession getSession() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
return sqlSessionFactory.openSession();
}
}
>创建实体类
package com.myBatis.entity;
public class Tea {
private int id ; //饮品编号
private String gname ; //饮品名称
private double gprice ; //饮品价格
public Tea() {}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public double getGprice() {
return gprice;
}
public void setGprice(double gprice) {
this.gprice = gprice;
}
public Tea(int id, String gname, double gprice) {
super();
this.id = id;
this.gname = gname;
this.gprice = gprice;
}
@Override
public String toString() {
return "TeaBean [id=" + id + ", gname=" + gname + ", gprice=" + gprice + "]";
}
}
>编写sql语句的映射文件
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
>测试类
package com.myBatis.test;
import java.io.IOException;
import org.apache.ibatis.session.SqlSession;
import com.myBatis.entity.Tea;
import com.myBatis.util.MyBatisUtil;
public class Test {
public static void main(String[] args) throws IOException {
SqlSession session = MyBatisUtil.getSession() ;
Tea tea = session.selectOne("com.myBatis.entity.TeaMapper.selectTea",27) ;
System.out.println(tea.getGname());
session.close();
}
}
3、解决实体类中属性名(password)与数据库列名( pwd)不一致的问题
不一致出现的问题:不一致的属性查询的内容为null
不一致的原因在于:mabatis会根据查询的列名调用其setter方法进行设值(在mapper映射文件中定义)
解决办法一:为列名指定别名,别名和java实体类的属性名一致
解决方法:
4、分页的实现
>limit约束实现
mapper映射中定义:
Dao层方法:
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.myBatis.entity.Tea;
import com.myBatis.util.MyBatisUtil;
public class TeaDao {
//分页查询
public List
SqlSession session = MyBatisUtil.getSession() ;
Map
map.put("startIndex",(currentPage-1)*pageSize); //当前页第一条记录的下标
map.put("pageSize", pageSize);
List
session.close();
return list;
}
}
>通过RowBounds实现
在mapper映射中直接查询所有:
在Dao层方法中通过RowBounds实现查询指定条数的分页数据:
//参数index是下标,size是数据
RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);
List
5、使用注解(本质通过接口)开发映射mapper语句
//编写Dao接口
public interface UserDao {
@Select("select * from user")
public List
@Insert("insert into user(name,pwd) value(#{name},#{pwd})")
public int insert(User user);
}
//mapper映射
//调用
UserDao userDao = session.getMapper(UserDao.class);
//调用userDao中方法……
会通过动态代理生成该接口的实现类,在测试类调用接口中定义的方法时,其实是调用其实现类中的方法
6、数据库表多对一处理
————————————————————————————————————————————————————————
select * from teacher where id=#{id}
7、表中一对多处理
————————————————————————————————————————————————————————
8、动态sql
动态sql指根据不同的查询条件,生成不同的sql语句
Mapper文件
注:mybatis中like查询要使用CONCAT字符连接