发表于: 2019-10-29 18:49:07

2 961


Mybatis学习

 

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。

MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。

MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

 

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。

SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

 

xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。

MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

 

MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中

 

1.   1.pom文件中引入Mybatis依赖:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->  

2.           <dependency>  

3.               <groupId>org.mybatis</groupId>  

4.               <artifactId>mybatis</artifactId>  

5.               <version>3.5.0</version>  

6.           </dependency>  

2.Resources下创建conf.xml文件,配置数据库连接信息

1.   <?xml version="1.0" encoding="UTF-8"?>  

2.   <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">  

3.   <configuration>  

4.       <environments default="development">  

5.           <environment id="development">  

6.               <transactionManager type="JDBC" />  

7.               <!-- 配置数据库连接信息 -->  

8.               <dataSource type="POOLED">  

9.                   <property name="driver" value="com.mysql.jdbc.Driver" />  

10.                  <property name="url" value="jdbc:mysql://localhost:3306/task1" />  

11.                  <property name="username" value="root" />  

12.                  <property name="password" value="root" />  

13.              </dataSource>  

14.          </environment>  

15.      </environments>  

16.    

17.      <mappers>  

18.          <!--注册userMapper.xml文件-->  

19.          <mapper resource="mapping/userMapper.xml"></mapper>  

20.      </mappers>  

21.  </configuration>  

3.查询数据库表中students表数据---建立对应实体类

1.   package model;  

2.     

3.   import java.util.Date;  

4.     

5.   public class User {  

6.       private int id;  

7.     

8.       private String name;  

9.     

10.      private String QQ;  

11.    

12.      private String addmissionTime;  

13.    

14.      private String University;  

15.    

16.      private int onlineId;  

17.    

18.      private String DailyLink;  

19.    

20.      private String declaration;  

21.    

22.      private Date create_at;  

23.    

24.      private Date update_at;  

25.    

26.      public int getId() {  

27.          return id;  

28.      }  

29.    

30.      public void setId(int id) {  

31.          this.id = id;  

32.      }  

33.    

34.      public String getName() {  

35.          return name;  

36.      }  

37.    

38.      public void setName(String name) {  

39.          this.name = name;  

40.      }  

41.    

42.      public String getQQ() {  

43.          return QQ;  

44.      }  

45.    

46.      public void setQQ(String QQ) {  

47.          this.QQ = QQ;  

48.      }  

49.    

50.      public String getAddmissionTime() {  

51.          return addmissionTime;  

52.      }  

53.    

54.      public void setAddmissionTime(String addmissionTime) {  

55.          this.addmissionTime = addmissionTime;  

56.      }  

57.    

58.      public String getUniversity() {  

59.          return University;  

60.      }  

61.    

62.      public void setUniversity(String university) {  

63.          University = university;  

64.      }  

65.    

66.      public int getOnlineId() {  

67.          return onlineId;  

68.      }  

69.    

70.      public void setOnlineId(int onlineId) {  

71.          this.onlineId = onlineId;  

72.      }  

73.    

74.      public String getDailyLink() {  

75.          return DailyLink;  

76.      }  

77.    

78.      public void setDailyLink(String dailyLink) {  

79.          DailyLink = dailyLink;  

80.      }  

81.    

82.      public String getDeclaration() {  

83.          return declaration;  

84.      }  

85.    

86.      public void setDeclaration(String declaration) {  

87.          this.declaration = declaration;  

88.      }  

89.    

90.      public Date getCreate_at() {  

91.          return create_at;  

92.      }  

93.    

94.      public void setCreate_at(Date create_at) {  

95.          this.create_at = create_at;  

96.      }  

97.    

98.      public Date getUpdate_at() {  

99.          return update_at;  

100.     }  

101.   

102.     public void setUpdate_at(Date update_at) {  

103.         this.update_at = update_at;  

104.     }  

105.   

106.     @Override  

107.     public String toString() {  

108.         return "User{" +  

109.                 "id=" + id +  

110.                 ", name='" + name + '\'' +  

111.                 ", QQ='" + QQ + '\'' +  

112.                 ", addmissionTime='" + addmissionTime + '\'' +  

113.                 ", University='" + University + '\'' +  

114.                 ", onlineId=" + onlineId +  

115.                 ", DailyLink='" + DailyLink + '\'' +  

116.                 ", declaration='" + declaration + '\'' +  

117.                 ", create_at=" + create_at +  

118.                 ", update_at=" + update_at +  

119.                 '}';  

120.     }  

121. }  

