底层是对JDBC的封装
使用 mybatis 时不需要编写实现类,只需要写需要执行的sql命令
文件作用: 编写需要执行的 SQL 命令
把 xml 文件理解成实现类.
InputStream is = Resources.getResourceAsStream("myabtis.xml");
//使用工厂设计模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//生产 SqlSession
SqlSession session=factory.openSession();
//a.b为命名空间
List list = session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
session.close();
相对路径:从当前资源出发找到其他资源的过程
绝对路径:从根目录(服务器根目录或项目根目录)出发找到其他资源的过程
注意:只要以/开头的都是绝对路径
使用绝对路径,可以防止上面的问题.
作用:不仅能把内容输出到控制台,还能把内容输出到文件中.便于观察结果.
log4j.appender.LOGFILE.File 文件位置及名称(日
志文件扩展名.log)
log4j关联mapper的namespace
log4j.rootCategory=DEBUG, CONSOLE ,LOGFILE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppend
er
log4j.appender.CONSOLE.layout=org.apache.log4j.Patter
nLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %d{
YYYY-MM-dd hh:mm:ss} %m %n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D://logs/my.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.Patter
nLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n
People p = session.selectOne("a.b.selById",1);
System.out.println(p);
在 Mapper.xml 中可以通过#{}获取参数,使用索引,从 0 开始 #{0}表示第一个参数
#{} 获取参数的内容支持 索引获取,param1 获取指定位置参数, 并且 SQL 使用?占位符。
示例
mapper.xml
mtbatis.xml
mapper.xml
1.1 功能:从应用程序角度出发,软件具有哪些功能.
1.2 业务:完成功能时的逻辑.对应 Service 中一个方法
1.3 事务:从数据库角度出发,完成业务时需要执行的 SQL 集合,统称一个事务.
事务回滚.如果在一个事务中某个 SQL 执行事务,希望回
归到事务的原点,保证数据库数据的完整性.
在 mybatis 中默认是关闭了 JDBC 的自动提交功能
2.1 每一个 SqlSession 默认都是不自动提交事务.
2.2 session.commit()提交事务.
2.3 openSession(true);自动提交.setAutoCommit(true);
mybatis 底层是对 JDBC 的封装.
3.1 JDBC 中 executeUpdate()执行新增,删除,修改的 SQL.返回值 int, 表示受影响的行数.
3.2 mybatis 中 标签没有 resultType 属性, 认为返回值都是 int
如果出现异常,应该 session.rollback()回滚事务
insert into people values(default,#{name},#{age})
int index1 = session.insert("a.b.ins", p);
if(index1>0){
System.out.println("成功");
session.commit();
} else{
System.out.println("失败");
session.rollback();
}
update people set name = #{name} where id = #{id}
delete from people where id = #{0}
实现创建一个接口后把mapper.xml由mybatis 生成接口的实现类,通过调用接口对象就可以获取 mapper.xml 中编写的 sql。
在 mybatis.xml 中下使用
在 mapper 下新建接口
public interface LogMapper {
List selAll();
}
在mapper 新建一个 xxxMapper.xml
在接口中声明方法
List selByAccInAccout(String accin,String accout);
在mapper.xml中添加
/**
* mybatis 把参数转换为 map 了,其中@Param("key") 参数内
容就是 map 的 value
* @param accin123
* @param accout3454235
* @return
*/
List selByAccInAccout(@Param("accin") String accin123,@Param("accout") String accout3454235);
mapper.xml文件
比直接使用少写 where 1=1
实例
update log
id=#{id},
accin=#{accIn},
accout=#{accOut},
where accin=#{accIn}
1.查询关联对象(1对1)
在 Student 实现类中包含了一个 Teacher 对象
public class Student {
private int id;
private String name;
private int age;
private int tid;
private Teacher teacher;
在 TeacherMapper 中提供一个查询
在StudentMapper中
简化方式
N+1 时,如果列名和属性名相同可以不配置
2.查询关联对象(1对多)
TeacherMapper
mybatis 可以通过主键判断对象是否被加载过
@Select("select * from teacher")
List selAll();
@Insert("insert into teacher values(default,#{name})")
int insTeacher(Teacher teacher);
@Update("update teacher set name=#{name} where id=#{id}")
int updTeacher(Teacher teacher);
@Delete("delete from teacher where id=#{0}")
int delById(int id);