首先回顾一下MyBatis封装简化Dao层连接数据库操作的顺序.
首先MyBatis是一个引入的jar包,还有一些依赖包,可能用不到的jar包,一并引入就好了,再多引入一个Juntil.jar测试包(省略把jar包添加到可用仓库操作)
其后在项目的分层结构中使用MyBatis.
首先代码分包分层结构. (我建立的是Dynamic Web Project,而分层存在于src中)
上图中有些可能不全,有些可能不再使用,视情况而定.视命名而定.
之后的构想是实现一个简单的查询,从网站的某个新闻或者文档模块去模糊查询出包含查询语句的篇章.
因为之前的网站使用的只是静态网页,也没有区分出什么模块是新闻板块,文本板块.并将文本存到数据库中.(一些后台设置新闻版块都是将文本保存到数据库)
可以采用爬取网站内容的网络爬虫方式.(即将给定的URL连接中文本获取并进行相应操作)
(方法很奇特,功能也有点,但是F12好像能完全做了,并且要再实现输入网页下载相关文件到文件包,得需要js文件的爬取,这里不再做深入)
言归正传
首先创建项目,并在项目文件包lib中引入所有mybatis.jar包和依赖包,以及junit.jar包用于测试.
其后在src中引入log4j.properties. 日志文件有很多种写法,这里为精简最好.
其后将mybatis.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> <properties resource="com/ykmimi/config/jdbc.mysql.properties"> </properties> <typeAliases> <typeAlias alias="Student" type="com.ykmimi.entity.Student"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/ykmimi/dao/mapper.xml" /> <mapper resource="com/ykmimi/dao/mapper2.xml" /> </mappers> </configuration>
首先.在mybatis.xml这个 config 文件中 configuration 是它外层根标签, properties 指定了jdbc驱动及密码等一揽子文本配置内容.并使用了 ${jdbc.driver} 这种方式引入使用.
environments 中包含 environment , (环境), 并至少包含一个. environments 参数default指定了默认环境是哪一个子内容环境的id.
transactionManager 是JDBC事务管理器, dataSource是数据源 类型为连接池,
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
下面的<mappers>标签中是注册的映射文件(内含SQL语句).
------
建立测试用的 Student 实体类
package com.ykmimi.entity; public class Student { //成员变量 private Integer id; private String name; private int age; private double score; //alt+shift+s c public Student() { } //alt+shift+s o public Student(String name, int age, double score) { this.name = name; this.age = age; this.score = score; } //alt+shift+s r 属性是get或set去掉get后首字母小写 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } //alt+shift+s s @Override public String toString() { return id+","+name+","+age+","+score; } }
并建立数据库schoolsystem,建立表 students
CREATE TABLE `students` ( `id` int(5) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int(3) DEFAULT NULL, `score` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
(数据库中文乱码问题,在建立数据库时选定字符编码为utf-8 Unicode)不然也可以设置url为
"jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&useSSL=false"
首先在原来的dao包中建立一个测试用的 IStudentDao 接口, I表示接口,之后的命名可以参照.
其后是 StudentDaoImpl 接口实现.
package com.ykmimi.dao; import com.ykmimi.entity.Student; public interface IStudentDao { void insertStu(Student student); }
package com.ykmimi.dao; import java.io.IOException; import java.io.InputStream; 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 com.ykmimi.entity.Student; public class StudentDaoImpl implements IStudentDao { private SqlSession sqlSession; @Override public void insertStu(Student student) { try { //1.加载主配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = sqlSessionFactory.openSession(); //4.相关操作 sqlSession.insert("test.insertStudent", student); sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); } finally { if(sqlSession!=null) { sqlSession.close(); } } } }
之后创建mapper文件来实现sql语句的mybatis封装使用
前几个文摘说到mybatis是半ORM的,也就是还需要手写一部分的SQL语句:
<?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"> <!-- dtd约束xml --> <mapper namespace="stu"> <insert id="insertStudent" parameterType="Student"> insert into students(name,age,score) values(#{name},#{age},#{score}) </insert> </mapper>
mapper的namespace指定了使用这个命名空间下的增删改查方法. (利于区分)
insert或select等的id就相当于原先dao层方法名, parameterType是参数类型. 而resultType是返回类型.
下面的mapper2.xml文件只是为了区分测试namespace的作用.
<?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"> <!-- dtd约束xml --> <mapper namespace="test"> <insert id="insertStudent" parameterType="Student"> insert into students(name,age,score) values(#{name},#{age},#{score}) </insert> </mapper>
从打印日志信息可以看出是执行的哪一个命名空间的insert方法.
2018-08-10 23:41:19,936 [main] DEBUG [stu.insertStudent] - ==> Preparing: insert into students(name,age,score) values(?,?,?) 2018-08-10 23:41:19,970 [main] DEBUG [stu.insertStudent] - ==> Parameters: 张生(String), 23(Integer), 93.5(Double) 2018-08-10 23:41:19,971 [main] DEBUG [stu.insertStudent] - <== Updates: 1
简单使用的mybatis测试文件在这里,下一章节将获取SqlSession的方法单独拿出来作为一个类似于getConnection的方法.