MyBatis介绍
JDBC——Hibernate——ibatis——Mybatis
- ORM
Object RelationShip Mapping 对象关系映射
Object:JavaBean Relationship:关系(指代数据库的表) Mapping:映射
Hibernate不需要写SQL语句,配置好Mapping,那么使用类似session.save(user)的语句可以自动生成SQL语句,完成save操作
当时Hibernate出来的时候非常红 ,大家都不用JDBC了,Sun公司就给了出了JPA(Java Persistence API)Java持久层API,用来替代JDBC,但是大家还是用hibernate(当然现在用MyBatis多)。
2000-2010
政府、电信、银行、金融、中大型的企业
特点:需求稳定,不需要经常改2010-2020
中小型企业、创业型公司的小项目、面向用户的互联网项目
特点:需求变化的非常迅速ibatis/Mybatis
把SQL语句暴露给开发者,其他的封装起来。
修改起来非常方便。
这是Mybatis的最大优点。
Mybatis封装了JDBC的持久层框架。
它比DBUtils和JDBCTemplate更加方便
写一个小demo
导包
ant的两个包是构建工具
asm和cglib是字节码增强工具
commons-logging是Apache的日志依赖包
javassist也是字节码增强工具,会产生代理对象
log4j-api等是日志包
mybatis核心包
ognl包提供了ognl的api,ongl是一种表达式语言
slf4j日志包
进MySQL建表
新建对应的JavaBean
package com.bamzhy.bean;
public class User {
String id ;
String username;
String password;
String email;
int age ;
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
创建Mybatis的主配置文件
<?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>
<!--配置MyBatis环境配置-->
<environments default="development">
<environment id="development">
<!--配合JDBC进行事务控制,由Mybatis控制-->
<transactionManager type="JDBC"></transactionManager>
<!--连接池-->
<dataSource type="POOLED">
<!--driver是mysql的驱动-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
</environment>
</environments>
</configuration>
创建Mybatis查询配置文件(SQL语句配置文件)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<!--parameterType是参数的类型-->
<!--这一行SQL语句要映射到哪个类上要使用resultType指明-->
<!--SQL语句中WHERE=?,问号用#{}代替-->
<select id="findUserById" parameterType="int" resultType="com.bamzhy.bean.User">
SELECT * FROM tt_user WHERE id=#{id};
</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>
<!--配置MyBatis环境配置-->
<environments default="development">
<environment id="development">
<!--配合JDBC进行事务控制,由Mybatis控制-->
<transactionManager type="JDBC"></transactionManager>
<!--连接池-->
<dataSource type="POOLED">
<!--driver是mysql的驱动-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--resource中写入从配置文件名-->
<mapper resource="com/bamzhy/bean/user.xml"></mapper>
</configuration>
ClassLoader:类加载器,将字节码文件加载到jvm虚拟机中
测试
查找
package com.bamzhy.test;
import com.bamzhy.bean.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class test {
@Test
public void test1() throws IOException {
//使用Mybatis的api去实现
//加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//操作数据库的一个载体
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println("user"+user);
}
}
- 结果:
userUser{id='1', username='haha1', password='12345', email='12345@qq.com', age=19191019}
- 换种方式查询
<select id="findUserByName" parameterType="string" resultType="com.bamzhy.bean.User">
SELECT * FROM tt_user WHERE username Like #{id};
</select>
//字段后边加%表示以该字段为开头
List<Object> haha = sqlSession.selectList("test.findUserByName", "haha%");
System.out.println("user"+haha);
插入
- 参数和属性需要对应!
<insert id="insertUser" parameterType="com.bamzhy.bean.User">
INSERT INTO tt_user VALUES (NULL,#{username},#{password},#{email},#{age});
</insert>
- 一定要记得提交,否则虽然能执行,但不会生效
@Test
public void test3() throws IOException {
//使用Mybatis的api去实现
//加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//操作数据库的一个载体
SqlSession sqlSession = sqlSessionFactory.openSession();
//返回一个对象
User user = new User();
user.setUsername("haha3");
user.setPassword("12345");
user.setEmail("12345@qq.com");
user.setAge(199191);
int insert = sqlSession.insert("test.insertUser", user);
//非常重要,要记得提交,否则不报错但是数据库里边没有
sqlSession.commit();
System.out.println("insert "+insert);
}
}
删除
<delete id="deleteUserById" parameterType="int">
DELETE FROM tt_user WHERE id=#{id};
</delete >
- 同样记得要手动提交
@Test
public void test4() throws IOException {
//使用Mybatis的api去实现
//加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//操作数据库的一个载体
SqlSession sqlSession = sqlSessionFactory.openSession();
//返回一个对象
int user = sqlSession.delete("test.deleteUserById", 5);
//同样需要commit
sqlSession.commit();
System.out.println("user"+user);
}
修改
<update id="updateUserById" parameterType="com.bamzhy.bean.User">
UPDATE tt_user SET username=#{username},password=#{password} WHERE id=#{id};
</update>
@Test
public void test5() throws IOException {
//使用Mybatis的api去实现
//加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//操作数据库的一个载体
SqlSession sqlSession = sqlSessionFactory.openSession();
//返回一个对象
User user = new User();
user.setUsername("haha3");
user.setPassword("12345");
user.setEmail("12345@qq.com");
user.setAge(199191);
//设置修改的类型
user.setId("2");
int update = sqlSession.update("test.updateUserById", user);
sqlSession.commit();
System.out.println("update " + update);
}