4,创建studentsSql查询映射文件userMapper.xml:


1.   <?xml version="1.0" encoding="UTF-8" ?>  

2.   <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

3.   <!-- 为这个mapper指定一个唯一的namespacenamespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的  

4.   例如namespace="com.springdemo.mapping.userMapper"就是com.springdemo.mapping(包名)+userMapper(userMapper.xml文件去除后缀)  

5.    -->  

6.   <mapper namespace="mapping.userMapper">  

7.       <!-- select标签中编写查询的SQL语句, 设置select标签的id属性为getUserid属性值必须是唯一的,不能够重复  

8.       使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型  

9.       resultType="model.User"就表示将查询结果封装成一个User类的对象返回  

10.      User类就是users表所对应的实体类  

11.      -->  

12.    

13.      <!-- 根据id查询得到一个user对象-->  

14.      <select id="getUser" parameterType="int"  

15.              resultType="model.User"> <!-- 创建对应user实体类的位置 -->  

16.          select * from students where id=#{id}  

17.      </select>  

18. </mapper>  

5.conf.xml文件中注册userMapper

1.    <mappers>  

2.           <!--注册userMapper.xml文件-->  

3.           <mapper resource="mapping/userMapper.xml"></mapper>  

4.       </mappers>  

 

6.进行单元测试,测试数据库连接是否成功

1.   import model.User;  

2.   import org.apache.ibatis.io.Resources;  

3.   import org.apache.ibatis.session.SqlSession;  

4.   import org.apache.ibatis.session.SqlSessionFactory;  

5.   import org.apache.ibatis.session.SqlSessionFactoryBuilder;  

6.   import org.junit.*;  

7.     

8.   import java.io.IOException;  

9.   import java.io.InputStream;  

10.    

11.  public class mybatisTest {  

12.      @BeforeClass  

13.      public static void before(){  

14.          System.out.println("global");  

15.      }  

16.      @AfterClass  

17.      public static void after(){  

18.          System.out.println("global destory");  

19.      }  

20.      @Before  

21.      public void start(){  

22.          System.out.println("测试开始");  

23.      }  

24.      @After  

25.      public void end(){  

26.          System.out.println("测试结束");  

27.      }  

28.      @Test  

29.      public void test1() throws IOException {  

30.          //Mybatsi的配置文件  

31.          String resource = "conf.xml";  

32.    

33.          //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)  

34.          InputStream is = Resources.getResourceAsStream(resource);  

35.    

36.          //构建SqlSession的工厂  

37.          SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);  

38.    

39.          //创建能执行映射文件中sqlsqlsession  

40.          SqlSession sqlSession = sessionFactory.openSession();  

41.    

42.         //根据key查找  

43.          String statement = "mapping.userMapper.getUser";  

44.          //映射sql的标识字符串,getUser与映射文件中配置select标签id一直  

45.          //执行查询返回一个唯一user对象的sql  

46.          User user = sqlSession.selectOne(statement, 2);  

47.          System.out.println(user);  

48.    

49.      }  

50.  }  


结果:

Mybatis连接数据库成功
中间碰到的问题:mybatis3.5.2应该应1.8版本JDK1.7版本会报错,不支持。

 

Mybatis增删改查

修改userMapper.xml统一管理返回类型

 

子元素id代表resultMap的主键,而result代表其属性。

在自定义的resultMap中第一列通常是主键id,那么id result有什么区别呢?

idresult都是映射单列值到一个属性或字段的简单数据类型。

唯一不同的是,id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用,尤其是应用到缓存和内嵌的结果映射。

 

1.   <resultMap id="userMap" type="model.User">  

2.           <id property="id" column="id" javaType="java.lang.Integer"></id>  

3.           <result property="name" column="name" javaType="java.lang.String"></result>  

4.           <result property="QQ" column="QQ" javaType="java.lang.String"></result>  

5.           <result property="addmissionTime" column="addmissionTime" javaType="java.lang.String"></result>  

6.           <result property="University" column="University" javaType="java.lang.String"></result>  

7.           <result property="onlineId" column="onlineId" javaType="java.lang.Integer"></result>  

8.           <result property="DailyLink" column="DailyLink" javaType="java.lang.String"></result>  

9.           <result property="declaration" column="declaration" javaType="java.lang.String"></result>  

