MyBatis是一个优秀的持久层框架,前身是ibatis。
JDBC->Dbutis(QueryRunner)->jdbcTemplate:工具 框架:整体解决方案
1 功能简单:sql语句编写在Java代码里面:硬编码高耦合的方式
Hibernate:全自动全映射ORM(Object Relation Mapping)框架:旨在消除sql
百分之百的项目都要优化sql,Hibernate用起来舒服,但是会加重学习负担。hibernate是黑箱操作。
希望:sql语句交给我们开发人员编写,希望sql不失去灵活性。
sql与java编码分离:sql是开发人员控制。只需要掌握好sql。
MyBatis:半自动,轻量级的框架,有些东西在配置文件中实现
mybatis转移到github中了。
sql中语句
create table tbl_employee( id int(11) primary key auto_increment, last_name varchar(255), gender char(1), email varchar(255) );
把接口和xml文件进行动态绑定,那么不用实现类也能执行sql,接口的调用getClass()输出的是
class com.sun.proxy.$Proxy4
代理对象
mybatis为接口创建了一个代理对象。
引入dtd约束
将数据源写在配置文件中
<properties resource="dbconfig.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <mappers> <mapper resource="EmployeeMapper.xml" /> </mappers>
dbconfig.properties中
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=
在和spring的整合过程中,这些都会放在bean中,properties标签基本上不会用到了。
这样设置以后,实体类中lastName和数据库中字段名为last_name不一样也可以进行非null输出
<settings> <setting name="mapUnderscoreToCamelCase" value="true"></setting> </settings>
Mybatis四大对象:executor,statementHandler,parameterHandler和resultHandler对象。
hibernate支持数据库产商,不需要写数据库语句。而mybatis是需要写数据库语句的。
数据库操作
try{ EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); //测试添加 /*Employee employee = new Employee(null,"jerry","jerry@atguigu.com","1"); mapper.addEmp(employee);*/ //测试修改 /*Employee employee = new Employee(1,"jerry","jerry@atguigu.com","0"); mapper.updateEmp(employee);*/ //测试删除 mapper.deleteEmpById(2); //2、手动提交数据 openSession.commit(); }finally{ openSession.close(); }
sql语句
insert into employees(employee_id,last_name,email,gender)values(1,'xiao','xiao@163.com',1); select * from employees;
单个参数:mybatis不会做特殊处理,
#{参数名}:取出参数值。
一个参数而言,对Mybatis来说,#{}里面写什么都是没关系的。
多个参数:mybatis会做特殊处理
多个参数会被封装成一个map,
key:param1...paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值
异常:
org.apache.ibatis.binding.BindingException:
Parameter 'id' not found.
Available parameters are [0, 1, param1, param2]
操作:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}
但是上面的方法不太方便。