导入mybatis jar包,将配置文件Configuration.xml放到建好的包中,在其中配置好dataSouce,没有密码项自己加上。
<dataSource type="UNPLOOED">
<property name = "driver" value="com.mysql.jdbc.Driver" />
<property name = "url" value = "jdbc:mysql://localhost:3306/xsgl" />
<property name = "username" value = "root" />
<property name = "password" value = "aspirine" />
</dataSource>
对于DAO层,我们需要传递给他一个可以与数据库进行交互并且执行SQL语句的对象,我们通过Mybatis来提供这个对象,对象名为SqlSession。
SqlSession的作用:
能够向SQL语句传入参数。
//在先前的JDBC中,我们执行的都是一条预编译的SQL语句,我们都是通过一个ArrayList对象为sql语句设置预编译的参数。
执行SQL语句。
获取SQL语句结果。
获取SqlSession的步骤:
1、通过配置文件获取数据库信息。
2、通过配置文件构建SqlSessionFactory。
3、通过SqlSessionFactory打开数据库会话。
举个栗子:
public class DBAccess {
public SqlSession getSqlSession () {
//通过配置文件获取数据库信息。
Reader reader = Resources.getResourceAsReader("com/config/Configuration.xml");
//通过配置文件信息构建SqlSessionFactory。
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(read);
//打开数据库会话。
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession;
}
}
在DAO层中,我们就可以改写先前的JDBC代码。
public class StudentDAO {
public List<Student> queryStudentList(String stuNumber, String stuName) {
//实例化DBAccess
DBAccess dbAccess = new DBAccess();
//通过dbAccess获取sqlsession.
在DAO层我们需要处理掉异常。
SqlSession sqlSession = null;
将SqlSession写在外面,不然在finally中还需要将其关闭。
try{
sqlSession = dbAccess.getSqlSession();
//执行SQL语句。
//我们所需要的查询语句现在通过mybatis来执行,在我们下载的的mybatis的测试包中可以找到一个User.xml的配置文件,具体路径我这里是mybatis-3-mybatis-3.4.5\src\test\java\org\apache\ibatis\submitted\complex_property。
我们将这个Users.xml配置文件新建一个包放到其目录下,
找到select标签那一块,我们将我们需要查询的sql语句对其进行替换,
然后这里我们设置一下id,id在整个mapper里面是唯一的,一条SQL语句只能有一个id,重复ID的情况下需要在不同的mapper中才能生效,我这里也把mapper的namespace属性改为了自己的名称student.
然后我们回到java代码块。
java代码的调用是用sqlSession
sqlSession.selectList("Student.queryStudentList"); //参数值为mapper的namespace值+select的id。
//然后我们还需要给每一个字段设值
也就是
这一块功能在mybatis中的实现。
首先,resultMap中的type属性的值就是我们设计的类的名称,我这里是com.imooc.bean.Student
resultMap的id可以与select的id重名,我给的是StudentResult。
在我们建的表中,如果我们的列是主键的话,我们就设置id,如果是普通的列的话,就设置result标签,但他们里面的含义都相同。
column配的是数据的列名,preperty对应的是我们的实体类中的属性名,然后jdbcType对应的是在数据库中每一列的类型。
然后我们看到select标签中的resultMap属性,很明显他是指向我们刚才的设定,所以我们把我们的id给定select的resultMap属性。
然后回到java块用List<student>存储。
}catch (IOException e) {
e.printStackTrace();
}finally{
//我们还需判断其是否为空
if(sqlSession != null) {
sqlsSession.close();
}
}