1.Mybatis:jdbc操作数据库的封装 持久化框架
a)创建 Mybatis 的配置文件:
b)sql语句放入映射文件中
2.持久化 :把瞬时状态的数据和持久状态数据转换的机制
瞬时状态:存放在内存中的临时数据,jvm停止 数据丢失
持久状态:存放在硬盘中的数据,不管jvm 数据都在
3.完成持久化的操作:
jdbc:
executeQuery :
executeUpdate :
io流
InputStream
OutPutStream
4.如何使用MyBatis
a)要添加MyBatis需要的jar文件
WEB-INF/lib 中
b)添加操作数据的驱动包
WEB-INF/lib
c)在 src 下创建mybatis的配置文件,以 xml 格式编译
d)创建 对应表的映射文件,用于编写 相应的sql语句
必须把该映射文件 添加到配置文件中
e)编写java代码完成数据库操作
api:应用程序接口,列出所有的类结构
5.如果把配置文件引用的dtd 设置为本地访问
dtd 通常 使用的是一个网址
把网址 映射为 本地的一个 文件
a)先找到 那个文件
b)再把 文件与 dtd 使用的网址 关联
6.MyBatis 操作数据库的步骤
a)创建配置文件
b)创建映射文件 ,并在配置文件中配置
c)在java类中读取配置文件
d)根据读取的配置文件 创建 SqlSessionFactory 对象
e)从SqlSessionFactory 中 打开 SqlSession 数据库链接
f)调用SqlSession中的方法
insert
delete
update
select
g)关闭SqlSession链接
只要jsp 显示的数据 来自于数据库中,那么必须先访问serlvet 在跳转到jsp中显示
如何实现两个系统共享数据
oa
crm
操作同一个数据库
使用触发器
使用过程
关于一些jsp页面的一些东西:
登录过滤器:
a)创建 Mybatis 的配置文件:
b)sql语句放入映射文件中
2.持久化 :把瞬时状态的数据和持久状态数据转换的机制
瞬时状态:存放在内存中的临时数据,jvm停止 数据丢失
持久状态:存放在硬盘中的数据,不管jvm 数据都在
3.完成持久化的操作:
jdbc:
executeQuery :
executeUpdate :
io流
InputStream
OutPutStream
4.如何使用MyBatis
a)要添加MyBatis需要的jar文件
WEB-INF/lib 中
b)添加操作数据的驱动包
WEB-INF/lib
c)在 src 下创建mybatis的配置文件,以 xml 格式编译
d)创建 对应表的映射文件,用于编写 相应的sql语句
必须把该映射文件 添加到配置文件中
e)编写java代码完成数据库操作
api:应用程序接口,列出所有的类结构
5.如果把配置文件引用的dtd 设置为本地访问
dtd 通常 使用的是一个网址
把网址 映射为 本地的一个 文件
a)先找到 那个文件
b)再把 文件与 dtd 使用的网址 关联
6.MyBatis 操作数据库的步骤
a)创建配置文件
b)创建映射文件 ,并在配置文件中配置
c)在java类中读取配置文件
d)根据读取的配置文件 创建 SqlSessionFactory 对象
e)从SqlSessionFactory 中 打开 SqlSession 数据库链接
f)调用SqlSession中的方法
insert
delete
update
select
g)关闭SqlSession链接
只要jsp 显示的数据 来自于数据库中,那么必须先访问serlvet 在跳转到jsp中显示
如何实现两个系统共享数据
oa
crm
操作同一个数据库
使用触发器
使用过程
带框架的完整项目结构:
<?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 指的是 该文件中 sql语句访问的位置
通常是文件所在的 包名+文件名
每一个映射文件的namespace 必须 唯一
-->
<mapper namespace="com.neu.dao.UserInfoDao">
<!-- 向表中添加一行数据 -->
<!-- #{} 表示获取名为谁的数据
#{u_name} 从Map集合中获取 key 为u_name的值
-->
<insert id="save" parameterType="java.util.Map">
insert into user_info(u_id,u_name,u_sex,u_birth)
values(seq_user_id.nextval,#{u_name},#{u_sex},#{u_birth})
</insert>
<delete id="delete" parameterType="java.util.Map">
delete from user_info where 1=1 and u_id in (${u_id})
</delete>
<update id="update" parameterType="java.util.Map">
update user_info set u_name=#{u_name},u_sex=#{u_sex}
where u_id=#{u_id}
</update>
<!--
查询到的每一行 用 一个 Map 集合封装
-->
<select id="search" resultType="com.neu.util.MyMap" parameterType="Map">
select * from user_info where 1=1
</select>
</mapper>
package com.neu.util;
import java.util.HashMap;
public class MyMap extends HashMap {
@Override
public Object put(Object key, Object value) {
return super.put(key.toString().toLowerCase(), value);
}
}
package test;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 Test {
public static void main(String[] args) {
try {
//读取配置文件
Reader reader=Resources
.getResourceAsReader("mybatis_conf.xml");
// 创建 链接数据库的工厂类
SqlSessionFactory factory=
new SqlSessionFactoryBuilder()
.build(reader);
// 获取数据库的链接,
// openSession()获取的session需要自己手动提交事务
// openSession(true) 获取的session会自动提交事务
SqlSession session=factory.openSession(true);
Map<String,String> map=new HashMap<String,String>();
// map中的key 必须是表中列名
map.put("u_sex", "女");
// 第一个参数:操作sql语句的 命名空间+id
// 第二个参数:sql需要的参数
// int row=session
// .insert("com.neu.dao.UserInfoDao.save", map);
// List<Map<String, String>> list=
// session.selectList("com.neu.dao.UserInfoDao.search",map);
// System.out.println(list);
//
// //session.commit();
// session.close();
map=new HashMap<String,String>();
map.put("u_id", "3,4");
int row=session.delete("com.neu.dao.UserInfoDao.delete", map);
System.out.println(row);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:shanke"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/neu/dao/UserInfoDao.xml"/>
</mappers>
</configuration>
更进一步
package com.neu.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.neu.util.MyBatisUtil;
public class BaseDao {
protected SqlSession session;
private String nameSpace;
public BaseDao(String nameSpace){
this.nameSpace=nameSpace;
}
protected final void getSession(){
this.session=MyBatisUtil.getSession();
}
protected final void close(){
MyBatisUtil.close(session);
}
public final int insert(String id,Object param){
int row=0;
try {
getSession();
row=session.insert(nameSpace+"."+id, param);
session.commit();
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
close();
}
return row;
}
public final int update(String id,Object param){
int row=0;
try {
getSession();
row=session.update(nameSpace+"."+id, param);
session.commit();
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
close();
}
return row;
}
public final int delete(String id,Object param){
int row=0;
try {
getSession();
row=session.delete(nameSpace+"."+id, param);
session.commit();
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
close();
}
return row;
}
public final List<Map<String,String>> search(String id,Object param){
List<Map<String,String>> list=null;
try {
getSession();
list=session.selectList(nameSpace+"."+id, param);
} catch (Exception e) {
throw new RuntimeException(e);
} finally{
close();
}
return list;
}
}
package com.neu.dao.impl;
import com.neu.dao.BaseDao;
/**
*
* @author Administrator
* <p>1.告诉BaseDao使用的nameSpace是什么</p>
* <p>2.做特殊sql语句的处理</p>
*
*/
public class UserInfoDao extends BaseDao {
public UserInfoDao(){
super("com.neu.dao.UserInfoDao");
}
}
package com.neu.service;
import java.util.Map;
import com.neu.dao.impl.UserInfoDao;
public class UserInfoService {
private UserInfoDao userInfoDao;
public UserInfoService(){
this.userInfoDao=new UserInfoDao();
}
public boolean doSave(Map<String, String[]> params){
boolean flag=false;
Map<String,String> map=null;
//Map<String,String> map=ConvertUtil.convertMap(params);
try {
int row =userInfoDao.insert("save", map);
if(row>0){
flag=true;
}
} catch (Exception e) {
//使用log4j记录日志
}
return flag;
}
}
package com.neu.util;
import java.util.HashMap;
import java.util.Map;
public class ConvertUtil {
public static Map<String, String> converterMap(Map<String,String[]> params){
Map<String, String> map=null;
if(null != params && params.size()>0){
map=new HashMap<String, String>();
for(Map.Entry<String,String[]> entry:params.entrySet()){
String key=entry.getKey();
String[] values=entry.getValue();
String value="";
if(null != values && values.length>0){
// String temp=Arrays.toString(values);//
// temp=temp.replace("[", "").replace("]", "")
// .replace(" ", "");
for(String str:values){
value+=","+str;
}
value=value.substring(1);
}
map.put(key, value);
}
}
return map;
}
}
package com.neu.util;
import java.security.MessageDigest;
public class Md5Utils {
static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
public final static String md5(String s) {
try {
byte[] btInput = s.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
package com.neu.util;
import java.io.IOException;
import java.io.Reader;
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;
static{
try {
Reader reader=Resources
.getResourceAsReader("mybatis_conf.xml");
factory=new SqlSessionFactoryBuilder()
.build(reader);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSession getSession(){
if(factory == null){
throw new RuntimeException("sqlFactroy构建失败");
}
SqlSession session=factory.openSession();
return session;
}
public static void close(SqlSession session){
if(session!=null){
try {
session.close();
} catch (Exception e) {
e.printStackTrace();
} finally{
session=null;
}
}
}
}
package com.neu.util;
import java.util.HashMap;
@SuppressWarnings("all")
public class MyMap extends HashMap {
@Override
public Object put(Object key, Object value) {
// TODO Auto-generated method stub
return super.put(key.toString().toLowerCase(), value);
}
}
<?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.neu.dao.UserInfoDao">
<!-- map.put("a","zhangsan")
#{a} 表示 使用 ?占位符 ? 再赋值 为 zhangsan
${a} 表示 直接获取数据显示 zhangsan
-->
<insert id="save" parameterType="Map">
insert into user_info(u_id,u_name,u_sex,u_birth)
values(seq_user_id.nextval,#{u_name},#{u_sex},#{u_birth})
</insert>
<sql id="">
<include refid=""></include>
</sql>
</mapper>
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:shanke"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/neu/dao.UserInfoDao.xml"/>
</mappers>
</configuration>
关于一些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>Insert title here</title>
<style type="text/css">
table {
width: 70%;
min-width: 500px;
max-width: 700px;
border: 1px solid black;
border-collapse: collapse;
}
td{
border: 1px solid black;
text-align: center;
}
tr:hover{
background-color: gray;
}
</style>
</head>
<body>
<form action="TeasDeleteServlet" method="post" onsubmit="return checkForm();">
<!-- 1 T1001 张飞 sasss -->
<table>
<tr>
<td>
<input type="checkbox" onclick="show(this.checked)">
</td>
<td>编号</td>
<td>姓名</td>
<td>联系电话</td>
<td>操作</td>
</tr>
<c:forEach items="${sessionScope.teas}" var="tea" varStatus="i">
<tr>
<td><!-- 把主键的值 赋值给复选框 -->${i.index }
<input type="checkbox" id="tea_${tea.tea_id }" name="tea_id" value="${tea.tea_id }">
</td>
<td>${tea.tea_no }</td>
<td>${tea.tea_name }</td>
<td>${tea.tea_tel }</td>
<td>
<a href="#" onclick="doDelete('${tea.tea_id }','${tea.tea_name }')">删除</a>
<a href="#" onclick="toEdit('${tea.tea_id }')">修改</a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="5" align="center">
<input type="submit" value="批量删除">
</td>
</tr>
</table>
</form>
</body>
<script type="text/javascript">
function show(flag)
{
var chs=document.getElementsByName("tea_id");
for(var i=0;i<chs.length;i++)
{
chs[i].checked=flag;
//chs[i].checked=!chs[i].checked;
}
}
function doDelete(id,name)
{
show(false);
document.getElementById("tea_"+id).checked=true;
var f=confirm("你确定要删除【"+name+"】数据吗?");
if(f)
{
//url 重写
window.parent.window.location.href="TeasDeleteServlet?tea_id="+id;
}
}
function checkForm()
{
var index=0;
var chs=document.getElementsByName("tea_id");
for(var i=0;i<chs.length;i++)
{
if(chs[i].checked)
{
index=1;
break;
}
}
if(index==0){
alert("请选择要删除的数据!!!");
return false;
}
var f=confirm("你确定要删除这些数据吗?");
return f;
}
function toEdit(id)
{
window.parent.window.location.href="ToEditServlet?tea_id="+id;
}
</script>
</html>
登录过滤器:
package com.neu.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet Filter implementation class LoginFilter
*/
@WebFilter({ "*.jsp", "/*Servlet"})
public class LoginFilter implements Filter {
/**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
String uri=req.getRequestURI();
if(uri.endsWith("login.jsp")
||uri.endsWith("LoginServlet")
||uri.endsWith("center.jsp")){
chain.doFilter(request, response);
}else{
HttpSession session=req.getSession();
Object obj=session.getAttribute("user");
if(obj==null){
resp.sendRedirect("center.jsp");
}else{
chain.doFilter(request, response);
}
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}