开发工具:MyEclipse 6.0 ,Tomcat 5.5 ,JDK 1.5  ,MySQL 5.0 ;开发准备:下载Struts 2.0和Hibernate 3.2,大家可Struts和Hibernate的官方网站下载这两个框架。我们先来总览一下开发完成后的包—类图:

首先NEW一个Web Project ,名为"LoginSystem" ,在 lib 目录下加入Struts 2.0的Jar包和Hibernate 3.2的Jar包,然后按下面的步骤来:

1、在 src 目录下建 "hibernate.cfg.xml" 全部代码如下:

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory> <property name="connection.username">root</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/testmysql
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="myeclipse.connection.profile">
mysql
</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="show_sql">true</property>
<!-- POJO类映射配置 -->
<mapping resource="com/rong/ORM/User.hbm.xml" /> </session-factory>
</hibernate-configuration>

  

 

2、建立实体类 "User.java" 及其映射文件 "User.hbm.xml" 两者都放在 "com.rong.ORM" 包下。其中"User.java"的代码如下:

package com.rong.ORM;

public class User {
private int id; //主键ID
private String name; //用户名
private String pwd; //密码 /*
* Getter方法与Setter方法
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} }

  

 

User.hbm.xml的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.rong.ORM.User" table="tb_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" type="java.lang.String" length="20"/>
<property name="pwd" type="java.lang.String" length="20"/>
</class>
</hibernate-mapping>

  

 

3、建立"ExportDB.java"工具类,我们执行如下代码,就能轻松将User类导入数据库转变成数据库中的表。不过,前提是我们已经在MySQL中建立了一个名为"LoginSystem"的数据库。

package tool;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport; public class ExportDB { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true); } }

  

 

4、建立获取SessionFactory和管理Session的HibernateUtil.java类:

package com.rong.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil {
//声明Hibernate配置文件所在的路径
private static String configFile = "/hibernate.cfg.xml";
//建Configuration对象
private static Configuration configuration = new Configuration();
//建Session工厂对象
private static SessionFactory sessionFactory = null; /**
* 单例模式,只初始化一次,只产生一个SessionFactory对象(线程安全)
*/
static {
try{
//通过hibernate.cfg.xml配置数据库连接
configuration.configure(configFile);
//建立一个Session工厂
sessionFactory = configuration.buildSessionFactory();
System.out.println("[标记]初始化SessionFactory");
}catch(Exception e){
System.out.println("[异常]创建SessionFactory时发生异常,异常原因如下:");
e.printStackTrace();
}
} /**
* getSession()方法
* @return Session对象
* @throws HibernateException
*/
public Session getSession(){
Session session = null;
try{
session = sessionFactory.openSession();
}catch(Exception e){
System.out.println("[异常]开启Session时发生异常,异常原因如下:");
e.printStackTrace();
}
return session;
} /**
* closeSession()方法
* @param session 要关闭的Session对象
*/
public void closeSession(Session session){
try{
if(null != session)
session.close();
}catch(Exception e){
System.out.println("[异常]关闭Session时发生异常,异常原因如下:");
e.printStackTrace();
}
} }

  

 

5、DAO层设计:在"com.rong.DAO" 包下建立两个类,一个是接口,一个是实现类,其中UserDao.java代码如下:

package com.rong.DAO;

import java.util.List;
import com.rong.ORM.User; public interface UserDao { /**
* 增加用户
* @param user 要增加的用户
*/
public void add(User user); /**
* 登录验证
* @param name
* @param password
* @return -1:不存在用户名 ; -2:密码不正确 ; >0:登录成功(即返回该记录ID)
*/
public int isExist(String name,String password); }

  

 

UserDaoImpl.java的代码如下

package com.rong.DAO;

import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.rong.ORM.User;
import com.rong.hibernate.HibernateUtil; public class UserDaoImpl implements UserDao { HibernateUtil util = new HibernateUtil(); /**
* 增加用户
* @param user 要增加的用户
*/
public void add(User user){
Session session = util.getSession();
Transaction ts = null;
try{
ts = session.beginTransaction();
session.save(user);
ts.commit();
}catch(Exception e){
System.out.println("UserDaoImpl.add()方法发生异常:");
e.printStackTrace();
}finally{
util.closeSession(session);
}
} /**
* 登录验证
* @param name
* @param password
* @return -1:不存在用户名 ; -2:密码不正确 ; >0:登录成功(即返回该记录ID)
*/
public int isExist(String name,String password){
//int state = 0 ; //初始化状态变量
Session session = util.getSession();
try{
Query query = session.createQuery("from User u where u.name = ?");
query.setString(0, name);
List list = query.list();
if(null == list || 0 == list.size()){
return -1 ; //用户名不存在
}
Query query2 = session.createQuery("from User u where u.name = ? and u.pwd = ?");
query2.setString(0, name);
query2.setString(1, password);
List list2 = query.list();
if(null == list2){
return -2 ; //密码不正确
}
Iterator it = list.iterator();
User user = (User)it.next();
return user.getId(); //验证成功,取ID值 }catch(Exception e){
System.out.println("UserDaoImpl.isExist()方法发生异常:");
e.printStackTrace();
return 0; //异常时返回0
}finally{
util.closeSession(session);
}
} }

  

 

