Mybatis實現簡單的數據庫增刪改查操作


Mybatis實現簡單的數據庫增刪改查操作

框架:mybatis(3.5.2)

數據庫:mysql

工具:idea

 

1.新建一個maven項目,在pom文件中添加mybatis依賴及MySQL依賴

 1 <!-- mybatis核心依賴 -->
 2     <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
 3     <dependency>
 4         <groupId>org.mybatis</groupId>
 5         <artifactId>mybatis</artifactId>
 6         <version>${mybatis.version}</version>
 7     </dependency>
 8     
 9     <!-- mysql驅動 -->
10     <dependency>
11         <groupId>mysql</groupId>
12         <artifactId>mysql-connector-java</artifactId>
13         <version>${mysql.version}</version>
14     </dependency>

2、新建實體類User、工具類MybatisUtils、數據訪問接口UserDao及它的實現類UserDaoImpl

Users類:

 1 private Integer uid;
 2 private String userName;
 3 
 4 public Integer getUid() {
 5     return uid;
 6 }
 7 
 8 public void setUid(Integer uid) {
 9     this.uid = uid;
10 }
11 
12 public String getUserName() {
13     return userName;
14 }
15 
16 public void setUserName(String userName) {
17     this.userName = userName;
18 }

MybatisUtils類:

 1 private static SqlSessionFactory sqlSessionFactory;
 2 
 3 /**
 4 * 在靜態代碼塊中初始化工廠
 5 */
 6 static{
 7     //先查找mybatis的核心配置文件來初始化數據源,
 8     //默認從classpath下查找核心配置文件
 9     try {
10         //注意:import org.apache.ibatis.io.Resources;
11         InputStream is = Resources.getResourceAsStream("mybatis.xml");
12         //創建一個SqlSessionFactoryBuilder來解析配置文件的信息,
13         // 然后創建出SqlSessionFactory實例
14         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
15         //build方法傳入一個輸入流,通過解析后返回一個SqlSessionFactory實例
16         sqlSessionFactory = builder.build(is);
17 
18     } catch (IOException e) {
19         e.printStackTrace();
20     }
21 }
22 
23 /**
24 * 提供一個獲取SqlSession的方法
25 * @param autoCommit 在獲取SQL Session時可以傳遞一個boolean類型的參數值,
26 *             這個參數的作用似乎用於設置是否手動提交事務還是自動提交事務,
27 *             false為手動提交,true為自動提交
28 * @return
29 */
30 public static SqlSession getSqlSession(boolean autoCommit){
31     //通過openSession方法來創建一個sqlSession實例,
32     //有了SqlSession,就可以來訪問數據庫
33     return sqlSessionFactory.openSession(autoCommit);
34 }

UserDao接口:

 1 /**
 2      * 通過傳遞一個對象形式保存用戶
 3      * @param user
 4      */
 5 void save(Users user);
 6 
 7     /**
 8      * 通過傳遞一個map集合保存用戶
 9      * @param map
10      */
11 void save2(Map<String, Object> map);
12 
13     /**
14      * 通過傳遞一個對象修改用戶
15      * @param user
16      */
17 void update(Users user);
18 
19     /**
20      * 通過id刪除用戶
21      * @param id
22      */
23 void delete(int id);
24 
25     /**
26      * 通過傳遞多個參數修改用戶
27      * @param userName
28      * @param uid
29      */
30 void update2(String userName, int uid);
31 
32 /**
33      * 根據id查詢一條結果集,返回一個實體對象
34      * @param uid
35      * @return
36      */
37 Users getUserById(String uid);
38 
39 /**
40      * 根據id查詢一條結果集,返回一個map集合
41      * @param id
42      * @return
43      */
44 Map<String, Object> getUserById2(String id);
45 
46 /**
47      * 查詢所有,返回多個Users對象
48      * @return
49      */
50 List<Users> listUser();
51 
52 /**
53      * 根據所有結果集,返回多個map集合
54      * @return
55      */
56 List<Map<String, Object>> listUser2();

