框架:mybatis(3.5.2)
數據庫:mysql
工具:idea
<!-- mybatis核心依賴 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mysql驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency>
2、新建實體類Users、工具類MybatisUtils、數據訪問接口UserDao及它的實現類UserDaoImpl
Users類:
private Integer uid; private String userName; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; }
MybatisUtils類:
private static SqlSessionFactory sqlSessionFactory; /** * 在靜態代碼塊中初始化工廠 */ static{ //先查找mybatis的核心配置文件來初始化數據源, //默認從classpath下查找核心配置文件 try { //注意:import org.apache.ibatis.io.Resources; InputStream is = Resources.getResourceAsStream("mybatis.xml"); //創建一個SqlSessionFactoryBuilder來解析配置文件的信息, // 然后創建出SqlSessionFactory實例 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //build方法傳入一個輸入流,通過解析后返回一個SqlSessionFactory實例 sqlSessionFactory = builder.build(is); } catch (IOException e) { e.printStackTrace(); } } /** * 提供一個獲取SqlSession的方法 * @param autoCommit 在獲取SQL Session時可以傳遞一個boolean類型的參數值, * 這個參數的作用似乎用於設置是否手動提交事務還是自動提交事務, * false為手動提交,true為自動提交 * @return */ public static SqlSession getSqlSession(boolean autoCommit){ //通過openSession方法來創建一個sqlSession實例, //有了SqlSession,就可以來訪問數據庫 return sqlSessionFactory.openSession(autoCommit); }
UserDao接口:
/** * 通過傳遞一個對象形式保存用戶 * @param user */ void save(Users user); /** * 通過傳遞一個map集合保存用戶 * @param map */ void save2(Map<String, Object> map); /** * 通過傳遞一個對象修改用戶 * @param user */ void update(Users user); /** * 通過id刪除用戶 * @param id */ void delete(int id); /** * 通過傳遞多個參數修改用戶 * @param userName * @param uid */ void update2(String userName, int uid); /** * 根據id查詢一條結果集,返回一個實體對象 * @param uid * @return */ Users getUserById(String uid); /** * 根據id查詢一條結果集,返回一個map集合 * @param id * @return */ Map<String, Object> getUserById2(String id); /** * 查詢所有,返回多個Users對象 * @return */ List<Users> listUser(); /** * 根據所有結果集,返回多個map集合 * @return */ List<Map<String, Object>> listUser2();
在UserDaoImpl類實現UserDao接口並重寫抽象方法:
@Override public void save(Users user) { //獲取SqlSession實例,true表示自動提交事務 try(SqlSession session = MybatisUtils.getSqlSession(true)){ //getMapper方法返回一個代理對象,這個代理對象也是實現了UserDao接口 //底層使用JDK動態代理技術 UserDao dao = session.getMapper(UserDao.class); //當執行save方法時,其實調用的時代理對象的save, //它會解析mapper映射配置文件,找到id為save的元素 //並執行其中的sql語句 dao.save(user); }catch (RuntimeException e){ throw e; } } @Override public void save2(Map<String, Object> map) { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)){ sqlSession.getMapper(UserDao.class).save2(map); }catch(RuntimeException e){ throw e; } } @Override public void update(Users user) { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)){ sqlSession.getMapper(UserDao.class).update(user); }catch (RuntimeException e){ throw e; } } @Override public void delete(int id) { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)){ sqlSession.getMapper(UserDao.class).delete(id); }catch (RuntimeException e){ throw e; } } @Override public void update2(String userName, int uid) { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) { sqlSession.getMapper(UserDao.class).update2(userName, uid); }catch (RuntimeException e){ throw e; } } @Override public Users getUserById(String uid) { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) { return sqlSession.getMapper(UserDao.class).getUserById(uid); }catch (RuntimeException e){ throw e; } } @Override public Map<String, Object> getUserById2(String id) { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) { return sqlSession.getMapper(UserDao.class).getUserById2(id); }catch (RuntimeException e){ throw e; } } @Override public List<Users> listUser() { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) { return sqlSession.getMapper(UserDao.class).listUser(); }catch (RuntimeException e){ throw e; } } @Override public List<Map<String, Object>> listUser2() { try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) { return sqlSession.getMapper(UserDao.class).listUser2(); }catch (RuntimeException e){ throw e; } }
上述這些類的結構如圖所示:
3、在main目錄下的resources目錄中新建一個mybatis.xml文件,以及mapper文件夾下新建一個UsersMapper.xml(此文件命名規范是實體類名+Mapper)如圖所示:
mybatis.xml:
<?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"> <!-- mybatis核心配置,用於配置相關數據源以及連接池等信息,以及實體類的別稱映射,插件配置等等 --> <configuration> <!-- 指定實體類的別名,方便在mapper配置中進行引用 --> <typeAliases> <!-- 方法1、定義一個alias別名,缺點在於需要一個實體類分別指定 <typeAlias type="edu.nf.ch01.entity.Users" alias="user" />--> <!-- 方法2、也可以使用package來給某個包下面的所有實體類自動創建別名, 自動創建的別名規則是類的類名並將首字母改為小寫 --> <package name="edu.nf.ch01.entity"/> </typeAliases> <!-- 配置數據源環境,default指定默認的數據源 --> <environments default="mysql"> <!-- 創建一個MySQL的數據源環境,id就叫mysql --> <environment id="mysql"> <!-- 配置事務管理,這里有JDBC和MANAGED兩個值 JDBC:使用本地jdbc的事務 MANAGED:mybatis不參與事務管理,由運行容器來管理事務--> <transactionManager type="JDBC"/> <!-- 配置數據源,type指定獲取連接的方式,有以下幾個值: POOLED:使用mybatis自帶的數據庫連接池(方便連接的復用) UNPOOLRF:不使用連接池,而是每次請求都從數據庫去獲取連接 JMDI:通過查找JNDI樹去獲取數據源對象,通常結合web容器或者EJB容器來配置 --> <dataSource type="POOLED"> <!-- 配置數據源信息,驅動,url,連接的賬號密碼等 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 指定mapper配置文件 --> <mappers> <mapper resource="mapper/UsersMapper.xml" /> </mappers> </configuration>
UsersMapper.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"> <!-- mapper根節點的namespace指定Dao接口的完整類名, 因為mybatis在解析的時候要根據這個類名找到相應dao方法執行 --> <mapper namespace="edu.nf.ch01.dao.UserDao"> <!-- 映射SQL語句,比如<insert>標簽用於映射insert語句, id屬性對應Dao接口中的方法名 parameterType表示Dao接口方法參數的類型,可以指定完整類名, 這里指定實體類的別名,也就是在mybatis.xml中定義的別名 在sql語句中使用#{}表達式來指定要插入的列,{}中指定實體的字段名--> <insert id="save" parameterType="edu.nf.ch01.entity.Users"> insert into user_info(u_name) values(#{userName}) </insert> <!-- 如果參數類型時Map集合,那么#{}表達式對應的就是Map的kek,parameterType中也可以為map --> <insert id="save2" parameterType="java.util.Map"> insert into user_info(u_name) values(#{uname}) </insert> <update id="update" parameterType="edu.nf.ch01.entity.Users"> update user_info set u_name = #{userName} where u_id = #{uid}; </update> <delete id="delete" parameterType="int"> delete from user_info where u_id = #{id} </delete> <!-- 當有多個參數時,不需要指定parameterType屬性, 而是使用#{param1}#{param2}...的方式映射參數,對應方法參數的順序 --> <update id="update2"> update user_info set u_name = #{param1} where u_id = #{param2} </update> <!-- 查詢當個用戶,將結果集封裝成一個實體對象 resultType屬性指定查詢結果集的返回類型, 如果返回一個實體,則返回引用mybatis.xml文件中Alias設置的別名 需要注意的是,查詢sql語句中,查詢column必須要和實體的字段名稱相同--> <select id="getUserById" parameterType="java.lang.String" resultType="users"> select u_id as uid, u_name as userName from user_info2 where u_id = #{id} </select> <!-- 查詢單個用戶,將結果集封裝成一個map集合 此時只需要將resultType設置為map即可--> <select id="getUserById2" parameterType="java.lang.String" resultType="map"> select u_id, u_name from user_info2 where u_id = #{id} </select> <!-- 查詢用戶列表,返回list集合,集合中封裝了多個實體對象 --> <select id="listUser" resultType="users"> select u_id as uid, u_name as userName from user_info2 </select> <!-- 查詢用戶列表,返回list集合,集合中存放多個map對象 --> <select id="listUser2" resultType="map"> select u_id, u_name from user_info2 </select> </mapper>
數據庫:mybatis
數據表:user_info
create table user_info( u_id int primary key auto_increment, u_name varchar(50) not null );