mybatis+servlet实现curd

效果图

在这里插入图片描述

搭建项目框架

  1. 导入jar包
    在这里插入图片描述
  2. 准备配置文件
    2.1 mybatis核心配置文件
<?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加载外部文件 -->
   <properties resource="db.properties" />
   <!-- settings标签 用于设置和改变 MyBatis 运行中的行为-->
   <settings>
   	<!-- 设置MyBatis使用log4j日志支持 -->
   	<setting name="logImpl" value="LOG4J"/>
   </settings>
   <!-- typeAliases给实体类起别名,在映射文件中指定类型就可以使用类名首字母小写,不用写全类名 -->
   <typeAliases>
   	<package name="cn.sxt.pojo" />
   </typeAliases>
   <!-- MyBatis 可以配置多套运行环境,如开发环境、测试环境、生产环境等,我们可以灵活选择不同的配置,从而将 SQL 映射应用到不同的数据库环境上 
   	environments 元素节点下通过配置多个 environment 子元素节点,实现配置多套运行环境,但是不管增加几套运行环境,都必须要明确选择出当前的唯一一个运行环境(即默认运行环境:通过 default 指定)
   -->
   <environments default="dev">
   	<environment id="dev">
   		<!-- 配置事务管理,采用 JDBC 的事务管理 -->
   		<transactionManager type="JDBC" />
   		<!-- POOLED:mybatis 自带的数据源,JNDI:基于 Tomcat 的数据源 -->
   		<dataSource type="POOLED">
   			<property name="driver" value="${jdbc.driver}"/>
   			<property name="url" value="${jdbc.url}"/>
   			<property name="username" value="${jdbc.username}"/>
   			<property name="password" value="${jdbc.password}"/>
   		</dataSource>
   	</environment>
   	<!--测试环境-->
       <!-- 
       <environment id="test">
          
       </environment> 
       -->
   </environments>
   <!-- mappers:映射器,在 <mappers> 中有两个子元素 <package> 、<mapper> ,用来定义 SQL 的映射语句,
   我们只需要告诉 MyBatis 去哪里找到这些 SQL 语句(即去哪里找相应的 SQL 映射文件),整个项目中可以有1个或多个SQL 映射文件。-->
   <mappers>
   	<!-- 注意:这种方式必须保证接口名和 SQL 映射文件名相同,还必须在同一个包中 -->
   	<package name="cn.sxt.mapper" />
   </mappers>
</configuration>

2.2 jdbc配置文件

jdbc.driver=com.mysql.jdbc.Driver
#useUnicode是否使用unicode字符集;characterEndoding:指定要使用的字符编码
jdbc.url=jdbc:mysql://localhost:3306/project?useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=admin

2.3 log4j配置文件

# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=ERROR, CONSOLE
# log4j.rootCategory=DEBUG, CONSOLE, LOGFILE

# 单独设置SQL语句的输出级别为DEBUG级别
# 语法:log4j.logger.映射文件所在包名=DEBUG
log4j.logger.cn.sxt.mapper=DEBUG

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n

建表

在这里插入图片描述

项目结构

在这里插入图片描述

实体类

在这里插入图片描述

dao接口

public interface ProductDao {

	List<Product> selProduct(int pid);
	int add(Product product);
	int upd(Product product);
	int del(int pid);
}
public interface BrandDao {

	List<Brand> selAll();
}

映射文件

BrandDao.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">
<!-- 通过namespace绑定dao接口,作为dao接口的实现类 -->
<mapper namespace="cn.sxt.mapper.BrandDao">

	<!-- 查询所有brand表中的数据
		id:唯一标识符,此文件中的id值不能重复;与dao接口中的方法名一致
		resultType:返回值类型,指定返回值是brand类型,如果返回多条dao接口方法的返回值就定义为list
		如果核心配置文件配置过别名,那么这里可以Brand、brand,不区分大小写
	-->
	<select id="selAll" resultType="brand">
		select * from brand
	</select>

</mapper>