6、在web.xml中配置Struts 2.0支持:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 用过滤器配置Struts2支持 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

  

 

7、登录页面login.jsp代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title>Login Page</title>
</head> <body>
<p><a href="register.jsp">用户注册</a>|用户登录</p>
<s:form action="loginAction" theme="simple">
<table>
<tr>
<td style="text-align:right">
账号
</td>
<td>
<s:textfield name="name" label="账号" /> </td>
</tr>
<tr>
<td style="text-align:right">
密码
</td>
<td>
<s:password name="pwd" label="密码" />
</td>
</tr>
<tr>
<td style="text-align:right">
验证码
</td>
<td>
<s:textfield name="inputCertCode" label="验证码" cssStyle="width:100px"/>
<img src="makeCertPic.jsp">
</td>
</tr>
<tr>
<td style="text-align:right">
<s:submit value="登录" />
</td>
<td style="text-align:left">
<s:reset value="取消"/>
</td>
</tr>
</table>
</s:form>
<s:fielderror cssStyle="color:red"/>
</body>
</html>

  

 

注册页register.jsp代码如下

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title>Register Page</title>
</head> <body>
<p><a href="login.jsp">用户登录</a>|用户注册</p>
<s:form action="registerAction" theme="simple" method="post">
<table>
<tr>
<td style="text-align:right">
请输入账号
</td>
<td>
<s:textfield name="user.name" label="账号" /> </td>
</tr>
<tr>
<td style="text-align:right">
请输入密码
</td>
<td>
<s:password name="user.pwd" label="密码" />
</td>
</tr>
<tr>
<td style="text-align:right">
请再次输入密码
</td>
<td>
<s:password name="repwd" label="重复密码" />
</td>
</tr>
<tr>
<td style="text-align:right">
请输入验证码
</td>
<td>
<s:textfield name="inputCertCode" label="验证码" cssStyle="width:100px"/>
<img src="makeCertPic.jsp">
</td>
</tr>
<tr>
<td style="text-align:right">
<s:submit value="注册" />
</td>
<td style="text-align:left">
<s:reset value="取消"/>
</td>
</tr>
</table>
</s:form>
<s:fielderror cssStyle="color:red"/>
</body>
</html>

  

 

8、在JSP页中所用到的验证码的生成页面makeCertPic.jsp(我们把它放在WebRoot的other目录下):

 <%@page contentType="image/jpeg" pageEncoding="gbk"%>
<jsp:useBean id="image" scope="page" class="com.rong.other.makeCertPic" />
<%
String str = image.getCertPic(0,0,response.getOutputStream());
// 将验证码保存到Session中
session.setAttribute("certCode", str);
%>

  

 

其中,它调用了名为makeCertPic的Bean ,这个类主要用来生成彩色的验证图片,其代码如下:

package com.rong.other;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO; /**
* 生成验证码图片
*/
public class makeCertPic {
//验证码图片中可以出现的字符集,可根据需要修改
private char mapTable[]={
'a','b','c','d','e','f',
'g','h','i','j','k','l',
'm','n','o','p','q','r',
's','t','u','v','w','x',
'y','z','0','1','2','3',
'4','5','6','7','8','9'};
/**
* 功能:生成彩色验证码图片
* 参数width为生成的图片的宽度,参数height为生成的图片的高度,参数os为页面的输出流
*/
public String getCertPic(int width, int height, OutputStream os) {
if(width<=0)width=60;
if(height<=0)height=20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
//画边框
g.setColor(Color.black);
g.drawRect(0,0,width-1,height-1);
// 取随机产生的认证码
String strEnsure = "";
// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
for(int i=0; i<4; ++i) {
strEnsure += mapTable[(int)(mapTable.length*Math.random())];
}
// 将认证码显示到图象中,如果要生成更多位的认证码,增加drawString语句
g.setColor(Color.black);
g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
String str = strEnsure.substring(0,1);
g.drawString(str,8,17);
str = strEnsure.substring(1,2);
g.drawString(str,20,15);
str = strEnsure.substring(2,3);
g.drawString(str,35,18);
str = strEnsure.substring(3,4);
g.drawString(str,45,15);
// 随机产生10个干扰点
Random rand = new Random();
for (int i=0;i<10;i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.drawOval(x,y,1,1);
}
// 释放图形上下文
g.dispose();
try {
// 输出图象到页面
ImageIO.write(image, "JPEG", os);
} catch (IOException e) {
return "";
}
return strEnsure;
}
}

  

 

