Mybatis的基本配置以及使用
mybatis是什么?
mybatis是优秀的Java持久层框架,支持定制SQL和存储过程存储过程以及高级映射,可以通过xml配置或者注解方式来进行映射原始类型接口和java pojo(简单的Java对象 仅用来进行数据的传递而没有逻辑方法)到数据库中的对象
mybatis的优点
- mybatis中使用了dao层来放置持久层代码,将持久层代码与业务逻辑层代码分开,进行了解耦便于了代码的维护
- mybatis是半自动化的持久层框架,相比使用JDBC来操作数据库简单了很多几乎避免了所有的JDBC代码
- mybatis支持定制化的sql由程序员来编写sql代码,更加的灵活。
mybatis的使用
-
mybatis资源的获取:mybatis官方网址
-
使用maven进行项目的管理我们只需要在pom.xml文件中导入mybatis的依赖坐标
maven依赖坐标获取以及jar包下载网站:maven repository
因为使用maven管理项目因此获取mybatis依赖坐标即可 一般下载使用人数较多的版本<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
1. 使用xml文件方式从数据库查询表中数据
- 首先在数据库创建一个数据库表user并且插入数据(要连接数据库别忘了在pom.xml中加入MySQL的依赖坐标和单元测试junit依赖坐标用于测试)
create database mybatis_demo; use mybatis_demo; create table user( eno int primary key auto_increment, ename varchar(50) not null, email varchar(50), salary double, dno int ); insert into user(ename,email,salary,dno) value('fff','fff@163.com',19000,1), ('ggg','ggg@163.com',15000,2), ('hhh','hhh@163.com',13000,3), ('jjj','jjj@163.com',16000,4);
- 创建一个包名为entiyt的包来存放实体类,实体类成员属性必须要对应表中的字段(因为mybatis要将出数据库中查询出来的数据进行映射到实体类对象中然后返回)
public class User {
private int eno;
private String ename;
private String email;
private double salary;
private int dno;
public User(){
}
public User(int eno, String ename, String email, double salary, int dno) {
this.eno = eno;
this.ename = ename;
this.email = email;
this.salary = salary;
this.dno = dno;
}
public int getEno() {
return eno;
}
public void setEno(int eno) {
this.eno = eno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public int getDno() {
return dno;
}
public void setDno(int dno) {
this.dno = dno;
}
@Override
public String toString() {
return "User{" +
"eno=" + eno +
", ename='" + ename + '\'' +
", email='" + email + '\'' +
", salary=" + salary +
", dno=" + dno +
'}';
}
}
- 在源码部分新建一个包,包名叫做dao 用来存放持久层代码
在dao包下面创建一个接口里面声明操作数据库的方法,接口中的方法不能重载
public interface UserDao {
// 查询数据库中所有的user
List<User> queryAllUsers();
}
- 在resources目录下编写一个接口的映射文件userDaoMapper.xml(相当于接口UserDao的实现类)
<?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层中的接口
id:必须与接口中的方法的名称一致
resultType:方法返回值的类型
持久层dao接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字
符串作为 key 值,可唯一定位一个 MapperStatement。在 Mybatis 中,每一个
<select>、<insert>、<update>、<delete>标签,都会被解析为一个
MapperStatement 对象
-->
<mapper namespace="org.xupt.dao.UserDao">
<select id="queryAllUsers" resultType="org.xupt.entity.User">
select * from mybatis_demo.user;
</select>
</mapper>
- 编写mybatis的配置文件mybatis-config.xml,将mybatis与数据库连接(数据库的配置信息可以抽取出来成一个db.properties文件然后在configuration标签下面使用properties标签引入)
<?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"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--mybatis sql映射⽂件的位置-->
<mapper resource="UserDaoMapper.xml"/>
</mappers>
</configuration>
- 进行测试
public class test {
@Test
public void testF() throws IOException {
// 读取mybatis的全局配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 使用sqlSessionFactory生产sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建代理对象 面向接口编程
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 使用代理对象 调用接口中的方法
List<User>res = mapper.queryAllUsers();
for (User user:res){
System.out.println(user.toString());
}
}
}
测试结果:
2. 使用注解的方式从数据库查询表中数据
注解方式与xml方式区别:
注解方式不需要xml映射文件 sql语句写在接口中的方法上的注解里
mybatis的配置文件中sql映射要换成接口所在位置
public interface UserDao {
// 查询数据库中所有的user
@Select("select * from user")
List<User> queryAllUsers();
}
修改sql映射位置
<mappers>
<!--mybatis sql映射⽂件的位置-->
<mapper class="org.xupt.dao.UserDao"/>
</mappers>
测试结果(测试方法和xml方式一样)