当前位置: 首页 > news >正文

济南外贸网站推广重庆门户网站建设

济南外贸网站推广,重庆门户网站建设,小说阅读网站开发,创建大型网站为了说明这一点#xff0c;我们正在考虑以下示例域模型#xff1a; 会有用户#xff0c;每个用户可能都有一个博客#xff0c;每个博客可以包含零个或多个帖子。 这三个表的数据库结构如下#xff1a; CREATE TABLE user (user_id int(10) unsigned NOT NULL auto_incr… 为了说明这一点我们正在考虑以下示例域模型 会有用户每个用户可能都有一个博客每个博客可以包含零个或多个帖子。 这三个表的数据库结构如下 CREATE TABLE user (user_id int(10) unsigned NOT NULL auto_increment,email_id varchar(45) NOT NULL,password varchar(45) NOT NULL,first_name varchar(45) NOT NULL,last_name varchar(45) default NULL,blog_id int(10) unsigned default NULL,PRIMARY KEY (user_id),UNIQUE KEY Index_2_email_uniq (email_id),KEY FK_user_blog (blog_id),CONSTRAINT FK_user_blog FOREIGN KEY (blog_id) REFERENCES blog (blog_id) ) ENGINEInnoDB DEFAULT CHARSETlatin1;CREATE TABLE blog (blog_id int(10) unsigned NOT NULL auto_increment,blog_name varchar(45) NOT NULL,created_on datetime NOT NULL,PRIMARY KEY (blog_id) ) ENGINEInnoDB DEFAULT CHARSETlatin1;CREATE TABLE post (post_id int(10) unsigned NOT NULL auto_increment,title varchar(45) NOT NULL,content varchar(1024) NOT NULL,created_on varchar(45) NOT NULL,blog_id int(10) unsigned NOT NULL,PRIMARY KEY (post_id),KEY FK_post_blog (blog_id),CONSTRAINT FK_post_blog FOREIGN KEY (blog_id) REFERENCES blog (blog_id) ) ENGINEInnoDB DEFAULT CHARSETlatin1; 在这里我将解释如何获取和映射*-一对一和一对多结果映射。 package com.sivalabs.mybatisdemo.domain;public class User {private Integer userId;private String emailId;private String password;private String firstName;private String lastName;private Blog blog;//setters and getters } package com.sivalabs.mybatisdemo.domain;import java.util.ArrayList; import java.util.Date; import java.util.List;public class Blog {private Integer blogId;private String blogName;private Date createdOn;private ListPost posts new ArrayListPost();//setters and getters } package com.sivalabs.mybatisdemo.domain;import java.util.Date;public class Post {private Integer postId;private String title;private String content;private Date createdOn;//setters and getters } 在mybatis-config.xml中为bean配置类型别名。 typeAliasestypeAlias typecom.sivalabs.mybatisdemo.domain.User aliasUser/typeAlias typecom.sivalabs.mybatisdemo.domain.Blog aliasBlog/typeAlias typecom.sivalabs.mybatisdemo.domain.Post aliasPost/ /typeAliases *-具有一个结果映射 在UserMapper.xml中如下配置sql查询和结果映射 mapper namespacecom.sivalabs.mybatisdemo.mappers.UserMapperresultMap typeUser idUserResultid propertyuserId columnuser_id/result propertyemailId columnemail_id/result propertypassword columnpassword/result propertyfirstName columnfirst_name/result propertylastName columnlast_name/association propertyblog resultMapBlogResult//resultMapresultMap typeBlog idBlogResultid propertyblogId columnblog_id/result propertyblogName columnBLOG_NAME/result propertycreatedOn columnCREATED_ON/ /resultMapselect idgetUserById parameterTypeint resultMapUserResultSELECT U.USER_ID, U.EMAIL_ID, U.PASSWORD, U.FIRST_NAME, U.LAST_NAME, B.BLOG_ID, B.BLOG_NAME, B.CREATED_ONFROM USER U LEFT OUTER JOIN BLOG B ON U.BLOG_IDB.BLOG_IDWHERE U.USER_ID #{userId}/selectselect idgetAllUsers resultMapUserResultSELECT U.USER_ID, U.EMAIL_ID, U.PASSWORD, U.FIRST_NAME, U.LAST_NAME, B.BLOG_ID, B.BLOG_NAME, B.CREATED_ONFROM USER U LEFT OUTER JOIN BLOG B ON U.BLOG_IDB.BLOG_ID/select/mapper 在JUnit Test中编写一种方法来测试关联加载。 public void getUserById() {SqlSession sqlSession MyBatisUtil.getSqlSessionFactory().openSession();try{UserMapper userMapper sqlSession.getMapper(UserMapper.class);User user userMapper.getUserById(1);System.out.println(user.getBlog());}finally{sqlSession.close();} } 一对多结果映射 在BlogMapper.xml中如下配置Blog to Posts关系 mapper namespacecom.sivalabs.mybatisdemo.mappers.BlogMapperresultMap typeBlog idBlogResultid propertyblogId columnblog_id/result propertyblogName columnBLOG_NAME/result propertycreatedOn columnCREATED_ON/collection propertyposts ofTypePost resultMapPostResult columnPrefixpost_/collection/resultMapresultMap typePost idPostResultid propertypostId columnpost_id/result propertytitle columntitle/result propertycontent columncontent/result propertycreatedOn columncreated_on//resultMapselect idgetBlogById parameterTypeint resultMapBlogResultSELECT b.blog_id, b.blog_name, b.created_on, p.post_id as post_post_id, p.title as post_title, p.content as post_content, p.created_on as post_created_onFROM blog b left outer join post p on b.blog_idp.blog_idWHERE b.BLOG_ID#{blogId}/selectselect idgetAllBlogs resultMapBlogResultSELECT b.blog_id, b.blog_name, b.created_on as blog_created_on, p.post_id as post_post_id, p.title as post_title, p.content as post_content, p.created_on as post_created_onFROM blog b left outer join post p on b.blog_idp.blog_id/select/mapper 在JUnit Test中编写一种测试方法来测试博客到帖子的关系映射。 public void getBlogById() {SqlSession sqlSession MyBatisUtil.getSqlSessionFactory().openSession();try{BlogMapper blogMapper sqlSession.getMapper(BlogMapper.class);Blog blog blogMapper.getBlogById(1);System.out.println(blog);ListPost posts blog.getPosts();for (Post post : posts) {System.out.println(post);}}finally{sqlSession.close();} } 支持 整合 MyBatis-Spring是MyBatis的子项目并提供Spring集成支持从而大大简化了MyBatis的用法。 对于那些熟悉Spring依赖注入方法的人来说使用MyBatis-Spring非常简单。 首先让我们看看不使用Spring的MyBatis的使用过程。 1.通过传递包含数据源属性映射器XML列表和TypeAliases等的mybatis-config.xml使用SqlSessionFactoryBuilder创建SqlSessionFactory。 2.从SqlSessionFactory创建SqlSession对象 3.从SqlSession中获取Mapper实例并执行查询。 4.使用SqlSession对象提交或回滚事务。 使用MyBatis-Spring可以在Spring ApplicationContext中配置上述大多数步骤并且可以将SqlSession或Mapper实例注入到Spring Bean中。 然后我们可以使用Spring的TransactionManagement功能而无需在整个代码中编写事务提交/回滚代码。 现在让我们看看如何配置MyBatis Spring集成的东西。 步骤1在pom.xml中配置MyBatis-Spring依赖项 dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.10/versionscopetest/scope/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.1.1/version/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.1.1/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context-support/artifactIdversion3.1.1.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion3.1.1.RELEASE/versionscopetest/scope/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.21/versionscoperuntime/scope/dependencydependencygroupIdcglib/groupIdartifactIdcglib-nodep/artifactIdversion2.2.2/version/dependency 步骤2您不需要在mybatis-config.xml中配置数据库属性。 我们可以在Spring Container中配置DataSource并使用它来构建MyBatis SqlSessionFactory。 MyBatis-Spring使用org.mybatis.spring.SqlSessionFactoryBean代替SqlSessionFactoryBuilder来构建SqlSessionFactory。 我们可以将dataSourceMapper XML文件位置typeAliases等传递给SqlSessionFactoryBean。 bean iddataSource classorg.apache.commons.dbcp.BasicDataSourceproperty namedriverClassName value${jdbc.driverClassName}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//beanbean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /property nametypeAliasesPackage valuecom.sivalabs.mybatisdemo.domain/property namemapperLocations valueclasspath*:com/sivalabs/mybatisdemo/mappers/**/*.xml //bean 步骤3配置提供ThreadSafe SqlSession对象的SqlSessionTemplate。 bean idsqlSession classorg.mybatis.spring.SqlSessionTemplateconstructor-arg index0 refsqlSessionFactory //bean 步骤4为了能够直接注入Mapper我们应该注册org.mybatis.spring.mapper.MapperScannerConfigurer并配置要在其中找到Mapper接口的包名称。 bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valuecom.sivalabs.mybatisdemo.mappers //bean 步骤5将 TransactionManager配置为支持基于注释的事务支持。 tx:annotation-driven transaction-managertransactionManager/bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource //bean 步骤6更新Service类并在Spring容器中注册它们。 package com.sivalabs.mybatisdemo.service;import java.util.List; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import com.sivalabs.mybatisdemo.domain.User; import com.sivalabs.mybatisdemo.mappers.UserMapper;Service Transactional public class UserService {Autowiredprivate SqlSession sqlSession; //This is to demonstrate injecting SqlSession objectpublic void insertUser(User user) {UserMapper userMapper sqlSession.getMapper(UserMapper.class);userMapper.insertUser(user);}public User getUserById(Integer userId) {UserMapper userMapper sqlSession.getMapper(UserMapper.class);return userMapper.getUserById(userId);}} package com.sivalabs.mybatisdemo.service;import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.sivalabs.mybatisdemo.domain.Blog; import com.sivalabs.mybatisdemo.mappers.BlogMapper;Service Transactional public class BlogService {Autowiredprivate BlogMapper blogMapper; // This is to demonstratee how to inject Mappers directlypublic void insertBlog(Blog blog) {blogMapper.insertBlog(blog);}public Blog getBlogById(Integer blogId) {return blogMapper.getBlogById(blogId);}public ListBlog getAllBlogs() {return blogMapper.getAllBlogs();} } 注意当我们可以直接注入Mappers时为什么还要注入SqlSession对象 因为SqlSession对象包含更细粒度的方法所以有时会派上用场。 例如如果我们想获取更新查询更新了多少条记录可以使用SqlSession如下所示 int updatedRowCount sqlSession.update(com.sivalabs.mybatisdemo.mappers.UserMapper.updateUser, user); 到目前为止我还没有找到一种无需使用SqlSession对象即可获取行更新计数的方法。 步骤7编写JUnit测试以测试UserService和BlogService。 package com.sivalabs.mybatisdemo;import java.util.List;import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.sivalabs.mybatisdemo.domain.User; import com.sivalabs.mybatisdemo.service.UserService;RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locationsclasspath:applicationContext.xml) public class SpringUserServiceTest {Autowiredprivate UserService userService;Testpublic void testGetUserById() {User user userService.getUserById(1);Assert.assertNotNull(user);System.out.println(user);System.out.println(user.getBlog());}Testpublic void testUpdateUser() {long timestamp System.currentTimeMillis();User user userService.getUserById(2);user.setFirstName(TestFirstNametimestamp);user.setLastName(TestLastNametimestamp);userService.updateUser(user);User updatedUser userService.getUserById(2);Assert.assertEquals(user.getFirstName(), updatedUser.getFirstName());Assert.assertEquals(user.getLastName(), updatedUser.getLastName());}} package com.sivalabs.mybatisdemo;import java.util.Date; import java.util.List;import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.sivalabs.mybatisdemo.domain.Blog; import com.sivalabs.mybatisdemo.domain.Post; import com.sivalabs.mybatisdemo.service.BlogService;RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locationsclasspath:applicationContext.xml) public class SpringBlogServiceTest {Autowiredprivate BlogService blogService;Testpublic void testGetBlogById() {Blog blog blogService.getBlogById(1);Assert.assertNotNull(blog);System.out.println(blog);ListPost posts blog.getPosts();for (Post post : posts) {System.out.println(post);}}Testpublic void testInsertBlog() {Blog blog new Blog();blog.setBlogName(test_blog_System.currentTimeMillis());blog.setCreatedOn(new Date());blogService.insertBlog(blog);Assert.assertTrue(blog.getBlogId() ! 0);Blog createdBlog blogService.getBlogById(blog.getBlogId());Assert.assertNotNull(createdBlog);Assert.assertEquals(blog.getBlogName(), createdBlog.getBlogName());}} 参考 MyBatis教程第3部分-映射关系   MyBatis教程第4部分–来自JCG合作伙伴 Siva Reddy的Spring Integration来自My Experiments on Technology博客。 翻译自: https://www.javacodegeeks.com/2012/11/mybatis-tutorial-crud-operations-and-mapping-relationships-part-2.html
http://www.pierceye.com/news/255302/