9、此时,我们很有必要来配置一下struts.xml其全部代码如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="com.rong.action" extends="struts-default">
<!-- 用户登录 -->
<action name="loginAction" class="com.rong.action.LoginAction">
<result name="success" type="redirect">/back/index.jsp</result>
<result name="input">/login.jsp</result>
</action>
<!-- 用户注册 -->
<action name="registerAction" class="com.rong.action.RegisterAction">
<result name="success" type="redirect">/login.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
</struts>

  

 

10、Action层设计:两个非常关键的类,其中LoginAction.java的代码如下:

package com.rong.action;

 import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.rong.DAO.UserDao;
import com.rong.DAO.UserDaoImpl;
import com.rong.ORM.User; public class LoginAction extends ActionSupport { private UserDao userDao = new UserDaoImpl(); //操纵数据库DAO类(Hibernate实现),通过Struts.xml注入值 private int id;
private String name; //用户名(值由struts注入)
private String pwd; //密码(值由struts注入) private String inputCertCode; //验证码 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 String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} public String getInputCertCode() {
return inputCertCode;
}
public void setInputCertCode(String inputCertCode) {
this.inputCertCode = inputCertCode;
}
@Override
public String execute() throws Exception {
int state = userDao.isExist(name,pwd);
System.out.println("state="+state);
if(state == -1){
this.addFieldError("name", "用户名不正确,请先注册!");
return INPUT;
}else if(state == -2){
this.addFieldError("pwd", "密码不正确,请重新输入密码!");
return INPUT;
}else if(state > 0){
System.out.println("[测试]登录成功!用户ID="+state);
this.setId(state);
return SUCCESS;
}else{
this.addFieldError("name", "登录失败,请与管理员联系!");
return INPUT;
}
} public void validate() {
//验证码验证
if(null == inputCertCode || "".equals(inputCertCode)){
this.addFieldError("inputCertCode", "验证码不能为空!");
}else{
Map session = ActionContext.getContext().getSession();
String certCode = session.get("certCode").toString();
if( ! certCode.equals(this.inputCertCode)){
this.addFieldError("inputCertCode", "验证码不正确!");
}
} } }

  

 

RegisterAction.java的代码如下:

package com.rong.action;

 import java.util.Map;

 import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.rong.DAO.UserDao;
import com.rong.DAO.UserDaoImpl;
import com.rong.ORM.User; public class RegisterAction extends ActionSupport { private UserDao userDao = new UserDaoImpl(); private User user; //注册提交的用户对象 private String repwd; //重复密码 private String inputCertCode; //验证码 public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String getRepwd() {
return repwd;
} public void setRepwd(String repwd) {
this.repwd = repwd;
} public String getInputCertCode() {
return inputCertCode;
} public void setInputCertCode(String inputCertCode) {
this.inputCertCode = inputCertCode;
} @Override
public String execute() throws Exception {
userDao.add(user); //保存注册的user对象
return SUCCESS;
} /* @Override
public void validate() {
//验证码验证
if(null == inputCertCode || "".equals(inputCertCode)){
this.addFieldError("inputCertCode", "验证码不能为空!");
}else{
Map session = ActionContext.getContext().getSession();
String certCode = session.get("certCode").toString();
if( ! certCode.equals(this.inputCertCode)){
this.addFieldError("inputCertCode", "验证码不正确!");
}
} }*/ }

  

 

11、不要忘记配置校验框架,与上面两个Action同一个目录下。LoginAction-validation.xml代码如下:

 <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators>
<!-- 用户名验证 -->
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,8})]]></param>
<message>账号必须是长度为4-8的数字或字母!</message>
</field-validator>
</field>
<!-- 密码验证 -->
<field name="pwd">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,8})]]></param>
<message>密码必须长度为4-8的数字或字母!</message>
</field-validator>
</field> </validators>

  RegisterAction-validation.xml代码如下:

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <!-- 用户名验证 -->
<field name="user.name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,8})]]></param>
<message>账号必须是长度为4-8的数字或字母!</message>
</field-validator>
</field> <!-- 密码验证 -->
<field name="user.pwd">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,8})]]></param>
<message>密码必须长度为4-8的数字或字母!</message>
</field-validator>
</field> <field name="repwd">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>重复密码不能为空!</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(repwd==user.pwd)]]></param>
<message>两次输入的密码要一致!</message>
</field-validator>
</field> </validators>

  

 