在UserDaoImpl類實現UserDao接口並重寫抽象方法:

 1 @Override
 2 public void save(Users user) {
 3     //獲取SqlSession實例,true表示自動提交事務
 4     try(SqlSession session = MybatisUtils.getSqlSession(true)){
 5         //getMapper方法返回一個代理對象,這個代理對象也是實現了UserDao接口
 6         //底層使用JDK動態代理技術
 7         UserDao dao = session.getMapper(UserDao.class);
 8         //當執行save方法時,其實調用的時代理對象的save,
 9         //它會解析mapper映射配置文件,找到id為save的元素
10         //並執行其中的sql語句
11         dao.save(user);
12     }catch (RuntimeException e){
13 
14         throw e;
15     }
16 }
17 
18 @Override
19 public void save2(Map<String, Object> map) {
20     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)){
21         sqlSession.getMapper(UserDao.class).save2(map);
22     }catch(RuntimeException e){
23         throw e;
24     }
25 }
26 
27 @Override
28 public void update(Users user) {
29     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)){
30         sqlSession.getMapper(UserDao.class).update(user);
31     }catch (RuntimeException e){
32         throw e;
33     }
34 }
35 
36 @Override
37 public void delete(int id) {
38     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)){
39         sqlSession.getMapper(UserDao.class).delete(id);
40     }catch (RuntimeException e){
41         throw e;
42     }
43 }
44 
45 @Override
46 public void update2(String userName, int uid) {
47     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) {
48         sqlSession.getMapper(UserDao.class).update2(userName, uid);
49     }catch (RuntimeException e){
50         throw e;
51     }
52 }
53 
54 @Override
55 public Users getUserById(String uid) {
56     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) {
57         return sqlSession.getMapper(UserDao.class).getUserById(uid);
58     }catch (RuntimeException e){
59         throw e;
60     }
61 }
62 
63 @Override
64 public Map<String, Object> getUserById2(String id) {
65     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) {
66         return sqlSession.getMapper(UserDao.class).getUserById2(id);
67     }catch (RuntimeException e){
68         throw e;
69     }
70 }
71 
72 @Override
73 public List<Users> listUser() {
74     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) {
75         return sqlSession.getMapper(UserDao.class).listUser();
76     }catch (RuntimeException e){
77         throw e;
78     }
79 }
80 
81 @Override
82 public List<Map<String, Object>> listUser2() {
83     try(SqlSession sqlSession = MybatisUtils.getSqlSession(true)) {
84         return sqlSession.getMapper(UserDao.class).listUser2();
85     }catch (RuntimeException e){
86         throw e;
87     }
88 }

上述這些類的結構如圖所示:

 

 

 

 3、在main目錄下的resources目錄中新建一個mybatis.xml文件,以及mapper文件夾下新建一個UsersMapper.xml(此文件命名規范是實體類名+Mapper)如圖所示:

 

 

  mybatis.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 3         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 4 <!-- mybatis核心配置,用於配置相關數據源以及連接池等信息,以及實體類的別稱映射,插件配置等等 -->
 5 <configuration>
 6     <!-- 指定實體類的別名,方便在mapper配置中進行引用 -->
 7     <typeAliases>
 8         <!-- 方法1、定義一個alias別名,缺點在於需要一個實體類分別指定
 9         <typeAlias type="edu.nf.ch01.entity.Users" alias="user" />-->
