Mybatis总结_mybatis总结
Mybatis总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“mybatis总结”。
Mybatis总结
1.mybatis的简单概述: 1.1 mybatis简单概述:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1.2 功能架构: 分为三层:
(1).API接口层:定义api接口,外部人员通过这个接口来调用方法从而操纵数据库。
(2).数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理
等。它主要的目的是根据调用的请求完成一次数据库操作。
(3).基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓
存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数 据处理层提供最基础的支撑。
2.mybatis快速入门: a.添加jar包:
mybatis
asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
log4j-1.2.16.jar
mybatis-3.1.1.jar
slf4j-api-1.6.2.jar
slf4j-log4j12-1.6.2.jar
mysql驱动
mysql-connector-java-5.1.7-bin.jar
b.建库+表:
create database mybatis;
use mybatis;CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
INSERT INTO users(NAME, age)VALUES('Tom', 12);
INSERT INTO users(NAME, age)VALUES('Jack', 11);
c.在应用的src下添加Mybatis的配置文件conf.xml:
d.定义表所对应的实体类:
public cla User {
private int id;
private String name;
private int age;
}
e.定义操作users表的sql映射文件userMapper.xml:
select * from Blog where id = #{id}
f.在conf.xml文件中注册userMapper.xml文件:
g.编写测试代码:执行定义的select语句:
public cla Test {
public static void main(String[] args)throws IOException {
String resource = “conf.xml”;
//加载mybatis的配置文件(它也加载关联的映射文件)
Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSeion的工厂
SqlSeionFactory seionFactory = new SqlSeionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSeion
SqlSeion seion = seionFactory.openSeion();
//映射sql的标识字符串
String statement = “net.lamp.java.mybatis.bean.userMapper”+“.selectUser”;
//执行查询返回一个唯一user对象的sql
User user = seion.selectOne(statement, 1);
System.out.println(user);
}
}
3.编写基于mybatis的操作users表的CRUD操作的dao类: a.XML的实现:
1.定义sql映射xml文件:
insert into users(name, age)values(#{name}, #{age});
delete from users where id=#{id}
update users set name=#{name},age=#{age} where id=#{id}
select * from users where id=#{id}
select * from users
2.在config.xml中注册这个映射文件
3.在dao中调用:
public User getUserById(int id){
SqlSeion seion = seionFactory.openSeion();
User user = seion.selectOne(URI+“.selectUser”, id);
return user;
} b.注解的实现:
1.定义sql映射的接口
public interface UserMapper {
@Insert(“insert into users(name, age)values(#{name}, #{age})”)
public int insertUser(User user);
@Delete(“delete from users where id=#{id}”)
public int deleteUserById(int id);
@Update(“update users set name=#{name},age=#{age} where id=#{id}”)
public int updateUser(User user);
@Select(“select * from users where id=#{id}”)
public User getUserById(int id);
@Select(“select * from users”)
public List getAllUser();
}
2.在config中注册这个映射接口
3.在dao类中调用
public User getUserById(int id){
SqlSeion seion = seionFactory.openSeion();
UserMapper mapper = seion.getMapper(UserMapper.cla);
User user = mapper.getUserById(id);
return user;
}
4.几个可以优化的地方: a.连接数据库的几个配置可以单独放在一个properties文件中
db.properties:
b.为实体类定义别名,简化sql映射xml文件中的引用
c.可以在src下加入log4j的配置文件,打印日志信息(主要是sql语句)
1.log4j.properties
log4j.properties,log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c]-%m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
5.解决表的字段名与实体类的属性名不相同的冲突: a.准备表和数据:
CREATE TABLE orders(order_id INT PRIMARY KEY AUTO_INCREMENT,order_no VARCHAR(20),order_price FLOAT);
INSERT INTO orders(order_no, order_price)VALUES('aaaa', 23);
INSERT INTO orders(order_no, order_price)VALUES('bbbb', 33);
INSERT INTO orders(order_no, order_price)VALUES('cccc', 22);
b.定义实体类:
public cla Order {
private int id;
private String orderNo;
private float price;
}
c.实现getOrderById(id)的查询
定义:
select * from orders where order_id=#{id}
6.实现联表查询: 1).一对一:
a.创建表和数据:
CREATE TABLE teacher(t_id INT PRIMARY KEY AUTO_INCREMENT,t_name VARCHAR(20));
CREATE TABLE cla(c_id INT PRIMARY KEY AUTO_INCREMENT,c_name VARCHAR(20),teacher_id INT);
ALTER TABLE cla ADD CONSTRAINT fk_teacher_id FOREIGN KEY(teacher_id)REFERENCES teacher(t_id);
INSERT INTO teacher(t_name)VALUES('LS1');
INSERT INTO teacher(t_name)VALUES('LS2');
INSERT INTO cla(c_name, teacher_id)VALUES('bj_a', 1);
INSERT INTO cla(c_name, teacher_id)VALUES('bj_b', 2);
b.定义实体类:
public cla Teacher {
private int id;
private String name;
}
public cla Claes {
private int id;
private String name;
private Teacher teacher;
}
c.定义sql映射文件ClaMapper.xml:
resultMap=“ClaesResultMap2”>
select * from cla where c_id=#{id}
select t_id id, t_name name from teacher where t_id=#{id}
方式二:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
--> select * from cla c,teacher t where c.c_id=#{id} and c.teacher_id=t.t_id;
2)一对多
a.创建表和数据:
CREATE TABLE student(s_id INT PRIMARY KEY AUTO_INCREMENT,s_name VARCHAR(20),cla_id INT);
INSERT INTO student(s_name, cla_id)VALUES('xs_B', 1);
INSERT INTO student(s_name, cla_id)VALUES('xs_D', 1);
INSERT INTO student(s_name, cla_id)VALUES('xs_E', 1);
INSERT INTO student(s_name, cla_id)VALUES('xs_A', 2);
INSERT INTO student(s_name, cla_id)VALUES('xs_H', 2);
INSERT INTO student(s_name, cla_id)VALUES('xs_J', 2);
b.定义实体类:
public cla Student {
private int id;
private String name;
}
public cla Claes {
private int id;
private String name;
private Teacher teacher;
private List students;
}
c.定义sql映射文件ClaMapper.xml:(根据claId查询对应的班级信息,包括学生)
select * from cla c,teacher t, student s where c.c_id=#{id} and c.teacher_id=t.t_id and s.cla_id=c.c_id
select * from cla c where c.c_id=#{id}
select t_id id, t_name name from teacher where t_id=#{id}
select s_id id, s_name name from student where cla_id=#{id}