前言:
什么是框架?使用框架有什么好处?
框架就是我们软件开发中的一种解决方案,不同的框架对应解决不同的问题。框架封装了很多细节,使开发者可以使用极简的方式去实现功能,大大的提升了开发效率。
现在学习的Mybatis是三层架构(表现层,业务层,持久层)中持久层相关的。
对于持久层来说,有以下几种解决方案:
- JDBC技术:Connection,Statement,ResultSet
- Spring的JDBCTemplate:Spring中对JDBC的简单封装
- Apache的DBUtils:和上述的很像,也是对JDBC的简单封装
以上都不是框架,JDBC是规范,而后两个是工具类。
Mybatis框架:
一、概述
是一个优秀的基于java的持久层框架,它内部封装了JDBC,使开发者只需要关注sql语句本身,而无需处理加载驱动、创建连接、创建Statement等繁琐的过程。它使用了ORM思想,实现了结果集的封装。可以使用xml和注解方式来配置各种Statement。
ORM:Object Relational Mapping 对象关系映射,就是把数据库表和实体类及实体类的属性对应起来,让我们可以通过操作实体类就可以实现操作数据库表。
二、入门
前面说到,我们可以使用xml和注解的方式来配置Statement,基于开发的角度去想,注解方式十分方便,但是我们是学习者,xml配置我们也是要了解学习的。
如何搭建?
- 创建maven工程并在pom.xml中导入坐标(配置xml)
- 在src/main/java中创建实体类和dao接口
- 在resources中穿件MyBatis的主配置文件SqlMapConfig.xml
- 如果是基于xml配置,我们需要按照包名在resources下创建IUserDao.xml
我们需要在pom中导入的坐标如下:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
然后依照包名创建dao接口和实体类:
package com.hty.domain;
import java.io.Serializable;
/**
* @program: day20
* @author: Semineces
* @create: 2020-01-20 14:35
*/
public class User implements Serializable {
private Integer id;
private String username;
private String sex;
private String telephone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + username + '\'' +
", sex='" + sex + '\'' +
", telephone='" + telephone + '\'' +
'}';
}
}
package com.hty.dao;
import com.hty.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @program: day20
* @author: Semineces
* @create: 2020-01-20 14:55
*/
public interface IUserDao {
/**
* 通过id获取信息
* @return
*/
//@Select("select * from myuser where id = #{id}") 这行是基于注解的
List<User> getUserById(int id);//通过id查人
}
在resources下创建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>
<typeAliases>
<typeAlias type="com.hty.domain.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/project?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="passowrd"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--基于xml配置实现-->
<mapper resource="com/hty/dao/User.xml"></mapper>
<!--基于注解配置实现-->
<!-- <mapper class="com.hty.dao.IUserDao"></mapper> -->
</mappers>
</configuration>
然后我们需要在与IUserDao对应的路径下创建User.xml(如果我们是基于注解配置,就不用创建了)
依照这个目录来创建,具体内容为:
其中,id为接口中的方法名,parameterType为接受的参数类型,resultType为返回的结果类型。
<?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的属性值必须使全限定类名 -->
<mapper namespace="com.hty.dao.IUserDao">
<select id="getUserById" parameterType="int" resultType="com.hty.domain.User">
select * from myuser where id = #{id}
</select>
</mapper>
至此,初步搭建环境就完成了,现在我们在test/java下创建一个测试类来测一测。
import com.hty.dao.IUserDao;
import com.hty.domain.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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @program: day20
* @author: Semineces
* @create: 2020-01-20 14:52
*/
public class TestMybatis {
private InputStream inputStream;
private SqlSession sqlSession;
private IUserDao iUserDao;
@Before
public void init() throws IOException {
//读取xml的时候使用了类加载器,它只能读取类路径的配置文件
inputStream = Resources.getResourceAsStream("config/SqlMapConfig.xml");
//创建工厂:mybatis使用了构建者模式,其中SqlSessionFactoryBuilder是构建者
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//使用工厂生产SqlSession对象,就是使用了工厂模式,好处是解耦(降低了类之间的依赖关系)
sqlSession = sqlSessionFactory.openSession();
//创建dao接口实现类使用了代理模式
iUserDao = sqlSession.getMapper(IUserDao.class);
}
@Test
public void testGetUser() {
//使用代理对象执行方法
List<User> users = iUserDao.getUserById(1);
for (User user : users) {
System.out.println(user);
}
}
@After
public void destroy() throws IOException {
//释放资源
sqlSession.close();
inputStream.close();
}
}
得到控制台输出我们所查到的内容:
至此,Mybatis的入门搭建,以及简单的小实例成功了。
三、注意事项
1.Mybatis中映射配置文件位置必须与dao接口的包结构相同
2.基于User.xml配置中mapper标签里的namespace属性的取值必须是dao接口的全限定类名
3.映射配置文件的操作配置(select),id属性的取值必须使dao接口的方法名
当我们遵从了这三点后,在开发中就无须写实现类了(因为已经没必要了)。
四、进行CRUD
大概步骤跟前面的差不多,基于xml配置就还是要在User.xml中写sql语句。
<insert id="insertUser" parameterType="User">
insert into myuser(username,sex,telephone) values (#{username},#{sex},#{telephone})
</insert>
<update id="updateUser" parameterType="User">
update myuser set username=#{username},sex=#{sex},telephone=#{telephone} where id=#{id}
</update>
<select id="getUser" resultType="com.hty.domain.User">
select * from myuser
</select>
<delete id="deleteUser" parameterType="int">
delete from myuser where id=#{id}
</delete>
然后我们在接口中添加上述方法:
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
List<User> getUser();
最后在我们的测试类中写测试方法:
@Test
public void testInsertUser() {
User user = new User();
user.setUsername("semineces");
user.setSex("男");
user.setTelephone("1111");
iUserDao.insertUser(user);
//除了查询操作外,都要使用commit来提交事务
sqlSession.commit();
}
@Test
public void testGetUser() {
List<User> users = iUserDao.getUser();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testUpdateUser() {
User user = iUserDao.getUserById(1);
user.setSex("女");
iUserDao.updateUser(user);
sqlSession.commit();
}
@Test
public void testDeleteUser() {
iUserDao.deleteUser(2);
sqlSession.commit();
}
至此,我们就已经实现完mybatis的入门CRUD操作了,如果是基于注解开发,则用select注解将sql语句写在IUserDao接口的方法上方。