10.         <result property="create_at" column="create_at" javaType="java.util.Date"></result>  

11.         <result property="update_at" column="update_at" javaType="java.util.Date"></result>  

12.     </resultMap>  

 

1.查询所有的user记录

1.   <!-- 根据_key查询得到一个user对象-->  

2.       <select id="selectUser" resultMap="userMap"  

3.               resultType="model.User"> <!-- 创建对应user实体类的位置 -->  

4.           select * from students  

5.       </select>  

 

1.   测试代码:
@Test  

2.       public void queryTest() throws IOException {  

3.           //Mybatsi的配置文件  

4.           String resource = "conf.xml";  

5.     

6.           //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)  

7.           InputStream is = Resources.getResourceAsStream(resource);  

8.     

9.           //构建SqlSession的工厂  

10.         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);  

11.   

12.         //创建能执行映射文件中sqlsqlsession  

13.         SqlSession sqlSession = sessionFactory.openSession();  

14.         String stateSelect = "mapping.userMapper.selectUser";  

15.         List<User> userList = sqlSession.selectList(stateSelect);  

16.         for (User user : userList) {  

17.             System.out.println(user);  

18.         }  

19.     }  

结果:

 

2.删除指定user记录

1.   <!-- 删除指定user记录-->  

2.       <delete id="deleteUser" parameterType="int">  

3.         delete from students where id = #{id}  

4.       </delete>  

 

测试代码:

 

1.   @Test  

2.      public void deleteTest() throws IOException {  

3.          //Mybatsi的配置文件  

4.          String resource = "conf.xml";  

5.     

6.          //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)  

7.          InputStream is = Resources.getResourceAsStream(resource);  

8.     

9.          //构建SqlSession的工厂  

10.        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);  

11.   

12.        //创建能执行映射文件中sqlsqlsession  

13.        SqlSession sqlSession = sessionFactory.openSession();  

14.   

15.        String statementdl = "mapping.userMapper.deleteUser";  

16.       try {  

17.           sqlSession.delete(statementdl, 1);  

18.           sqlSession.commit();  

19.       } catch (Exception e){  

20.           e.printStackTrace();  

21.           sqlSession.rollback();  

22.       }  

23.    }  


结果:


再次执行查询:

可以发现id1的信息已经删除
删除成功!

3.
修改students表记录

1.   <!--更新user表记录-->  

2.       <update id="updateUser">  

3.           update students set name=#{name},QQ=#{QQ},University=#{University} where id=#{id}  

4.       </update>  

 

测试代码:

1.   @Test  

2.      public void updateTest() throws IOException {  

3.          String resource="conf.xml";  

4.     

5.          InputStream is = Resources.getResourceAsStream(resource);  

6.     

7.          SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);  

8.     

9.          SqlSession sqlSession = sqlSessionFactory.openSession();  

10.   

11.        String statementup = "mapping.userMapper.updateUser";  

12.   

13.        User userUpdate = new User("灰太狼""666666","喜洋洋科技大学");  

14.        userUpdate.setId(2);  

15.        try {  

16.            sqlSession.update(statementup,userUpdate);  

17.            sqlSession.commit();  

18.        }catch (Exception e){  

19.            e.printStackTrace();  

20.            sqlSession.rollback();  

21.        }  

22.   

23.    }  

 

结果:

再次执行查询语句:

更新成功!

4.
新增user表记录

1.   <!--新增students表记录-->  

2.       <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">  

3.           INSERT  INTO students (name,QQ,University)  

4.           VALUES (#{name},#{QQ},#{University})  

5.       </insert>  

 

测试代码:

 

1.   @Test  

2.      public void insertTest() throws IOException {  

3.          String resource = "conf.xml";  

4.          InputStream is = Resources.getResourceAsStream(resource);  

5.     

6.          SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);  

7.     

8.          SqlSession sqlSession = sqlSessionFactory.openSession();  

9.     

10.        String statementIn = "mapping.userMapper.updateUser";  

11.   

12.        User userIn = new User("红太狼""888888""美羊羊科技大学");  

13.        try {  

14.            sqlSession.insert(statementIn,userIn);  

15.            sqlSession.commit();  

16.        }catch (Exception e){  

17.            e.printStackTrace();  

18.            sqlSession.rollback();  

19.        }  

20.   

21.    }  

结果:

再执行一次查询:

成功!



返回列表 返回列表
评论

    分享到