一,
Mybatis把jdbc进行封装,但是连接数据库的配置和操作数据库的sql语句没办法也不能封装,而这两部分是写在配置文件中mybatis.xml和classnameMapper.xml。
二,环境搭建:
1.导入mybatis-3.2.7.jar官方包,mybatis的依赖包,对mysql的jdbc包,jsp依赖的包jstl和standard, 日志包,等,。
2.在 src 下新建全局配置.xml文件(编写 JDBC 四个变量),
2.1在全局配置文件中引入 DTD 或 schema,作用是用于检查xml的语法,(是xml语法检查器)从第二行开始写起:
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
上面 <!DOCTYPE configuration...中这个DOCTYPE后面红色的,在DOCTYPE标签之后第一个标签就必须是红色这个,比如
2.2配置数据库连接,
这四个datasource的property是mybatis用于连接数据库的变量,name是不能乱动的,value只有链接端口3306后面的数据库名,数据库账户和密码可以改
2.3在com.demo.pojo包下创建实体类People,并生成get/set方法
package com.dome.pojo;
public class People {
private int uid;
private String uname;
private int age;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.新建一个com.dome.mapper包,并建立一个ClassNameMapper.xml文件,一定要写在包里
换句话说:新建以 mapper 结尾的包,在包下新建:实体类名+mapper.xml 例如:PeopleMpper.xml
文件作用:编写需要执行的 SQL 命令,
并且在同一个文件夹中建立一个ClassNameMapper.java的接口文件,接口方法为xml文件标签中配置的id,,
如下代码写一个查询语句:
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace理解成原先用jdbc连接数据的DAO的实现类的全路径(包名+类名) -->
<mapper namespace="com.dome.mapper.PeopleMapper">
<!-- 这里面的每一种标签对应sql的一种操作方法 -->
<!-- id:原先dao类中的一个方法名
parameterType:定义参数类型 ,其实就是 sql语句的参数
resultType:这个方法的返回值类型.
如果方法返回值是list,在resultType中写List的泛型,因为mybatis
对jdbc封装,一行一行读取数据,
读的一行就是一个People的实体类的数据,
所以要写这个实体类的全路径比如com.dome.pojo.People
-->
<select id="selAll" resultType="com.dome.pojo.People">
select * from people
</select>
</mapper>
4.再把mybatis.xml和PeopleMapper.xml关联起来,要在mybatis.xml的</environments>和</configuration>标签之间写上
<mappers>
<mapper resource="com/dome/mapper/PeopleMapper.xml"/>
<!--resource写的是PeopleMapper.xml文件的全路径的目录结构用斜杠-->
</mappers>
5。配置完的两个文件:
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>
<!-- default引用environment的id,当前所使用的环境 -->
<environments default="default">
<!-- 声明可以使用的环境 -->
<environment id="default">
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/dome/mapper/PeopleMapper.xml"/>
</mappers>
</configuration>
PeopleMapper.xml文件:
<?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">
<!-- namesapce:理解成实现类的全路径(包名+类名)
在测试代码中通过a.b.selAll找到那个sql语句 -->
<mapper namespace="com.dome.peoplemapper" >
<!-- id:方法名
parameterType:定义参数类型
resultType:返回值类型.
如果方法返回值是list,在resultType中写List的泛型,因为mybatis
对jdbc封装,一行一行读取数据
为啥没写成集合是因为jdbc是一行一行读数据
-->
<select id="selAll" resultType="com.demo.pojo.People">
select * from people
</select>
</mapper>
三,环境搭建详解补充
在全局配置文件中内容
1 <transactionManager/> type 属性可取值
1.1 JDBC,事务管理使用 JDBC 原生事务管理方式
1.2 MANAGED 把事务管理转交给其他容器比如说spring.其实就相当于把原生 JDBC 事务
setAutoMapping(false);设置为不自动连接和回滚。
2<dataSouce/>type 属性
2.1 POOLED 使用数据库连接池(连接池作用提高系统运行效率)
2.2 UNPOOLED 不实用数据库连接池,和直接使用 JDBC 一样
2.3 JNDI :java 命名目录接口技术. (一般用于用java语言调用其他语言写的资源)
四:在com.dome.service包中创建service的接口:
1.接口方法
package com.dome.service;
import java.io.IOException;
import java.util.List;
import com.dome.pojo.People;
public interface PeopleService {
List<People> selAll() throws IOException;
}
2.在com.dome.service.impl包实现接口的方法
package com.dome.service.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.dome.pojo.People;
import com.dome.service.PeopleService;
public class PeopleServiceImpl implements PeopleService{
@Override///接口和实现类必须同时抛出异常
public List<People> selAll() throws IOException {
///加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
//前面是工厂 实例化工厂对象时使用的是 构建者设计模式 名称标志:后面有Builder
/*SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
/// 整个sqlsession就是mybatis的所有api封装的对象,包括增删改查
SqlSession session = factory.openSession();
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
List<People> list = session.selectList("com.dome.mapper.PeopleMapper.selAll");
上面这个com.dome.mapper.PeopleMapper是PeopleMapper.xml文件中的mapper的name 随便取啥都可以,也可以取a.b,只有这里写的和配置文件中相同就行,调用这个name中具体的那个sql,用.id来取
session.close();
return list;
}
}
五、建立一个servlet
package com.dome.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dome.pojo.People;
import com.dome.service.PeopleService;
import com.dome.service.impl.PeopleServiceImpl;
//大部分注解都有默认属性,如果注解中只给默认属性复制,可以省略属性名
//否则在注解的(属性名=属性值)格式
//如果一个属性是数组类型格式: 属性名={值,值} ,如果该数组只有一个值,可以省略大括号
//如果类是不是基本数据类型或String而是一个类类型,语法: 属性名=@类型
//注解中@表示引用注解声明
@WebServlet("/show")
public class ShowServlet extends HttpServlet {
private PeopleService ps =new PeopleServiceImpl();
public void service(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException{
List<People> list=ps.selAll();
req.setAttribute("list", list);
//相对路径
//只要路径中以/开头的都叫做全路径. 从项目根目录(WebContent)出发找到其他资源的过程
//只要不以/开头都是相对路径,相对路径是从当前资源出发找到其他资源的过程
//如果请求转发 / 表示WebContent目录
//如果是重定向,静态资源引用,比如<img src=""/> <a href=""> <script src=""/> css引用时
//其中 /都表示的是tomcat的webapps文件夹根目录并不是项目下的根目录。服务器根目录
/// WebContent打包给服务器的时候重命名为项目名,
//如果非要找项目下的静态资源,,所以在调用香米资源的时候加一个 项目名/资源路径,即可
req.getRequestDispatcher("/index.jsp").forward(req, res);
}
}
六,在webcontent下建立一个index.jsp视图文件;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border='1'>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<c:forEach items="${list }" var="peo">
<tr>
<td>${peo.uid }</td>
<td>${peo.uname }</td>
<td>${peo.age }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
七,右键点击项目名,run as->run on server,在浏览器请求栏输入请求的url
刚入门请多多指教。