到这里,我们的项目也差不多完成了,大家自己也尝试一下,开发出自己的J2EE系统。

struts_hibernate登陆范例的更多相关文章

  1. Bootstrap之登陆页面范例

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta ...

  2. PHP中header用法详解带范例(转)

    header的用法 header()函数的作用是:发送一个原始 HTTP 标头[Http Header]到客户端.标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的 ...

  3. 在Office Add-in中实现单点登陆(SSO)

    作者:陈希章 发表于 2017年12月27日 这篇文章经过多次修改,终于在今天晚上写完了,演示用的范例代码也终于跑通了.因为这个SSO的功能目前只是Preview的状态,所以本篇文章严格参考了官方的文 ...

  4. 微信小程序开发 - 用户授权登陆

    准备:微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 微信小程序开发文档:htt ...

  5. 动态爬虫——selenium2搭载phantomjs入门范例

    这是我学习爬虫比较深入的一步了,大部分的网页抓取用urllib2都可以搞定,但是涉及到JavaScript的时候,urlopen就完全傻逼了,所以不得不用模拟浏览器,方法也有很多,此处我采用的是sel ...

  6. Sharepoint 2013/2010 登陆身份验证

    SharePoint 2013 and SharePoint 2010登陆身份验证格式: <IdentityClaim>:0<ClaimType><ClaimValueT ...

  7. 红帽企业版RHEL7.1在研域工控板上,开机没有登陆窗口 -- 编写xorg.conf 简单三行解决Ubuntu分辩率不可调的问题

    红帽企业版RHEL7.1在研域工控板上,开机没有登陆窗口 没有登陆窗口 的原因分析: 没有登陆窗口的原因是因为有多个屏幕在工作,其中一个就是build-in 屏幕(内置的虚拟屏幕)和外接的显示器,并且 ...

  8. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  9. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

随机推荐

  1. IOS开发---菜鸟学习之路--(九)-利用PullingRefreshTableView实现下拉刷新

    本章主要讲解如何利用PullingRefreshTableView实现下拉(上拉)刷新的操作 PullingRefreshTableView 实现上下拉刷新的例子百度有很多,大家可以自己搜索下,先看下 ...

  2. IOS开发---菜鸟学习之路--(八)-实现新闻页面

    本章将具体讲述如何结合前两张的内容最终实现一个新闻页面的雏形 之所以称之为雏形,是因为本章实现的内容只是实现了最基础的效果 还有很多其他诸如下拉刷新 页面导航等效果都需要投入一些时间进行研究 好了直接 ...

  3. IOS开发学习笔记008-预处理

    预处理 1.宏定义 2.条件编译 3.文件包含 注意: 1.所有预处理都是以#开头,并且结尾不用分号. 2.宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误 3.作用域也是从定义到代码 ...

  4. Docker Hadoop LAMP安装配置教程

    以下教程来自九章算法. 1.How to install Dockerhttps://bupt.quip.com/YehSAR4qnGqB 2.How to set up hadoop environ ...

  5. [python][django学习篇][8]django 视图(2) --简单模板

    在视图函数里返回的是一个 HttpResponse 类的实例,我们给它传入了一个希望显示在用户浏览器上的字符串.但是我们的博客不可能只显示这么一句话,它有可能会显示很长很长的内容.比如我们发布的博客文 ...

  6. rand()与 srand()

    一   头文件 <time.h> srand()就是给rand()提供种子seed. 在C语言中,srand()与rand()是随机函数,其中srand函数是伪随机数发生器的初始化函数,原 ...

  7. javaScript 笔记(4) -- 弹窗 & 计时事件 & cookie

    弹窗 可以在 JavaScript 中创建三种消息框:警告框.确认框.提示框. 警告框:经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. 语法: window ...

  8. Eat the Trees(hdu 1693)

    题意:在n*m的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少中方法. 第一道真正意义上的插头DP,可参考陈丹琦的<基于连通性状态压缩的动态规划问题> ...

  9. Python操作MySQL[转]

    本篇对于Python操作MySQL主要使用两种方式: 1.原生模块pymsql. 2.ORM框架SQLAchemy. pymsql pymsql是Python中操作MySQL的模块,其使用方法和MyS ...

  10. ef code first transform,add ef power tools add-in,add tangible t4 editor for enhancement.

    use ef power tools, as to .edmx file,right click at view, choose generate database from model, then ...