相关文章:

  • 专业的个人网站建设哪家建筑施工企业专职安全生产管理员
  • 企业网站模板php全球网站排名前100
  • 1688网站可以做全屏吗有哪些网站是织梦做的
  • vue2.0网站开发做网站没有成本的方法
  • 手机网站和app有什么区别流量对网站排名的影响因素
  • 北京全网营销推广公司网站建设以及seo
  • 免费html网站代码骨科医院网站模板
  • 华强方特网站开发辽宁工程技术大学电子信息网
  • 信誉好的网站建设案例微网站后台录入
  • 网站ui界面设计模板WordPress能连接支付端口吗
  • 网站建设与维护ppt模板下载昆明 网站搭建
  • 手机网站建设浩森宇特摄影作品投稿平台
  • 网站类网站开发犯罪吗肇东网站建设云聚达
  • 云南通耀建设工程有限公司网站少儿编程老师需要具备什么条件
  • 陕西交通建设集团蓝商分公司网站wordpress增加模板
  • 创建网站目录权限建网站域名注册后需要
  • 现在还有企业做网站的吗浏览器登录入口
  • 如何进行目的地网站建设阳江网站建设推广
  • 移动网站搭建如何做高并发网站的架构设计
  • 网站特效网网站制作出租
  • 公司商标设计logo图案优化专业的公司
  • 郑州网站设计见效快微信公众平台小程序入口
  • 自动化毕设题目网站开发自家电脑做网站服务器w7花生壳
  • 网站文件目录结构wordpress 短信发送
  • 合肥专业做网站的公司东莞阳光网投诉电话
  • 网站呢建设英雄联盟更新公告最新
  • 做ps图标什么网站最好免费微网站怎么做
  • 网站建设与网络编辑综合实训课程指导手册pdf软件外包
  • 网站开发规划书怎么写wordpress前端会员中心
  • asp.net网站建设实战 pdfWordpress媒体库途径