mybatis是什么?有什么特点?
它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低
什么是ORM?
Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应student表,一个Student对象就对应student表中的一行数据
为什么mybatis是半自动的ORM框架?
用mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。用hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作了。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由地对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言(Dialect),所以mybatis的数据库无关性低。虽然mybatis需要手写SQL,但相比JDBC,它提供了输入映射和输出映射,可以很方便地进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提升了开发的效率。并且它的学习成本也比hibernate低很多
快速入门
只需要通过如下几个步骤,即可用mybatis快速进行持久层的开发
编写全局配置文件
编写mapper映射文件
加载全局配置文件,生成SqlSessionFactory
创建SqlSession,调用mapper映射文件中的SQL语句来执行CRUD操作
1,创建测试数据库
#判断存在即删除数据库
drop database if exists mydb;
#创建数据库
create database mydb;
#使用数据库
use mydb;
#创建表
create table t_user
(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);
insert into t_user(username,password,phone,address) values('张
三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李
四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小
美','123','18565234759','信阳');
select * from t_user;
2.创建一个Java项目并导入mybatis框架的jar包
3.创建跟表对应的实体类
public class User {
private int uid;
private String username;
private String password;
private String phone;
private String address;
public interface UserDao {
List<User> selectAll();
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace是映射的dao接口-->
<mapper namespace="com.ye.dao.UserDao">
<!--通过select标签进行查询
id:映射接口的方法名
parameterType:指定参数的类型(如果是集合类型只需要指定集合元素的类型即可)resultType:指定返回值的类型
-->
<select id="selectAll" resultType="com.ye.bean.User">
select * from t_user;
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置环境信息===就是配置连接数据库的参数
default:指定配置的环境信息的id,表示默认连接该环境
-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务的处理方式:模式使用JDBC的事务处理-->
<transactionManager type="jdbc"></transactionManager>
<!--数据源的默认type设置为pooled,表示使用连接池-->
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.ye.dao.UserDao"></mapper>
</mappers>
</configuration>
public class Usertest {
@Test
public void testselectAll() throws IOException {
//1.加载核心配置文件的字节输入流
InputStream stream=Resources.getResourceAsStream("mybatis.xml");
//2.创建SqlSessionFactory的构建对象--框架使用的是构建者模式
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//3.通过构建对象加载配置文件的输入流获取SqlSessionFactory
SqlSessionFactory factory = builder.build(stream);
//4.通过工厂对象获取SqlSession对象----执行JDBC操作的
SqlSession session = factory.openSession();
//5.通过SqlSession对象获取接口对应的代理对象
UserDao user=session.getMapper(UserDao.class);
//6.通过代理对象执行查询方法
List<User> userlist=user.selectAll();
//7.遍历集合
for (User user1 : userlist) {
System.out.println(user1);
}
}
8.结果如下
创建增加接口类
int insertAll(User user);
在接口的包中创建对应的mapper映射配置文件
<insert id="insertAll" parameterType="com.ye.bean.User">
insert into t_user(username,password,phone,address) values(#{username},#{password},#{phone},#{address});
</insert>
使用测试类中进行测试
@Test
public void insertAll() throws IOException {
//6.通过代理对象执行查询方法
User user1=new User();
user1.setUsername("茯苓");
user1.setPassword("666");
user1.setPhone("100000");
user1.setAddress("信阳");
int a = user.insertAll(user1);
if(a>0){
System.out.println("成功");
}else {
System.out.println("失败");
}
}
创建删除接口类
int delect(int uid);
在接口的包中创建对应的mapper映射配置文件
<delete id="delect" parameterType="int">
DELETE from t_user WHERE uid=#{uid};
</delete>
使用测试类中进行测试
@Test
public void delect() throws IOException {
int delect = user.delect(13);
if(delect>0){
System.out.println("成功");
}
}
创建修改接口类
int upd(User user);
在接口的包中创建对应的mapper映射配置文件
<update id="upd" parameterType="com.ye.bean.User">
update t_user SET username=#{username},password=#{password},phone=#{phone},address=#{address} where uid=#{uid};
</update>
使用测试类中进行测试
@Test
public void upd(){
String username="吹牛";
String password="111";
String phone="666";
String address="吹牛皮";
int uid=1;
User user1=new User();
user1.setUsername(username);
user1.setPassword(password);
user1.setPhone(phone);
user1.setAddress(address);
user1.setUid(uid);
int upd = user.upd(user1);
System.out.println("修改成功");
}