ProductDao.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">
<!-- 通过namespace绑定dao接口,作为dao接口的实现类 -->
<mapper namespace="cn.sxt.mapper.ProductDao">

	<!-- type:封装成哪个实体类;id:此resultmap的唯一标识 -->	
	<resultMap type="product" id="productMap">
		<!-- id标签:主键映射 -->
		<!-- column:数据库表中的列名 -->
		<!-- property:实体类中的属性名 -->
		<id column="pid" property="pid"/>
		<!-- result标签:除主键外其他基本数据库表字段到实体类属性的映射 -->
		<result column="pname" property="pname"/>
		<result column="price" property="price"/>
		<result column="prodate" property="prodate"/>
		<result column="brandid" property="brandid"/>
		<!-- association标签:复杂类型的结合,如对象;多个结果合成一个对象; -->
		<!-- property:多个结果合成的对象名字,即在product实体类中的那个复杂类型的属性名 -->
		<association property="brand" column="brandid" javaType="brand">
			<id column="id" property="id"/>
			<result column="name" property="name"/>
		</association>
	</resultMap>
	
	<!-- 查询所有product表中的数据
		id:唯一标识符又称为statementID,此文件中的id值不能重复;与dao接口中的方法名一致
		parameterType:指定参数类型,如果是基本数据类型,则sql语句中的占位符#{}里面可以随便写
		resultMap:查询到的结果集按照productMap的格式进行匹配
	-->
	<select id="selProduct" parameterType="int" resultMap="productMap">
		SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name  FROM product p
		LEFT JOIN brand b ON p.brandid=b.id
		WHERE 1=1 
		<if test="value != 0">
			and p.pid=#{value}
		</if>
	</select>

	<!-- parameterType:指定参数类型,如果是实体类,则sql语句占位符#{}必须写实体类中对应的属性名 -->
	<insert id="add" parameterType="product">
		INSERT INTO  product ( pname, price, brandid, prodate ) 
		VALUES ( #{pname}, #{price}, #{brandid}, #{prodate} ) 
	</insert>
	<update id="upd" parameterType="product">
		UPDATE product  
		SET pname = #{pname}, price = #{price}, brandid = #{brandid}, prodate = #{prodate} 
		WHERE pid = #{pid} 
	</update>
	<delete id="del" parameterType="int">
		DELETE FROM product WHERE pid = #{pid} 
	</delete>
</mapper>

mybatis工具类

package cn.sxt.util;

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;

public class MyBatisUtil {

	private static SqlSessionFactory factory = null;

	static {
		try {
			/*加载mybatis核心配置文件*/
			InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
			/*根据核心配置文件,构建出sqlsessionfactory*/
			factory = new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static SqlSession getSession() {
		SqlSession session = null;
		if (factory != null) {
			/*创建sqlsession对象*/
			// true表示开启自动提交
			session = factory.openSession(true);
			//session = factory.openSession();
		}
		return session;
	}
}

service接口

在这里插入图片描述

service实现类

brandServiceImpl

package cn.sxt.service.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import cn.sxt.pojo.Brand;


import cn.sxt.mapper.BrandDao;
import cn.sxt.service.BrandService;
import cn.sxt.util.MyBatisUtil;
public class BrandServiceImpl implements BrandService{
	SqlSession sqlsession = MyBatisUtil.getSession();
	private BrandDao brandDao = sqlsession.getMapper(BrandDao.class);
	@Override
	public List<Brand> selAll() {
		return brandDao.selAll();
	}
}

productServiceImpl

package cn.sxt.service.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletConfig;

import org.apache.ibatis.session.SqlSession;

import cn.sxt.mapper.BrandDao;
import cn.sxt.mapper.ProductDao;
import cn.sxt.pojo.Product;
import cn.sxt.service.ProductService;
import cn.sxt.util.MyBatisUtil;

public class ProductServiceImpl implements ProductService{

	private ProductDao productDao = MyBatisUtil.getSession().getMapper(ProductDao.class);
	@Override
	public List<Product> selAll() {
		/*映射文件中有动态sql判断,如果参数为0则查询所有商品信息*/
		return productDao.selProduct(0);
	}
	@Override
	public Product selById(int pid) {
		/*映射文件中有动态sql判断,如果参数不为0则根据pid查询商品信息,接口方法返回值为list集合,返回集合第一个元素*/
		return productDao.selProduct(pid).get(0);
	}
	@Override
	public int add(Product product) {
		return productDao.add(product);
	}
	@Override
	public int upd(Product product) {
		return productDao.upd(product);
	}
	@Override
	public int del(int pid) {
		return productDao.del(pid);
	}
}

servlet、jsp代码同之前一篇博客,不再展示

servlet、jsp代码见:spring+jdbctemplate+servlet实现curd

jsp上遇到了一个问题,就是添加、修改的时候输入的日期可以自动转化存储到数据库中,但是查询的时候,直接展示,日期会展示为:
在这里插入图片描述
列表展示的时候有同样问题
解决方案:使用jstl格式化库

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!-- 声明jstl核心库 -->	
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 声明jstl格式化库 -->
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品信息列表</title>
.........省略部分代码.........
<c:forEach items="${list }" var="pro">
			<tr>
				<td>${pro.pid }</td>
				<td>${pro.pname }</td>
				<td>${pro.price }</td>
				<td>${pro.brand.name }</td>
				<!-- 格式化显示生产日期,使用了jstl的格式化库 -->
				<td><fmt:formatDate value='${pro.prodate }' pattern='yyyy-MM-dd' /></td>
				<td>
					<a href="pro?method=toUpdate&pid=${pro.pid }">编辑</a> 
					<a href="pro?method=delete&pid=${pro.pid }">删除</a>
				</td>
			</tr>
		</c:forEach>

后台运行效果(log4j)

- ==>  Preparing: UPDATE product SET pname = ?, price = ?, brandid = ?, prodate = ? WHERE pid = ? 
- ==> Parameters: 七彩云南茶叶(String), 119.0(Double), 7(Integer), null, 4(Integer)
- <==    Updates: 1
- ==>  Preparing: SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name FROM product p LEFT JOIN brand b ON p.brandid=b.id WHERE 1=1 
- ==> Parameters: 
- <==      Total: 1
- ==>  Preparing: SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name FROM product p LEFT JOIN brand b ON p.brandid=b.id WHERE 1=1 and p.pid=? 
- ==> Parameters: 4(Integer)
- <==      Total: 1
- ==>  Preparing: select * from brand 
- ==> Parameters: 
- <==      Total: 4
- ==>  Preparing: UPDATE product SET pname = ?, price = ?, brandid = ?, prodate = ? WHERE pid = ? 
- ==> Parameters: 七彩云南茶叶(String), 119.0(Double), 7(Integer), 2019-01-01 00:01:00.0(Timestamp), 4(Integer)
- <==    Updates: 1
- ==>  Preparing: SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name FROM product p LEFT JOIN brand b ON p.brandid=b.id WHERE 1=1 
- ==> Parameters: 
- <==      Total: 1
- ==>  Preparing: INSERT INTO product ( pname, price, brandid, prodate ) VALUES ( ?, ?, ?, ? ) 
- ==> Parameters: 传奇会茶叶(String), 99.0(Double), 4(Integer), 2011-01-01 00:01:00.0(Timestamp)
- <==    Updates: 1
- ==>  Preparing: SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name FROM product p LEFT JOIN brand b ON p.brandid=b.id WHERE 1=1 
- ==> Parameters: 
- <==      Total: 2
- ==>  Preparing: SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name FROM product p LEFT JOIN brand b ON p.brandid=b.id WHERE 1=1 and p.pid=? 
- ==> Parameters: 5(Integer)
- <==      Total: 1
- ==>  Preparing: UPDATE product SET pname = ?, price = ?, brandid = ?, prodate = ? WHERE pid = ? 
- ==> Parameters: 传奇会茶叶(String), 99.0(Double), 4(Integer), 2019-01-09 00:09:00.0(Timestamp), 5(Integer)
- <==    Updates: 1
- ==>  Preparing: SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name FROM product p LEFT JOIN brand b ON p.brandid=b.id WHERE 1=1 
- ==> Parameters: 
- <==      Total: 2
- ==>  Preparing: DELETE FROM product WHERE pid = ? 
- ==> Parameters: 4(Integer)
- <==    Updates: 1
- ==>  Preparing: SELECT p.pid,p.pname,p.prodate,p.price,p.brandid,b.id,b.name FROM product p LEFT JOIN brand b ON p.brandid=b.id WHERE 1=1 
- ==> Parameters: 
- <==      Total: 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值