使用struts2框架来实现CRUD(create、read、update、delete)
来源:互联网 发布:智能健康数据分析图 编辑:程序博客网 时间:2024/05/29 18:08
UserAction<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.locale" value="en_US"/>
<package name="crud1" namespace="/" extends="struts-default">
<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="mylogger" class="com.huai.interceptor.LoggerInterceptor"/>
<!--自定义一个拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="mylogger"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!--设置默认的自定义拦截器,不再是系统的defaultStack -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="userToList" class="com.huai.action.UserAction" method="toList">
<result name="toList">/list.jsp</result>
</action>
<action name="userToAdd" class="com.huai.action.UserAction" method="toAdd">
<result name="toAdd">/add.jsp</result>
</action>
<action name="userAdd" class="com.huai.action.UserAction" method="add">
<result name="toList">/list.jsp</result>
<result name="toAdd">/add.jsp</result>
<result name="input">/add.jsp</result>
</action>
<action name="userToUpdate" class="com.huai.action.UserAction" method="toUpdate">
<result name="toUpdate">/update.jsp</result>
</action>
<action name="userUpdate" class="com.huai.action.UserAction" method="update">
<result name="toList">/list.jsp</result>
</action>
<action name="userDelete" class="com.huai.action.UserAction" method="delete">
<result name="toList">/list.jsp</result>
</action>
<action name="userToQuery" class="com.huai.action.UserAction" method="toQuery">
<result name="toQuery">/query.jsp</result>
</action>
<action name="userQuery" class="com.huai.action.UserAction" method="query">
<result name="toList">/list.jsp</result>
<result name="input">/query.jsp</result>
</action>
</package>
</struts>
DataSourceHolderpackage com.huai.action;
import java.util.List;
import com.db.dao.DAOImpl;
import com.opensymphony.xwork2.ActionSupport;
import com.ov.UserModel;
import com.ov.UserQueryModel;
public class UserAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private List<UserModel> list;
private String[] sexs = new String[]{"男","女"};
private UserModel user;
private UserQueryModel uqm;
private String info;
public List<UserModel> getList() {
return list;
}
public void setList(List<UserModel> list) {
this.list = list;
}
public String[] getSexs(){
return this.sexs;
}
public void setSexs(String[] sexs){
this.sexs = sexs;
}
public UserModel getUser(){
return this.user;
}
public void setUser(UserModel user){
this.user = user;
}
public UserQueryModel getUqm() {
return uqm;
}
public void setUqm(UserQueryModel uqm) {
this.uqm = uqm;
}
public String getInfo(){
return this.info;
}
public void setInfo(String info){
this.info = info;
}
public String toList()throws Exception{
DAOImpl dao = new DAOImpl();
list = dao.getAll();
return "toList";
}
public String toAdd()throws Exception{
return "toAdd";
}
public String add()throws Exception{
DAOImpl dao = new DAOImpl();
UserModel user_temp = null;
//先判断增加的用户的id是否已经存在
//先用添加的userId号遍历数据库,返回一个user对象
user_temp=dao.getSingle(user.getUserId());
if(user_temp == null){
dao.create(user);
return this.toList();
}else{
this.info = "The userId has existed !";
return "toAdd";
}
}
public String toUpdate()throws Exception{
DAOImpl dao = new DAOImpl();
user = dao.getSingle(user.getUserId());
return "toUpdate";
}
public String update()throws Exception{
DAOImpl dao = new DAOImpl();
dao.update(user);
return toList();
}
public String delete()throws Exception{
DAOImpl dao = new DAOImpl();
dao.delete(user.getUserId());
return this.toList();
}
public String toQuery()throws Exception{
return "toQuery";
}
public String query()throws Exception{
DAOImpl dao = new DAOImpl();
list = dao.getByCondition(uqm);
return "toList";
}
}
DAOImplpackage com.db_source;
import java.beans.PropertyVetoException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DataSourceHolder {
private ComboPooledDataSource cpds = null;
public DataSourceHolder() throws PropertyVetoException{
//这里使用了c3p0的数据源获取数据库的connection
//没有c3p0-config.xml文件,这里用快捷配置方式
cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test" );
cpds.setUser("root");
cpds.setPassword("mysql");
}
public ComboPooledDataSource getDataSource(){
return this.cpds;
}
}
UserModelpackage com.db.dao;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.db_source.DataSourceHolder;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.ov.UserModel;
import com.ov.UserQueryModel;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class DAOImpl {
private ComboPooledDataSource dataSourceHolder = null;
public DAOImpl(){
try {
dataSourceHolder = new DataSourceHolder().getDataSource();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
//create a user
public void create(UserModel user){
Connection conn = null;
try {
conn = dataSourceHolder.getConnection();
final String sql = "insert into tb1_user(userId, name, sex, age) values(?,?,?,?)";
java.sql.PreparedStatement ps = conn.prepareStatement(sql);
int count = 1;
ps.setInt(count++, user.getUserId());
ps.setString(count++, user.getName());
ps.setString(count++, user.getSex());
ps.setInt(count++, user.getAge());
ps.execute();
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//modify user's information
public void update(UserModel user){
Connection conn = null;
try {
conn = dataSourceHolder.getConnection();
final String sql = "update tb1_user set name=?, sex=?, age=? where userId=?";
java.sql.PreparedStatement ps = conn.prepareStatement(sql);
int count = 1;
ps.setString(count++, user.getName());
ps.setString(count++, user.getSex());
ps.setInt(count++, user.getAge());
ps.setInt(count++, user.getUserId());
ps.execute();
ps.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
public void delete(int userId){
Connection conn = null;
try {
conn = dataSourceHolder.getConnection();
final String sql = "delete from tb1_user where userId=?";
java.sql.PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, userId);
ps.execute();
ps.close();
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//返回单个用户-user
public UserModel getSingle(int userId){
UserModel user = null;
Connection conn = null;
try {
conn = dataSourceHolder.getConnection();
final String sql = "select * from tb1_user where userId=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, userId);
ResultSet rs = ps.executeQuery();
if(rs.next()){
user = this.rs2Model(rs);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
private UserModel rs2Model(ResultSet rs)throws Exception{
UserModel user = new UserModel();
user.setUserId(rs.getInt("userId"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex"));
user.setAge(rs.getInt("age"));
return user;
}
//返回所有用户
public List<UserModel> getAll(){
List<UserModel> list = new ArrayList<UserModel>();
Connection conn = null;
try{
conn = dataSourceHolder.getConnection();
//
final String sql = "select * from tb1_user order by userId";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
UserModel user = this.rs2Model(rs);
list.add(user);
}
rs.close();
ps.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return list;
}
//下面几个用于选择性查询
//此方法生成查询命令的where
private String generateWhere(UserQueryModel uqm){
StringBuffer buffer = new StringBuffer();
if(uqm.getUserId() > 0){
buffer.append(" and userId = ? ");
}
if(uqm.getName() != null && uqm.getName().trim().length() > 0){
buffer.append(" and name like ? ");
}
if(uqm.getSex() != null && uqm.getSex().trim().length() > 0){
buffer.append(" and sex = ? ");
}
if(uqm.getAge() > 0){
buffer.append(" and age >= ? ");
}
if(uqm.getAge2() > 0){
buffer.append(" and age <= ? ");
}
return buffer.toString();
}
private void preparePs(UserQueryModel uqm, PreparedStatement ps) throws SQLException{
int count = 1;
if(uqm.getUserId() > 0){
ps.setInt(count++, uqm.getUserId());
}
if(uqm.getName() != null && uqm.getName().trim().length() > 0){
ps.setString(count++, "%"+uqm.getName()+"%");
}
if(uqm.getSex() != null && uqm.getSex().trim().length() > 0){
ps.setString(count++, uqm.getSex());
}
if(uqm.getAge() > 0){
ps.setInt(count++, uqm.getAge());
}
if(uqm.getAge2() > 0){
ps.setInt(count++, uqm.getAge2());
}
}
public List<UserModel> getByCondition(UserQueryModel uqm){
List<UserModel>list = new ArrayList<UserModel>();
Connection conn = null;
try {
conn = dataSourceHolder.getConnection();
final String sql = "select * from tb1_user where 1=1 "+this.generateWhere(uqm)+" order by userId";
PreparedStatement ps = conn.prepareStatement(sql);
this.preparePs(uqm, ps);
ResultSet rs = ps.executeQuery();
while(rs.next()){
UserModel user = this.rs2Model(rs);
list.add(user);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
}
UserQueryModelpackage com.ov;
public class UserModel {
private int userId;
private String name;
private String sex;
private int age;
public UserModel(){}
public UserModel(int userId, String name, String sex, int age){
this.userId = userId;
this.name = name;
this.sex = sex;
this.age = age;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
result = prime * result + userId;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserModel other = (UserModel) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
if (userId != other.userId)
return false;
return true;
}
}
UserAction-en-US.propertiespackage com.ov;
public class UserQueryModel extends UserModel{
private int age2;
public int getAge2() {
return age2;
}
public void setAge2(int age2) {
this.age2 = age2;
}
}
UserAction-zh-CN.propertiesadd.title = Create a User
add.submit = Create
update.title = Update a User
update.submit = Update
query.title = Query Users
query.submit = Query
query.age1 = Min Age
query.age2 = Max Age
query.error = your min age is more than your max age.
list.title = Users Info
list.operation = operation
list.add=Create a User
list.query = Query Users
user.userId = userId
user.name = name
user.sex = sex
user.age = age
UserAction-userAdd-validation.xml(这是UserAction类中的userAdd方法中的xml验证文件)add.title = \u6DFB\u52A0\u7528\u6237
add.submit = \u6DFB\u52A0
update.title = \u4FEE\u6539\u7528\u6237
update.submit = \u4FEE\u6539
query.title = \u67E5\u8BE2\u7528\u6237
query.submit = \u67E5\u8BE2
query.age1 = \u5E74\u9F84\u6700\u5C0F\u503C
query.age2 = \u5E74\u9F84\u6700\u5927\u503C
query.error = \u60A8\u8F93\u5165\u7684\u5E74\u9F84\u6700\u5C0F\u503C\u5927\u4E8E\u6700\u5927\u503C
list.title = \u7528\u6237\u4FE1\u606F
list.operation = \u64CD\u4F5C
list.add=\u6DFB\u52A0\u7528\u6237
list.query = \u67E5\u8BE2\u7528\u6237
user.userId = \u7528\u6237\u7F16\u53F7
user.name = \u59D3\u540D
user.sex = \u6027\u522B
user.age = \u5E74\u9F84
UserAction-userQuery-validation.xml(这是UserAction类中的uerQuery方法中的验证xml文件)<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="user.userId">
<field-validator type="int">
<param name="min">1</param>
<message>请输入编号,整数类型</message>
</field-validator>
</field>
<field name="user.name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>请填写姓名</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">50</param>
<message>请输入的年龄在${min}到之间${max}</message>
</field-validator>
</field>
</validators>
LoggerInterceptor<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<validator type="expression">
<param name="expression">
<!-- ![CDATA[]的作用是是不用一些符号的转义-->
<![CDATA[(uqm.age2 > 0 && uqm.age <= uqm.age2) || uqm.age2 == 0]]>
</param>
<message key="query.error"/>
</validator>
</validators>
list.jsppackage com.huai.interceptor;
import java.util.Map;
import org.apache.struts2.dispatcher.*;
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoggerInterceptor implements Interceptor{
/**
* 这个类实现了拦截器Interceptor接口
* 目的是打印相关信息,便于程序调试
* 方法的执行时间是在action之前,而在result之后
*
*
* 注意:去掉此类不会影响到整个项目
*/
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("--------------------------------");
//打印当前的action类名
System.out.println("Action: "+invocation.getAction().getClass().getName());
//打印action类中所调用的方法
System.out.println("Method: "+invocation.getProxy().getMethod());
//打印当前上下文context之中的所有request参数
//参数是以映射的关系存放的
Map<String, Object> params = invocation.getInvocationContext().getParameters();
for(String key : params.keySet()){
Object obj = params.get(key);
//遍历打印映射中的数组
if(obj instanceof String[]){
String[] arr = (String[])obj;
System.out.println("Param: "+key);
for(String value : arr){
System.out.println(value);
}
}
}
/**
* 此方法前面的代码在action之前执行
* 此方法后面的代码在result之后执行
* 注意:如果没有invoke()方法,将不会执行后面的invocation(拦截器)
*/
String resultCode = invocation.invoke();
Result rresult = invocation.getResult();
if(rresult instanceof ServletDispatcherResult){
ServletDispatcherResult result = (ServletDispatcherResult)rresult;
//打印result所调转到的jsp页面名称
System.out.println("JSP: "+result.getLastFinalLocation());
}
System.out.println("---------------------------------");
return resultCode;
}
}
add.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>list_show_page</title>
</head>
<body>
<center>
<h1>显示用户信息</h1>
<h2>
<s:a href="/strutsdemon_crud001/userToAdd.action">添加用户</s:a>
</h2>
<h2>
<s:a href="/strutsdemon_crud001/userToQuery.action">查询用户</s:a>
</h2>
</center>
<table align="center" border="1" cellpadding="1" cellspacing="0">
<tr>
<td>编号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td colspan="2" align="center">操作</td>
</tr>
<s:iterator value="list">
<tr>
<td><s:property value="userId" /></td>
<td><s:property value="name" /></td>
<td><s:property value="sex" /></td>
<td><s:property value="age" /></td>
<td><a
href="/strutsdemon_crud001/userToUpdate.action?user.userId=<s:property value='userId'/>">
修改 </a></td>
<!--这个是javascript的用法,作用是当用户按下删除键的时候提醒用户是否确定删除-->
<td><a href="javascript:if(confirm('Are you sure ?'))
window.location.href='/strutsdemon_crud001/userDelete.action?user.userId=<s:property value='userId'/>'">
删除
</a>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>
query.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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><s:text name="add.title"/></title>
</head>
<body>
<h1>add-page</h1>
<h4><s:property value="info"/></h4>
<s:form action="userAdd" method="post" namespace="/">
<%--
<s:textfield name="user.userId" label="编号"></s:textfield>
<s:textfield name="user.name" label="姓名"></s:textfield>
<s:select list="sexs" name="user.sex" label="性别"></s:select>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:submit value="添加"></s:submit>
--%>
<s:textfield name="user.userId" key="user.userId"/>
<s:textfield name="user.name" key="user.name"/>
<s:select name="user.sex" list="sexs" key="user.sex"/>
<s:textfield name="user.age" key="user.age"/>
<s:submit name="" key="add.submit"/>
</s:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>查询用户信息</title>
</head>
<body>
<center>
<s:actionerror/>
<h1><s:text name="query.title"/></h1>
<s:form action="userQuery" method="post" namespace="/" >
<!-- 这是非国际化标签的输入表 -->
<%--
<s:textfield name="uqm.userId" label="编号" value="0"/>
<s:textfield name="uqm.name" label="姓名"/>
<s:select name="uqm.sex" list="sexs" label="性别" headerKey="" headerValue="请选择"/>
<s:textfield name="uqm.age" label="年龄最小值" value="0"/>
<s:textfield name="uqm.age2" label="年龄最大值" value="0"/>
<s:submit value="查询"/>
--%>
<!--下面用到了国际化标签,所以有key -->
<s:textfield name="uqm.userId" key="user.userId"/>
<s:textfield name="uqm.name" key="user.name"/>
<s:select name="uqm.sex" list="sexs" headerKey="" headerValue="Choose" key="user.sex"/>
<s:textfield name="uqm.age" value="0" key="query.age1"/>
<s:textfield name="uqm.age2" value="0" key="query.age2"/>
<s:submit name="" key="add.submit"/>
</s:form>
</center>
</body>
</html>
update.jsp
最后,还需配置web.xml文件(这个很简单),还要在INF-Web下面的lib中复制相关的jar包,包括数据库连接驱动、struts包和c3p0包。数据库的表tb1_user的属性分别是userId name sex age ,userId是primary key!<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>update-page</title>
</head>
<body>
<h2>Update-Page</h2>
<s:form action="userUpdate" method="post" namespace="/">
<s:textfield name="user.userId" label="编号"></s:textfield>
<s:textfield name="user.name" label="姓名"></s:textfield>
<s:select list="sexs" name="user.sex" label="性别"></s:select>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:submit value="修改"></s:submit>
</s:form>
</body>
</html>
- 使用struts2框架来实现CRUD(create、read、update、delete)
- MongoDB和Redis的CRUD (Create,Read,Update,Delete)
- XML编程(CRUD)-create read update delete(DOM解析)
- Oracle与jdbc增删改查CRUD(Create-Read-Update-Delete)
- oracle学习总结------ CRUD操作(create/retrleve/update/delete
- CRUD:增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)
- Can't perform Create, Update or Delete operations on 'Table(@TableName)' because it is read-only.
- 使用struts2框架来实现前台与后台的交互
- 【Struts2+Spring3+Hibernate3】SSH框架整合实现CRUD
- Struts2+Spring3+Hibernate3 SSH框架整合实现CRUD
- 【Struts2+Spring3+Hibernate3】SSH框架整合实现CRUD
- [C#] 数据库操作 - Insert, Read, Delete, Update
- JavaScript Json Create、Select、Delete、Update
- 关联关系的crud(增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete))的理解(casecade和fetch)
- 使用myeclipse 应用struts2 + spring + hibernate 实现CRUD
- 使用myeclipse 应用struts2 + spring + hibernate 实现CRUD
- 使用myeclipse 应用struts2 + spring + hibernate 实现CRUD
- SSIS 实现update,delete,insert
- 考研成绩查询系统(jsp、mysql、java)
- 贪吃蛇游戏(java)
- java坦克游戏
- Eclipse打jar包,资源文件的读取
- MVC、JSP实现mysql的增删改查功能的封装和简陋的界面交互
- 使用struts2框架来实现CRUD(create、read、update、delete)
- IDEA加密文件Base64转换String传输以及报文摘要MD5防止恶意篡改
- iOS各大牛博客
- spring整合mybatis(入门级简单教程1)--在spring中配置c3p0,并成功测试
- spring整合mybatis(入门级简单教程2)
- spring整合mybatis(入门级简单教程3)--获取sqlSession对象
- ios开发系列之NSDate,NSDateFormatter,NSDateComponents和NSCalendar
- spring整合mybatis(入门级简单教程4)--扫描mapper类
- 让架构接地气,不再云里雾里