zoukankan      html  css  js  c++  java
  • Spring整合hibernate的一个例子:用事务买书

    jar包:





    基本的文件框架:


    1.首先配置jdbc的连接数据,也就是db.properties

    此处注意在url上,这里不是xml文件,不需要加上amp。用一个问号就可以 

    1
    2
    3
    4
    user=root
    password=
    driverClass=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/spring001?useUnicode=true&characterEncoding=UTF-8


    2.在    spring-config.xml 的spring容器中配置好加载db.properites的语句:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <context:property-placeholder location="classpath:db.properties"/>
      <!--扫描的-->
        <context:component-scan base-package="com"/>
     
     
        <!--数据源-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="user" value="${user}"/>
            <property name="password" value="${password}"/>
            <property name="driverClass" value="${driverClass}"/>
            <property name="jdbcUrl" value="${url}"/>
        </bean>

      


    3.用idea从设计好的数据库表格生成实体类和映射文件

      BooInfo.java和Buyer.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    package com.entities;
     
    import javax.persistence.*;
     
    /**
     * Created by Anonymous on 2016/3/19.
     */
    @Entity
    @Table(name = "book_info", schema = "spring001")
    public class BookInfo {
        private int id;
        private String bookname;
        private Integer bookprice;
        private Integer booknum;
     
        @Override
        public String toString() {
            return "BookInfo{" +
                "id=" + id +
                ", bookname='" + bookname + ''' +
                ", bookprice=" + bookprice +
                ", booknum=" + booknum +
                '}';
        }
     
        @Id
        @Column(name = "id", nullable = false)
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
        @Basic
        @Column(name = "BOOKNAME", nullable = true, length = 255)
        public String getBookname() {
            return bookname;
        }
     
        public void setBookname(String bookname) {
            this.bookname = bookname;
        }
     
        @Basic
        @Column(name = "BOOKPRICE", nullable = true)
        public Integer getBookprice() {
            return bookprice;
        }
     
        public void setBookprice(Integer bookprice) {
            this.bookprice = bookprice;
        }
     
        @Basic
        @Column(name = "BOOKNUM", nullable = true)
        public Integer getBooknum() {
            return booknum;
        }
     
        public void setBooknum(Integer booknum) {
            this.booknum = booknum;
        }
     
    }


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package com.entities;
     
    import javax.persistence.Basic;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
     
     
    @Entity
    public class Buyer {
        private int id;
        private String user;
        private Integer money;
     
        @Id
        @Column(name = "ID", nullable = false)
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
        @Basic
        @Column(name = "USER", nullable = true, length = 255)
        public String getUser() {
            return user;
        }
     
        public void setUser(String user) {
            this.user = user;
        }
     
        @Basic
        @Column(name = "MONEY", nullable = true)
        public Integer getMoney() {
            return money;
        }
     
        public void setMoney(Integer money) {
            this.money = money;
        }
     
    }


    4.在ioc配置文件中配置好sessionFactory,在这里写好了hibernate.cfg.xml的内容,就不用生成它了。 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <!--hibernate的工厂-->
       <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
           <property name="dataSource" ref="dataSource"/>
           <property name="mappingLocations" value="classpath:*.hbm.xml"></property>
           <property name="hibernateProperties">
               <props>
     
                   <prop key="hibernate.format_sql">true</prop>
                   <prop key="hibernate.show_sql">true</prop>
                   <prop key="hibernate.hbm2ddl.auto">update</prop>
                   <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
     
               </props>
     
           </property>
     
       </bean>

       

    映射文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    <hibernate-mapping>
     
        <class name="com.entities.BookInfo" table="book_info" schema="spring001">
            <id name="id">
                <column name="id" sql-type="int(11)"/>
                <generator class="native"/>
            </id>
            <property name="bookname">
                <column name="BOOKNAME" sql-type="varchar(255)" not-null="true"/>
            </property>
            <property name="bookprice">
                <column name="BOOKPRICE" sql-type="int(11)" not-null="true"/>
            </property>
            <property name="booknum">
                <column name="BOOKNUM" sql-type="int(11)" not-null="true"/>
            </property>
        </class>
    </hibernate-mapping>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    <hibernate-mapping>
     
        <class name="com.entities.Buyer" table="buyer" schema="spring001">
            <id name="id">
                <column name="ID" sql-type="int(11)"/>
                <generator class="native"/>
            </id>
            <property name="user">
                <column name="USER" sql-type="varchar(255)" not-null="true"/>
            </property>
            <property name="money">
                <column name="MONEY" sql-type="int(11)" not-null="true"/>
            </property>
        </class>
    </hibernate-mapping>





    5.写买书的一个接口好实现类:


    SomeActions.java   和SomeActionsImpl.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package com.com.actions;
     
    /**
     * Created by Anonymous on 2016/3/19.
     */
    public interface SomeActions {
     
     
        //获取所有书本的信息
        public void getBooksInfo();
     
     
        //获取某一个本书的价格
        public int checkBookPrice(String bookName);
     
     
        //买书后更新书的数量
        public void updateBookNum(String bookName);
     
     
        //买书后更新人的钱
        public void updateBuyerMoney(String userName, int price);
     
     
    }



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    package com.com.actions;
     
    import com.entities.BookInfo;
    import com.exceptions.BookNumException;
    import com.exceptions.CheckNullException;
    import com.exceptions.MoneyCheckException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;
     
    import java.util.Iterator;
    import java.util.List;
     
    @Repository
    public class SomeActionsImpl implements SomeActions {
     
     
        @Autowired
        private SessionFactory factory;
     
        public Session getSession() {
     
            return factory.getCurrentSession();
        }
     
        @Override
        public void getBooksInfo() {
     
            String hql = "From BookInfo";
     
            Query query = getSession().createQuery(hql);
     
            List<BookInfo> list = query.list();
     
            Iterator it = list.iterator();
            while (it.hasNext()) {
     
                BookInfo info = (BookInfo) it.next();
                System.out.println(info);
            }
        }
     
        @Override
        public int checkBookPrice(String bookName) {
     
            String hql = "select bookprice from BookInfo where bookname=:bookname";
     
            Query query = getSession().createQuery(hql);
            query.setString("bookname", bookName);
     
     
            if (query.uniqueResult() == null) {
     
                throw new CheckNullException("检索数据库中无此内容,请检查输入内容是否包含在数据库中......");
            } else {
     
     
                return (Integer) query.uniqueResult();
     
            }
     
     
        }
     
        @Override
        public void updateBookNum(String bookName) {
     
            String hql1 = "select bookprice from BookInfo where bookname=:bookname";
            int bookNum = (Integer) getSession().createQuery(hql1).setString("bookname", bookName).uniqueResult();
     
     
            if (bookNum == 0) {
     
     
                throw new BookNumException("库存不够了");
     
            }
     
     
            String hql = "update BookInfo set booknum=booknum-1 where bookname=:bookname";
     
            getSession().createQuery(hql).setString("bookname", bookName).executeUpdate();
        }
     
        @Override
        public void updateBuyerMoney(String userName, int price) {
     
            String hql1 = "select money from Buyer where user=:user";
     
            Query query = getSession().createQuery(hql1).setString("user", userName);
     
            int money = (Integer) query.uniqueResult();
     
            if (money < price) {
     
                throw new MoneyCheckException("余额不够了.....");
            }
     
            String hql = "update Buyer set money=money-:price where user=:user";
     
            getSession().createQuery(hql).setInteger("price", price).setString("user", userName).executeUpdate();
        }
    }




    6.写几个简单的继承runtimeException的类,提示出错信息:三个内容一样,就是类名不一样:


    BookNumException.java和CheckNullException.java和MoneyCheckException.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    package com.exceptions;
     
    /**
     * Created by Anonymous on 2016/3/19.
     */
    public class MoneyCheckException extends RuntimeException {
     
        public MoneyCheckException() {
            super();
        }
     
        public MoneyCheckException(String message) {
            super(message);
        }
     
        public MoneyCheckException(String message, Throwable cause) {
            super(message, cause);
        }
     
        public MoneyCheckException(Throwable cause) {
            super(cause);
        }
     
        protected MoneyCheckException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
        }
    }



    7.开始写事务的类,买一本书的类BuyOneBook.java

    接口与实现类

    1
    2
    3
    4
    5
    6
    7
    8
    package com.services;
     
     
    public interface BuyOneBook {
     
        public void purchase(String buyerName, String bookName);
     
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package com.services;
     
    import com.com.actions.SomeActions;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
     
    @Service
    public class BuyOneBookImpl implements BuyOneBook {
     
        @Autowired
        private SomeActions actions;
     
     
        @Override
        public void purchase(String buyerName, String bookName) {
     
            actions.getBooksInfo();
            int price = actions.checkBookPrice(bookName);
            actions.updateBookNum(bookName);
            actions.updateBuyerMoney(buyerName, price);
        }
    }



    买多本书的类,接口类与实现类:


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package com.services;
     
    import java.util.List;
     
    /**
     * Created by Anonymous on 2016/3/19.
     */
    public interface BuySomeBooks {
     
        public void buySome(String buyerName, List<String> bookNames);
     
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.services;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    import java.util.List;
     
     
    @Service
    public class BuySomeBooksImpl implements BuySomeBooks {
     
        @Autowired
        private BuyOneBook buyOneBook;
     
        @Override
        public void buySome(String buyerName, List<String> bookNames) {
            for (String s : bookNames) {
     
                buyOneBook.purchase(buyerName, s);
            }
     
     
        }
    }




    8.在ioc容器中配置事务方面的内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <!--事务管理器-->
        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
     
     
        <!--配置切面,对哪些方法起作用,并且交给事务管理-->
        <tx:advice id="conn" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="purchase" propagation="REQUIRED"/>
                <tx:method name="get*" read-only="true"/>
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
     
     
        <!--配置切点,并且放到切面设置上-->
        <aop:config>
            <aop:pointcut id="pointCut" expression="execution(* com.services.*.*(..))"/>
     
            <aop:advisor advice-ref="conn" pointcut-ref="pointCut"></aop:advisor>
     
        </aop:config>



    完整的ioc文件:spring-config.xml


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <!--事务管理器-->
        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
     
     
        <!--配置切面,对哪些方法起作用,并且交给事务管理-->
        <tx:advice id="conn" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="purchase" propagation="REQUIRED"/>
                <tx:method name="get*" read-only="true"/>
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
     
     
        <!--配置切点,并且放到切面设置上-->
        <aop:config>
            <aop:pointcut id="pointCut" expression="execution(* com.services.*.*(..))"/>
     
            <aop:advisor advice-ref="conn" pointcut-ref="pointCut"></aop:advisor>
     
        </aop:config>



    测试类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package com.test;
     
    import com.com.actions.SomeActions;
    import com.services.BuyOneBook;
    import com.services.BuySomeBooks;
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    import javax.sql.DataSource;
    import java.sql.SQLException;
    import java.util.Arrays;
     
     
    public class Main {
     
        private ApplicationContext ac = null;
     
        private BuyOneBook buyOneBook;
        private BuySomeBooks buySomeBooks;
     
        @Autowired
        private SomeActions someActions;
     
        public Main() {
     
            ac = new ClassPathXmlApplicationContext("spring-config.xml");
            buyOneBook = ac.getBean(BuyOneBook.class);
            buySomeBooks = ac.getBean(BuySomeBooks.class);
        }
     
     
        @Test
        public void testBuyOne() {
     
            buyOneBook.purchase("Tom", "西游记");
     
     
        }
     
        @Test
        public void testBuySome() {
     
            buySomeBooks.buySome("Tom", Arrays.asList("三国演义", "西游记"));
     
     
        }
     
        @Test
        public void testConnection() throws SQLException {
     
            DataSource dataSource = (DataSource) ac.getBean("dataSource");
     
            System.out.println(dataSource.getConnection());
     
        }
    }

              





  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/share2015/p/5297015.html
Copyright © 2011-2022 走看看