10         <!-- 方法2、也可以使用package來給某個包下面的所有實體類自動創建別名,
11         自動創建的別名規則是類的類名並將首字母改為小寫 -->
12         <package name="edu.nf.ch01.entity"/>
13     </typeAliases>
14     <!-- 配置數據源環境,default指定默認的數據源 -->
15     <environments default="mysql">
16         <!-- 創建一個MySQL的數據源環境,id就叫mysql -->
17         <environment id="mysql">
18             <!-- 配置事務管理,這里有JDBC和MANAGED兩個值
19              JDBC:使用本地jdbc的事務
20              MANAGED:mybatis不參與事務管理,由運行容器來管理事務-->
21             <transactionManager type="JDBC"/>
22             <!-- 配置數據源,type指定獲取連接的方式,有以下幾個值:
23              POOLED:使用mybatis自帶的數據庫連接池(方便連接的復用)
24              UNPOOLRF:不使用連接池,而是每次請求都從數據庫去獲取連接
25               JMDI:通過查找JNDI樹去獲取數據源對象,通常結合web容器或者EJB容器來配置 -->
26             <dataSource type="POOLED">
27                 <!-- 配置數據源信息,驅動,url,連接的賬號密碼等 -->
28                 <property name="driver" value="com.mysql.jdbc.Driver"/>
29                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8"/>
30                 <property name="username" value="root"/>
31                 <property name="password" value="root"/>
32             </dataSource>
33         </environment>
34     </environments>
35 
36     <!-- 指定mapper配置文件 -->
37     <mappers>
38         <mapper resource="mapper/UsersMapper.xml" />
39     </mappers>
40 </configuration>

UsersMapper.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <!-- mapper根節點的namespace指定Dao接口的完整類名,
 5 因為mybatis在解析的時候要根據這個類名找到相應dao方法執行 -->
 6 <mapper namespace="edu.nf.ch01.dao.UserDao">
 7     <!-- 映射SQL語句,比如<insert>標簽用於映射insert語句,
 8      id屬性對應Dao接口中的方法名
 9      parameterType表示Dao接口方法參數的類型,可以指定完整類名,
10      這里指定實體類的別名,也就是在mybatis.xml中定義的別名
11      在sql語句中使用#{}表達式來指定要插入的列,{}中指定實體的字段名-->
12     <insert id="save" parameterType="edu.nf.ch01.entity.Users">
13         insert into user_info(u_name) values(#{userName})
14     </insert>
15 
16     <!-- 如果參數類型時Map集合,那么#{}表達式對應的就是Map的kek,parameterType中也可以為map -->
17     <insert id="save2" parameterType="java.util.Map">
18         insert into user_info(u_name) values(#{uname})
19     </insert>
20 
21     <update id="update" parameterType="edu.nf.ch01.entity.Users">
22         update user_info set u_name = #{userName} where u_id = #{uid};
23     </update>
24 
25     <delete id="delete" parameterType="int">
26         delete from user_info where u_id = #{id}
27     </delete>
28     <!-- 當有多個參數時,不需要指定parameterType屬性,
29     而是使用#{param1}#{param2}...的方式映射參數,對應方法參數的順序 -->
30     <update id="update2">
31         update user_info set u_name = #{param1} where u_id = #{param2}
32     </update>
33     
34     <!-- 查詢當個用戶,將結果集封裝成一個實體對象
35      resultType屬性指定查詢結果集的返回類型,
36      如果返回一個實體,則返回引用mybatis.xml文件中Alias設置的別名
37      需要注意的是,查詢sql語句中,查詢column必須要和實體的字段名稱相同-->
38     <select id="getUserById" parameterType="java.lang.String" resultType="users">
39         select u_id as uid, u_name as userName from user_info2 where u_id = #{id}
40     </select>
41 
42     <!-- 查詢單個用戶,將結果集封裝成一個map集合
43      此時只需要將resultType設置為map即可-->
44     <select id="getUserById2" parameterType="java.lang.String" resultType="map">
45         select u_id, u_name from user_info2 where u_id = #{id}
46     </select>
47 
48     <!-- 查詢用戶列表,返回list集合,集合中封裝了多個實體對象 -->
49     <select id="listUser" resultType="users">
50         select u_id as uid, u_name as userName from user_info2
51     </select>
52 
53     <!-- 查詢用戶列表,返回list集合,集合中存放多個map對象 -->
54     <select id="listUser2" resultType="map">
55         select u_id, u_name from user_info2
56     </select>
57 </mapper>

4、數據庫代碼:

數據庫:mybatis

數據表:user_info

1 create table user_info(
2     u_id int primary key auto_increment,
3     u_name varchar(50) not null
4 );

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM