关于java-mybatis和javaweb的整合,并没有涉及sping一些工具,而是用maven项目。
Mybatis-Web简单操作
Mybatis-Web
mybatis-web项目的创建
首先选择file-new-other
选择maven project项目
再来就是勾选create a simple project
创建项目 给个 group id 和artifact id 项目名 其他默认 packaging这里选择war
完事之后等待项目加载完成。。。。。
点击右健项目找到properties——maven——project factes
这里注意一下dynamic web module的版本和Java的版本
取消dynamic web module的勾选——点击apply——再去重新勾选dynamic web module只后左下角会有提示——点击提示——勾选generate web.xml...——点击apply and close。
整个mybatis-web项目结构就是这样子了
介绍一下简单的mybatis-web的查询和多表查询的一些操作
Mybatis-Web项目结构
Mybatis
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.26</version></dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</project>
首先
src/main/resources下创建mybatis-config.xml配置文件和log4.properties日志文件
log4.properties
log4j.rootLogger=ERROR, stdout
log4j.logger.com.mapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
注意 log4j.logger.com.mybatis.javaweb=TRACE,
这里是 log4j.logger.xx.xx.xx是你的接口方法路径,
我这里是com.mapper也就是包名com.mapper
mybatis-config.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>
<!--全局配置项 -->
<settings>
<setting name= "logImpl" value="log4j" />
<!--将以下划线方式命名的数据库列映射到Java对象的驼峰式命名属性中-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--配置包的別名-->
<typeAliases>
<package name= "com.model" />
</typeAliases>
<!--配置数据库连接-->
<environments default= "development">
<environment id="development"><!-- 毎个environment元素定乂的坏境ID -->
<transactionManager type= "JDBC"><!-- 事务处理方式 -->
<property name="" value="" />
</transactionManager>
<dataSource type= "UNPOOLED"> <!-- 数据源配置 -->
<property name= "driver" value= "com.mysql.jdbc.Driver" /> <!-- 数据库JDBC驱动 -->
<property name= "url"
value= "jdbc:mysql://localhost:3306/xxx?useSSL=false" /> <!-- 数据库URL -->
<property name= "username" value="root" /> <!-- 数据库用戸-->
<property name= "password" value="xxx" /> <!-- 密码-->
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/javaweb/Mapper.xml"/>
</mappers>
这里注意的是你的mappers的mapper resource的路径
对应的是你的sql方法实现的配置文件路径
创建mapper sql方法实现配置文件
我这里是在com/mybatis/javaweb的下面 名为Mapper.xml
你可以自定义配置文件的路径
Mapper.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">
<mapper namespace="com.mapper.Mapper"><select id="selectAllUsers" resultType="Goods">
select * from goods
</select>
<select id="selectNumById" resultType="Goods">
select a.name as name,a.price as price,a.picture as picture,c.num as num from
goods as a inner join goods_num as b on a.id=b.goods_id inner join num as c on b.num_id=c.id where a.id=#{id}
</select>
</mapper>
三表
涉及三个表 两个主表 一个连接表
主表goods
id int
name varchar(255)
price double
picture varchar(255)
brand varchar(255)1 宝马1系 246800000 img/宝马1系.jpg 宝马
2 宝马2系 269800000 img/宝马2系.jpg 宝马
3 宝马5系 499900000 img/宝马5系.jpg 新能源
连接表goods_num
goods_id int
num_id int1 1
2 2
3 3
主表num
id int
num int1 200
2 300
3 800
创建实体类Model
Goods
package com.model;
public class Goods {
// 实体类
private int id;
private String name;
private double price;
private String picture;
private String brand;
private int num;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
这里 相信大家会疑惑为什么三个表只有一个实体类???
而不是三个实体类或者两个实体类
我这里是偷工了一下 直接将需要展示的数据汇在一个实体类里面了
主要是带大家去实现这个mybatis-web
接下来去定义一下接口方法
这里我创建了个com.mapper包
Mapper
Mapper 接口
package com.mapper;
import java.util.List;
import com.model.Goods;
public interface Mapper {
// 测试方法的接口
List<Goods> selectAllUsers();
List<Goods> selectNumById(int id);
}
再来就是去连接数据库mysql 这里我用工具dao
工具Dao
GetMybatis 类
package com.dao;
import java.io.IOException;
import java.io.Reader;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class GetMybatis {
/**
* 创建连接xml环境
* @throws IOException
*/
public static SqlSessionFactory GetConn(){
Reader read = null;
try {
// 获取xml的配置
read = Resources.getResourceAsReader("mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
// 加载配置
return new SqlSessionFactoryBuilder().build(read);
}
}
ProductDao 类
主要是mysql操作
package com.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import com.mapper.Mapper;
import com.model.Goods;public class ProductDao {
/**
* 测试方法
*/
public static List<Goods> GetInfo() {
SqlSessionFactory factory = GetMybatis.GetConn();
SqlSession session = factory.openSession();
Mapper db = session.getMapper(Mapper.class);
List<Goods> list = db.selectAllUsers();
return list;
}
public static List<Goods> GetById(int id) {
SqlSessionFactory factory = GetMybatis.GetConn();
SqlSession session = factory.openSession();
Mapper db = session.getMapper(Mapper.class);
List<Goods> list = db.selectNumById(id);
return list;
}
// 测试连接方法
// public static void main(String[] args) {
// System.out.println(ProductDao.GetInfo());
// }
}
到这里,我们就来到servlet和jsp的操作了,前面都是项目的结构实现和mybatis的配置,
建议新手是在前面哪里进行测试是否有实现成功。
servlet-jsp
servlet结构
jsp结构
首先创建一个首页跳转jsp
inder.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="1;url=ListServlet">
<title>首页</title>
</head>
<body></body>
</html>
<meta http-equiv="refresh" content="1;url=ListServlet">这里是一个跳转到ListServlet的操作
跳转不成功错误问题如下:
1.jsp的放置路径不对
2.代码错误
3..........
ListServlet
package com.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.dao.ProductDao;
import com.model.Goods;/**
* Servlet implementation class ListServlet
*/
@WebServlet("/ListServlet")
public class ListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ListServlet() {
super();
// TODO Auto-generated constructor stub
}/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 请求字符编码为UTF-8 注意要为大写
request.setCharacterEncoding("UTF-8");
// 执行测试方法
List<Goods> list = ProductDao.GetInfo();
// 封装数据打包
request.setAttribute("list",list);
// request跳转到list.jsp
request.getRequestDispatcher("list.jsp").forward(request, response);
}}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品页面</title>
</head>
<style>
#list{
width: 800px;
margin: 10px auto;
}
h1{
text-align: center;
color: red;
}
a{
text-decoration: none;
}
#add{
float: left;
}
table{
width: 900px;
border-collapse: collapse;
}
table tr,th,td{
text-align: center;
border: 1px solid gray;
}
#row:hover{
background-color: #7FFFD4;
}
</style>
<script type="text/javascript">
function lst(id) {
var flag = window.confirm("您确认查看详情?")
if(flag){
location.href='LstServlet?id='+id
}
}
</script>
<body>
<div id = "list">
<h1>神秘商店</h1>
<table id = "ta">
<tr id = "top">
<th>序号</th>
<th>名称</th>
<th>价格</th>
<th>图片</th>
<th>品牌</th>
<th>操作</th>
</tr>
<c:forEach var="d" items="${list}" varStatus="lst">
<tr id = "row">
<td>${d.id}</td>
<td>${d.name}</td>
<td>${d.price}</td>
<td><img src = "${d.picture}"></td>
<td>${d.brand}</td>
<td><a href="javascript:lst(${d.id})">详情</a></td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
用JavaScript跳转到LstServlet
function lst(id) {
var flag = window.confirm("您确认查看详情?")
if(flag){
location.href='LstServlet?id='+id
}
}
LstServlet
package com.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.dao.ProductDao;
import com.model.Goods;/**
* Servlet implementation class LstServlet
*/
@WebServlet("/LstServlet")
public class LstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LstServlet() {
super();
// TODO Auto-generated constructor stub
}/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 请求字符编码为UTF-8 注意要为大写
request.setCharacterEncoding("UTF-8");
// 响应字符编码为UTF-8 注意要为大写
response.setCharacterEncoding("UTF-8");
// 获取请求时携带的id
int id = Integer.parseInt(request.getParameter("id"));
// 执行测试方法
List<Goods> list = ProductDao.GetById(id);
// 封装数据打包
request.setAttribute("list", list);
// request跳转到lst.jsp
request.getRequestDispatcher("lst.jsp").forward(request, response);
}}
lst.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品页面</title>
</head>
<style>
#list{
width: 800px;
margin: 10px auto;
}
h1{
text-align: center;
color: red;
}
a{
text-decoration: none;
}
#add{
float: left;
}
table{
width: 900px;
border-collapse: collapse;
}
table tr,th,td{
text-align: center;
border: 1px solid gray;
}
#row:hover{
background-color: #7FFFD4;
}
</style>
<body>
<div id = "list">
<h1>神秘商店详情物品</h1>
<table id = "ta">
<tr id = "top">
<th>名称</th>
<th>价格</th>
<th>图片</th>
<th>库存</th>
</tr>
<c:forEach var="d" items="${list}" varStatus="lst">
<tr id = "row">
<td>${d.name}</td>
<td>${d.price}</td>
<td><img src = "${d.picture}"></td>
<td>${d.num}</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
咋们看看成品吧!!!
好啦!!!到这里就结束了 当然这种方法里面还有很多没有优化,比如:
接口的开关
实体类的用法
缓存问题
这些就靠大家自己去优化啦!
Mybatis-Web实际项目开发操作(优化)
在实际项目开发中,我们知道mybatis是一个sql持久化工具,所以我们要对接口进行管理从而减少开发中的内存和缓存。同时对重一个操作进行模板化,这是实际Java开发中的需求。
其实接着上一次的操作中,只有mybatis是不足的,所以我们对他进行改造。
那么现在我们就来优化一下不足的地方。
mybatis优化
Mapper.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">
<mapper namespace="com.mapper.Mapper">
<select id="selectAllUser" resultType="Goods">
select * from goods
</select>
<select id="selectById" resultMap="selectId">
select a.name as name,a.price as price,a.picture as picture,c.id as id from goods as a inner join goods_num as b on a.id=b.goods_id
inner join num as c on b.num_id=c.id
where a.id=#{id}
</select>
<resultMap type="Goods" id="selectId">
<association property="num" javaType="Num" column="id" select="byId"/>
</resultMap>
<select id="byId" resultType="Num">
select * from num where id=#{id}
</select>
</mapper>
这里我们用的是嵌套 不懂可以去了解一下mybatis的内容
Mapper(优化)
package com.mapper;
import java.util.List;
import com.model.Goods;
public interface Mapper {
// 测试方法的接口
List<Goods> selectAllUsers();
List<Goods> selectNumById(int id);
}
ProductDao(优化)
package com.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import com.mapper.Mapper;
import com.model.Goods;public class ProductDao {
/**
* 测试方法
*/
public static List<Goods> GetInfo() {
SqlSessionFactory factory = GetMybatis.GetConn();
SqlSession session = factory.openSession();
Mapper db = session.getMapper(Mapper.class);
List<Goods> list = db.selectAllUsers();
return list;
}
public static List<Goods> GetById(int id) {
SqlSessionFactory factory = GetMybatis.GetConn();
SqlSession session = factory.openSession();
Mapper db = session.getMapper(Mapper.class);
List<Goods> list = db.selectNumById(id);
return list;
}
// 测试连接方法
// public static void main(String[] args) {
// System.out.println(ProductDao.GetInfo());
// }
}
com.model(优化)
好啦!!!优化完成了这样子在实际开发中不管遇到查询,修改,新增,插入。
大家都是没有问题的。