Mybatis+java入门
导语
Mybatis是一个普遍应用的持久层框架,它封装了底层jdbc操作的复杂性,并提供了易用的api ,使我们能够吧java对象持久化到数据库中。这是我用java实现mybatis的例子。
工具:
maven intellij idea
spring boot
搭建项目
- 首先我我们用spring boot搭建一个maven项目。怎么搭建参考我的另外一篇文章
- 要用mybatis需要3个包
-mybatis的api包
org.mybatis mybatis 3.4.5
datasource包,就是数据源包,这里采用的dbcp数据源
org.apache.commons
commons-dbcp2
2.1.1
-mysql驱动包。
mysql
mysql-connector-java
创建测试类
ok,把这个3个包都倒入进去,那么就可以撸代码了。我们在工程下的test文件夹下面的java文件下建立一个测试包com.example.mybati文件夹。建立一个类MybatisTest.java用作测试用。如图所示
配置Mybatis
1.定义数据源
数据源datasource 是链接数据库的工具,
里面包含了链接数据库的账号 密码等。在数据源中又一个连接池每当你操作数据库的时候,
都是从这个池中拿到一个链接。上面我们提到了dbcp2包,他是datacorce的一个具体的实现。数据源有很多的实现。比如说 阿里的druid,dbcp2,dbcp,cp30等,各自有各自的优点,选择你需要的一个就可以了。这里我们用dbcp2作为数据源的实现类。在我们链接数据库的时候,基本属性需要数据库地址,用户名,密码,还有数据库
驱动包。代码如下
public DataSource dataSource(){
//实例化 dbcp2数据源
BasicDataSource dataSource = new BasicDataSource();
//设置数据库链接地址
dataSource.setUrl("jdbc:mysql:// 你的数据库地址/你的数据库名称");
dataSource.setUsername("你的账号");
dataSource.setPassword("你的密码");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
- 创建SqlSessionFactory 工厂类。
SqlSessionFactory这个接口看它的后缀就知道这是一个工厂类Factory,sqlsession的创建由sqlSessionFactory来管理。刚
才提到了sqlSessionFactory是一个接口,具体怎么创建的
sqlSession,是有sqlSessionFactory的具体实现类来实现的。至于为什么设计?直接new SqlSession()不就好了?具体请
看工厂方法类。在mybatis中默认的sqlSessionFactory实现类是DefaultSqlSessionFactory ,要实例化一个DefaultSqlSessionFactory 需要一个 Configuration的参数,那么接着看看看实例化一个Configuration需要
什么?需要一个Environment参数。接着看实例化Environment参数需要什么?我们看到需要 一个string 类型的id,TransactionFactory 事物工厂类,DataSource 数据源。那么我们按照上面所说的实例化
化一个 DefaultSqlSessionFactory 类。
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() {
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource());
Configuration configuration = new Configuration(environment);
configuration.addMapper(OrderMapper.class);
sqlSessionFactory = new DefaultSqlSessionFactory(configuration);
}
这里@Before 注解在类运行前执行的方法。 这里datasource()就是第一步中我们得到的 数据源。这里还有一个
OrderMapper.class 这个我们先这样子写,后面我们会讲到,现在我们声明了一个sqlSessionFactory工厂
- 获得SqlSession
SqlSession是mybatis定义的,用来操作数据库的类,也可以理解为操作数据库的连接。下面我们要获取这个连接,来操作数
据库。
SqlSession sqlSession = sqlSessionFactory.openSession();
- 编写sql语句
我们从sqlSessionFatory中获取一个连接。
加入我们有这么个需求,查询Order表中的其中一条记录。我们的sql语句是 select * from t_order where order_id =1
mybatis中定义sql语句的方式有2种,一种是 放在xml种,另外一种是注解的方式放在接口中。我们这次采用的是注解的方式
我们需要定义一个接口类,创建一个接口类型的java文件。OrderMapper ,
public interface OrderMapper {
@Select("SELECT * from t_order where t_order.order_id = #{id} ")
Order selectById(int id);
}
ok,上面的代码中,我们在接口中定义了一个方法,在方法中用 @Select() 包含了一条sql语句。@Select注解代表这是一个查
询,()中的内容就是查询的语句。也就是我们实际写的sql, #{id}在查询的时候会动态的替换成 Order selectById(int
id); 中的id字段。
这个类也就是我们第2步骤,configuration.addMapper(OrderMapper.class);这段代码中的OrderMapper类。
- 运行sql语句
mybatis是一个持久层框架,他用对象的方式封装的sql的查询。所以我们只需要调用 Order selectById(int id);
这个方法就可以实现查询sql了。那么要调用这个方法,必须要获取这个类,我们怎么获得OrderMapper这个类呢?
在第2步中我们 configuration.addMapper(OrderMapper.class);。意思是我们把 OrderMapper这个类放到了
sqlSession中,既然我们放进去了,当然就能取出来。
//java 版本查询
@Test
public void demo() {
//1 获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//2获取查询类
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
//3执行查询类的方法
Order order = orderMapper.selectById(11);
}
- 释放资源
当我们操作完了之后,需要释放掉我们创建的资源。
@After
public void end() {
sqlSession.close();
}
7 完整代码
package com.example.mybatis;
import com.example.mybatis.Mapper.OrderMapper;
import com.example.mybatis.entity.Order;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.sql.DataSource;
/**
* Created with IntelliJ IDEA.
* User: yf-wenhao
* Date: 17/11/23
* Time: 下午3:10
*/
public class MybatisTest {
private SqlSession sqlSession;
public DataSource dataSource(){
//实例化 dbcp2数据源
BasicDataSource dataSource = new BasicDataSource();
//设置数据库链接地址
dataSource.setUrl("jdbc:mysql:// 你的数据库地址/你的数据库名称");
dataSource.setUsername("你的账号");
dataSource.setPassword("你的密码");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
//1 获取sqlSessionFactory
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() {
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource());
Configuration configuration = new Configuration(environment);
configuration.addMapper(OrderMapper.class);
sqlSessionFactory = new DefaultSqlSessionFactory(configuration);
}
//java 版本查询
@Test
public void demo() {
//1 获取sqlSession
sqlSession = sqlSessionFactory.openSession();
//2获取查询类
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
//3执行查询类的方法
Order order = orderMapper.selectById(11);
}
@After
public void end() {
sqlSession.close();
}
}