一、Mybatis概述
MyBatis是一个开源、轻量级的数据持久化框架,是JDBC和Hibernate的替代方案。
MyBatis前身为IBatis,2002年由Clinton Begin发布,2010年从Apache迁移到Google,并改名为MyBatis,2013年又迁移到了Github。
MyBatis是一个优秀的基于Java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力处理加载驱动、创建链接、创建statement等繁杂的过程。
MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过Java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为Java对象并返回。
采用ORM思想解决了实体类和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,是我们不用于jdbc apl打交道,就可以完成对数据库的持久化操作。
MyBatis支持定制化sql、存储过程以及高级映射,可以在实体类和sql语句之间建立映射关系,是一种半自动化的ORM实现。
二、MyBatis配置文件
1、创建数据库,
我们先来创建一个数据库名为“mydb” ,然后再在mydb数据库中创建一个用户表名为“t_user”,
在表中新建三条数据用来测试。
实现代码如下所示:
#判断存在即删除数据库
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','信阳');
2、创建实体类
创建一个名为“user”的实体类,实体类的属性名推荐和数据库的字段名一样。
实现代码如下:
public class User {
private Integer uid;
private String username;
private String password;
private String phone;
private String address;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
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 getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
}
3、创建接口
创建一个接口,在接口中编写全查、单查、、添加、删除的抽象方法
实现代码如下:
public interface UserDao {
//全查
List<User> selectAll();
//根据id查询用户信息
User selectByid(int uid);
//模糊查询
List<User> seach(String keyword);
//添加
int addUser(User user);
//删除
int deleteByid(int uid);
//修改
int update(User user);
}
4、编写mapper配置文件
在接口的包中创建对应的mapper映射配置文件
实现代码如下:
<?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.hp.dao.UserDao">
<!--全查-->
<select id="selectAll" resultType="com.hp.bean.User">
select * from t_user;
</select>
<!--根据uid查询用户信息-->
<select id="selectByid" parameterType="int" resultType="com.hp.bean.User">
select * from t_user where uid = #{uid};
</select>
<!--模糊查询-->
<select id="seach" parameterType="String" resultType="com.hp.bean.User">
select * from t_user where username like concat('%',#{keyword},'%')
</select>
<!--添加-->
<insert id="addUser" parameterType="com.hp.bean.User">
insert into t_user(username,password,phone,address) values(#{username},#{password},#{phone},#{address});
</insert>
<!--删除-->
<delete id="deleteByid" parameterType="int">
delete from t_user where uid = #{uid};
</delete>
<!--修改-->
<update id="update" parameterType="com.hp.bean.User">
update t_user set username=#{username},password=#{password},phone=#{phone},address=#{address} where uid=#{uid};
</update>
</mapper>
5、编写mybatis框架的核心配置文件
在src中创建一个文件,命名为SqlMapConfig.xml,我们在该配置文件中进行配置连接数据库的参数。
实现代码如下:
<?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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.hp.dao.UserDao"></mapper>
</mappers>
</configuration>
6、测试
我们通过myBatis进行数据库操作需要实现如下五步才能正常使用。
1、加载核心配置文件的字节数输入流 -- Resources.getResourceAsStream("核心框架配置文件名")
2、创建SqlSessionFactoryBuilder的构建对象 --- new SqlSessionFactoryBuilder();
3、通过构建对象加载配置文件的输入流获取SqlSessionFactory --- 构建对象名.build(stream);
4、通过工厂对象获取 SqlSession对象 --- SqlSessionFactory对象名.openSession();
5、通过SqlSession对象获取接口的代理对象 --- SqlSession对象名.getMapper(接口类.class);
public class UserTest {
InputStream stream =null;
SqlSessionFactoryBuilder builder =null;
SqlSessionFactory factory =null;
SqlSession sqlSession =null;
UserDao userDao =null;
User user = null;
@Before
public void into() throws IOException {
System.out.println("before");
//1.加载核心配置文件的字节输入流
stream = Resources.getResourceAsStream("SqlMapConfig.xml");//施工图纸
//2.创建SqlSessionFactoryBuilder的构建对象---框架使用的是构建者模式
builder = new SqlSessionFactoryBuilder();//工程队
//3.通过构建对象加载配置文件的输入流获取SqlSessionFactory
factory = builder.build(stream);//工程队根据图纸剑招工厂
//4.通过工厂对象获取 SqlSession对象---执行JDBC操作的
sqlSession = factory.openSession();//工厂生产产品
//5.通过SqlSession对象获取接口的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
//全查
@Test
public void TestSelectAll(){
List<User> userList = userDao.selectAll();
for (User user : userList) {
System.out.println(user);
}
}
//单查
@Test
public void TestSelectByid(){
User user1 = userDao.selectByid(1);
System.out.println(user1);
}
//模糊查询
@Test
public void TestSeach(){
List<User> userList = userDao.seach("张");
for (User user1 : userList) {
System.out.println(user1);
}
}
//添加
@Test
public void TestAdd(){
user = new User();
user.setUsername("不想去");
user.setPassword("123");
user.setPhone("119");
user.setAddress("去思");
int i = userDao.addUser(user);
if (i>0){
System.out.println("添加了");
}
}
//删除
@Test
public void TestDelete(){
int i = userDao.deleteByid(5);
if (i>0){
System.out.println("删除了");
}
}
//修改
@Test
public void TestUpdate(){
User oldUser = userDao.selectByid(4);
System.out.println("修改前"+oldUser);
oldUser.setUsername("小妹");
oldUser.setAddress("南京");
userDao.update(oldUser);
User newUser = userDao.selectByid(4);
System.out.println("修改后"+newUser);
}
@After
public void distroy() throws IOException {
System.out.println("after");
sqlSession.commit();
sqlSession.close();
stream.close();
}
}