項目:對user表實現增刪改查
項目結構一覽:
首先建立對應的user表
DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL, `password` varchar(20) NOT NULL, `sex` varchar(10) DEFAULT NULL, `realname` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
根據user表,建立對應的實體類(com.hpe.po.User),這裡表欄位名跟實體類屬性名稱一致(按照bean的規範,get,set方法一定要有,還需要有無參構造方法,當mxl檔案管理bean時候,根據無參構造方法建立對應的bean):
public class User {private int id;private String username;private String password;private String realname;private String sex;public User() {super();}public User(int id, String username, String password, String realname, String sex) {super();this.id = id;this.username = username;this.password = password;this.realname = realname;this.sex = sex;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRealname() {return realname;}public void setRealname(String realname) {this.realname = realname;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", password=" + password + ", realname=" + realname+ ", sex=" + sex + "]";}
在com.hpe.dao下建立對資料庫操作的介面:
public interface IUserDao {User fndUserByNameAndPwd(User user);int register(User user);int checkUserName(String Username);List<User> selectAll();int deleteById(int id);List<User> selectMohu(String username);}
根據介面方法,實現介面(com.hpe.dao.impl):
package com.hpe.dao.impl;import java.util.List;import com.hpe.dao.IUserDao;import com.hpe.po.User;import com.hpe.util.DBUtil;public class UserDaoImpl implements IUserDao{private DBUtil db=new DBUtil();@Overridepublic User fndUserByNameAndPwd(User user) {String sql="select * from user where username=? and password=?";Object[] params={user.getUsername(),user.getPassword()};User us=db.getObject(sql, params,User.class);return us;}@Overridepublic int register(User user) {String sql="insert into user(username, password, sex, realname)values(?, ?,?,?)";Object[] params={user.getUsername(),user.getPassword(),user.getSex(),user.getRealname()};int res=db.update(sql, params);return res;}@Overridepublic int checkUserName(String username) {String sql="select * from user where username=? ";Object[] params={username};List<User> list= db.query(sql, params, User.class);return list.size();}@Overridepublic List<User> selectAll() {String sql="select * from user";Object[] params={};return db.query(sql, params, User.class);}@Overridepublic int deleteById(int id) {String sql="delete from user where id=?";Object[] params={id};return db.update(sql, params);}@Overridepublic List<User> selectMohu(String username) {String sql="select * from user where username like '%"+username+"%'";Object[] params={};List<User> list= db.query(sql, params, User.class);return list;}}
dao.impl串連資料庫方法多種多樣,這裡實用的是jdbc,將資料庫連接封裝在了工具類。
工具類一覽:
package com.hpe.util;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.management.Query;public class DBUtil {// 載入資料庫驅動, 建立連線物件並返回public Connection getConn() throws ClassNotFoundException, SQLException {// 將指定名字的類, 通過類載入器(ClassLoader)載入到JVM(java 虛擬機器)Class.forName("com.mysql.jdbc.Driver");//String url = "jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8";String user = "root";String pwd = "";Connection conn = DriverManager.getConnection(url, user, pwd);/* * * 1. 載入驅動 2. 建立連線物件 // 經過三向交握 3. 建立執行對象 4. 執行SQL 5. 處理返回結果 6. 釋放資源 // * 經過四次握手 * * 資料連線池: 在一個容器中-> 池, 建立好一定資料的連線物件 , 應用程式需要連線物件 時, 直接從容器中取, 使用完畢之後, * 再將連線物件放回到容器中, 而不是直接關閉. */return conn;}// 釋放資源 resultset statement connectionpublic void close(ResultSet rs, Statement stmt, Connection conn) {try {if (rs != null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}try {if (stmt != null) {stmt.close();}} catch (SQLException e) {e.printStackTrace();}try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}public Map getObject(String sql, Object[] params) {// 擷取查詢結果清單List<Map<String, Object>> list = query(sql, params);// 只返回第一個if (list.size() > 0) {return list.get(0);} else {return null;}}public <T> T getObject(String sql, Object[] params, Class<T> cls) {// 查詢出一條記錄Map map = getObject(sql, params);// 將Map轉換成實體類對象return (T) toObj(map, cls);}// 擷取多個對象, 並將每個對象儲存到一個Map中, 並且將多個對象儲存到Listpublic List<Map<String, Object>> query(String sql, Object[] params) {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;List<Map<String, Object>> list = new ArrayList<>();try {conn = getConn();//stmt = conn.prepareStatement(sql);// 當參數數組不為空白時, 進行參數綁定, 此句必須有, 否則params.length會報NullPointerExceptionif (params != null) { //for (int i = 0; i < params.length; i++) {stmt.setObject(i + 1, params[i]);}}//rs = stmt.executeQuery();//while (rs.next()) {// 由於 查詢時, 可能針對的是不同的表, 不同的表結構是不一樣的. 能不能有一種統一的資料類型, 能夠接收這種可變的資料?/* * Map介面 以key-value的形式存放多個資料 * * * HashMap */HashMap<String, Object> map = new HashMap<>();int colCount = rs.getMetaData().getColumnCount();for (int i = 1; i <= colCount; i++) {String colName = rs.getMetaData().getColumnName(i);Object value = rs.getObject(colName);map.put(colName, value);}// 將單條記錄的map放到一個數組中.list.add(map);}// 返回數組return list;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {close(rs, stmt, conn);}return null;}public <T> List<T> query(String sql, Object[] params, Class<T> cls) {List<Map<String, Object>> list = query(sql, params);List<T> res = new ArrayList<>();for (Map<String, Object> map : list) {T obj = toObj(map, cls);res.add(obj);}return res;}private <T> T toObj(Map<String, Object> map, Class<T> cls) {try {// 實體類對象的建立T obj = cls.newInstance();// 將Map中的資料設定到obj中// beanInfo中儲存是類相關的資訊BeanInfo info = Introspector.getBeanInfo(cls);// 擷取類的每一個屬性的資訊PropertyDescriptor[] properties = info.getPropertyDescriptors();for (PropertyDescriptor prop : properties) {// 擷取屬性的名字String propName = prop.getName(); // -> name// 擷取屬性的set方法Method setter = prop.getWriteMethod(); // -> setName(String );// 取出map中屬性對應的值Object value = map.get(propName);if (value != null) {// 調用 setter設定值try {// 實體類屬性的設定setter.invoke(obj, value);} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return obj;} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IntrospectionException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public int update(String sql, Object[] params) {Connection conn = null;PreparedStatement stmt = null;int res = 0;ResultSet rs = null;try {conn = getConn();//stmt = conn.prepareStatement(sql, com.mysql.jdbc.Statement.RETURN_GENERATED_KEYS);// 當參數數組不為空白時, 進行參數綁定, 此句必須有, 否則params.length會報NullPointerExceptionif (params != null) { //for (int i = 0; i < params.length; i++) {stmt.setObject(i + 1, params[i]);}}//res = stmt.executeUpdate();rs = stmt.getGeneratedKeys();if (rs.next()) {res = rs.getInt(1);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {close(rs, stmt, conn);}return res;}}
然後我們建立service,(com.hpe.service):
package com.hpe.service;import java.util.List;import com.hpe.po.User;public interface IUserService {User login(User user);int register(User user);List<User> selectAll();int deleteById(int id);List<User> selectMohu(String username);}
實現service(com.hpe.service.impl.UserServiceImpl),注意這裡我們在調用dao介面時候,不再是IUserDao iud=new UserDaoImpl,這種方式,而是把IUserDao交給設定檔管理,用bean的方式,根據set方法傳參。
package com.hpe.service.impl;import java.util.List;import com.hpe.dao.IUserDao;import com.hpe.dao.impl.UserDaoImpl;import com.hpe.po.User;import com.hpe.service.IUserService;public class UserServiceImpl implements IUserService{private IUserDao iud;//ioc控制反轉,用設定檔管理IUserDao的實作類別,所以這裡要給出該變數,在設定檔實現//set方法一定要有,ioc控制反轉,設定檔管理bean,建立IUserDao的實體類,在property設定屬性時候,會調動此處的set方法,將建立的//IUserDao iud=new UserDaoImpl()實體類用set方法,也就是調用這裡的setIud(),給此處聲明的IUserDao iud賦值。//對應設定檔:<bean id="userService" class="com.hpe.service.impl.UserServiceImpl">//<property name="iud" ref="userDao"></property> //</bean>public void setIud(IUserDao iud) {this.iud = iud;}@Overridepublic User login(User user) {// TODO Auto-generated method stubreturn iud.fndUserByNameAndPwd(user);}@Overridepublic int register(User user) {// TODO Auto-generated method stubreturn iud.register(user);}@Overridepublic List<User> selectAll() {// TODO Auto-generated method stubreturn iud.selectAll();}@Overridepublic int deleteById(int id) {// TODO Auto-generated method stubreturn iud.deleteById(id);}@Overridepublic List<User> selectMohu(String username) {// TODO Auto-generated method stubreturn iud.selectMohu(username);}}
是不是有點懵。看看設定檔就明白了
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd "> <!-- 注入bean,bean標籤管理的類,相當於自動調用無參建構函式建立建立實體類,相當於new UserDaoImpl(),此處的id,是便於調用時候識別該bean,任意取名字,但是要有針對意義。 --><bean id="userDao" class="com.hpe.dao.impl.UserDaoImpl"></bean><!--注入應用類型 --><!-- 調用有參構造器構造 該bean管理的UserServiceImpl類,相當於new UserServiceImpl(property1,property2,...) --><bean id="userService" class="com.hpe.service.impl.UserServiceImpl"><!-- 有參構造器構造參數描寫,name是有參建構函式的參數名,value是參數值.此處參數值也是個類對象,所以我們用ref,為了是 ref等於的bean實體類建立對象能夠代碼複用,ref="某bean的id",id=userDao的bean,是建立UserDaoImpl 的無參構造方法對應的對象。 --><property name="iud" ref="userDao" ></property><!-- <property name="iud" value="com.hpe.dao.impl.UserDaoImpl" ></property> --></bean></beans>
最後,我們在com.hpe.test包下建立測試類別,用junit測試
package com.hpe.test;import java.util.List;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.hpe.dao.IUserDao;import com.hpe.dao.impl.UserDaoImpl;import com.hpe.po.User;import com.hpe.service.IUserService;public class UserTest {@Testpublic void method1(){//載入設定檔,初始化ioc容器(建立對應執行個體)ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//從ioc容器中擷取beanIUserService userService = context.getBean("userService", IUserService.class);//通過getBean,讀取userService id的IUserServiceImpl的實作類別(在bean標籤中,class設定為UserServiceImpl。所以獲得該實作類別)//然後bean設定屬性,《propert》標籤,設定userServiceimpl中的屬性欄位userdao為userDaoImpl實作類別的實體。User user=new User();user.setUsername("yjz");user.setPassword("123");System.out.println(userService.login(user));}@Testpublic void method2(){//載入設定檔,初始化ioc容器(建立對應執行個體)ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//從ioc容器中擷取beanIUserService userService = context.getBean("userService", IUserService.class);//通過getBean,讀取userService id的IUserServiceImpl的實作類別(在bean標籤中,class設定為UserServiceImpl。所以獲得該實作類別)//然後bean設定屬性,《propert》標籤,設定userServiceimpl中的屬性欄位userdao為userDaoImpl實作類別的實體。User user=new User();user.setUsername("yjz");user.setPassword("123");List<User> list=userService.selectAll();for(User u:list){System.out.println(u);}}@Testpublic void method3(){//載入設定檔,初始化ioc容器(建立對應執行個體)ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//從ioc容器中擷取beanIUserService userService = context.getBean("userService", IUserService.class);//通過getBean,讀取userService id的IUserServiceImpl的實作類別(在bean標籤中,class設定為UserServiceImpl。所以獲得該實作類別)//然後bean設定屬性,《propert》標籤,設定userServiceimpl中的屬性欄位userdao為userDaoImpl實作類別的實體。System.out.println(userService.deleteById(8));}@Testpublic void method4(){//載入設定檔,初始化ioc容器(建立對應執行個體)ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//從ioc容器中擷取beanIUserService userService = context.getBean("userService", IUserService.class);//通過getBean,讀取userService id的IUserServiceImpl的實作類別(在bean標籤中,class設定為UserServiceImpl。所以獲得該實作類別)//然後bean設定屬性,《propert》標籤,設定userServiceimpl中的屬性欄位userdao為userDaoImpl實作類別的實體。User user=new User();user.setUsername("yjz222");user.setPassword("123");user.setRealname("asdasd");user.setSex("男");System.out.println(userService.register(user));;}@Testpublic void method5(){//載入設定檔,初始化ioc容器(建立對應執行個體)ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//從ioc容器中擷取beanIUserService userService = context.getBean("userService", IUserService.class);//通過getBean,讀取userService id的IUserServiceImpl的實作類別(在bean標籤中,class設定為UserServiceImpl。所以獲得該實作類別)//然後bean設定屬性,《propert》標籤,設定userServiceimpl中的屬性欄位userdao為userDaoImpl實作類別的實體。List<User> list=userService.selectMohu("y");for(User u:list){System.out.println(u);}}}