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

漳州建设局网站首页昆明网络营销服务公司

漳州建设局网站首页,昆明网络营销服务公司,交易平台,甘肃省城乡建设局网站首页From#xff1a; https://www.cnblogs.com/luyiba/p/6303717.html MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如注册驱动、设置参数、创建Connectio…From https://www.cnblogs.com/luyiba/p/6303717.html MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如注册驱动、设置参数、创建Connection/Statement、解析结果集等JDBC过程性代码.MyBatis基于XML/注解的方式配置Statement,执行SQL,并将执行结果映射成Java对象, 大大降低了数据库开发的难度. MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records. – MyBatis项目地址/在线文档. 初识MyBatis 使用MyBatis需要在pom.xml中添加如下依赖: dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.3.0/version /dependency dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.36/version /dependency Select 配置mybatis/mybatis-configuration.xml 作为MyBatis的全局配置文件,其配置了MyBatis的运行环境信息(如数据源/mapper文件等). ?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd configurationenvironments defaultdevelopmentenvironment iddevelopment!-- 配置JDBC事务管理--transactionManager typeJDBC/!-- 配置数据源--dataSource typePOOLEDproperty namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql://host:port/db?characterEncodingutf-8/property nameusername valueusername/property namepassword valuepassword//dataSource/environment/environments!-- 加载mapper映射文件 --mappersmapper resourcemybatis/mapper/UserDAO.xml//mappers /configuration 书写UserDAO(mapper映射) 最为MyBatis最核心的部分,配置了操作数据库的SQL语句: ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacenamespaceselect idselectUserById parameterTypejava.lang.Integer resultTypecom.fq.domain.UserSELECT * FROM user WHERE id #{id};/selectselect idselectUserByName parameterTypejava.lang.String resultTypecom.fq.domain.UserSELECT * FROM user WHERE name LIKE %${value}%;/select/mapper 属性描述namespace命名空间,用于隔离SQL语句parameterType定义SQL输入映射类型,MyBatis通过OGNL从输入对象中获取参数传入SQL语句.resultType定义SQL输出映射类型,MyBatis将SQL查询结果的一行记录映射为resultType指定的类型.mapper映射文件名有UserDAO.xml/UserMapper.xml/User.xml等几种形式, 其一般存放在与mybatis-configuration.xml同级的mapper目录下,由于其主要作用为定义SQL语句与映射关系, 因此一般统称为mapper映射文件. 定义PO类 PO类主要作用为SQL(输入/输出)映射,通常与数据库表对应: /*** author jifang* since 15/12/31 下午2:27.*/ public class User {private Integer id;private String name;private String password;public User() {}public User(Integer id, String name, String password) {this.id id;this.name name;this.password password;}public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}Overridepublic String toString() {return User{ id id , name name \ , password password \ };} } UserDAO(Java对象) 获得SqlSession,执行SQL语句, 得到映射结果: /*** author jifang* since 16/2/24 下午6:15.*/ public class UserDAO {private SqlSessionFactory factory;Beforepublic void setUp() throws IOException {String resource mybatis/mybatis-configuration.xml;factory new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));}Testpublic void selectUserById() {try (SqlSession session factory.openSession()) {User user session.selectOne(namespace.selectUserById, 1);System.out.println(user);}}Testpublic void selectUserByName() {try (SqlSession session factory.openSession()) {ListUser users session.selectList(namespace.selectUserByName, student);for (User user : users) {System.out.println(user);}}} } Insert mapper insert idinsertUser parameterTypecom.fq.domain.UserINSERT INTO user(name, password) VALUES(#{name}, #{password}); /insert UserDAO Test public void insertUser() {try (SqlSession session factory.openSession()) {User user new User();user.setName(new_name1);user.setPassword(new_password);session.insert(namespace.insertUser, user);session.commit();} } 自增主键返回 修改mapper文件,添加selectKey/,可以将MySQL的自增主键(即刚刚插入数据时生成的ID)返回: insert idinsertUser parameterTypecom.fq.domain.UserselectKey keyPropertyid orderAFTER resultTypejava.lang.IntegerSELECT LAST_INSERT_ID();/selectKeyINSERT INTO user(name, password) VALUES(#{name}, #{password}); /insert 属性描述keyProperty指定存储到DO中的哪个属性;orderselectKey执行顺序(相对于insert语句),AFTER/BEFORE;resultType主键返回类型(DO中对应属性的类型);LAST_INSERT_ID()MySQL函数,返回auto_increment自增列新记录值. UserDAO Test public void insertUser() {try (SqlSession session factory.openSession()) {System.out.println(session);User user new User(null, new_name, new_password);session.insert(namespace.insertUser, user);// 需要在commit之后才能获得自增主键session.commit();System.out.println(user.getId());} } 该功能还可以通过insert/的useGeneratedKeys/keyProperty两个属性合作完成, 详见MyBatis文档. Update mapper update idupdateUserById parameterTypecom.fq.domain.UserUPDATE user SET name #{name}, password #{password} WHERE id #{id}; /update UserDAO Test public void updateUserById() {try (SqlSession session factory.openSession(true)) {session.update(namespace.updateUserById,new User(1, feiqing, ICy5YqxZB1uWSwcVLSNLcA));} } Delete mapper delete iddeleteUserById parameterTypejava.lang.IntegerDELETE FROM user WHERE id #{id}; /delete UserDAO Test public void deleteUserById() {try (SqlSession session factory.openSession(true)) {session.delete(namespace.deleteUserById, 51615);} } 小结 #{}/${} #{}: 表示一个占位符号,实现向PreparedStatement占位符中设置值(#{}表示一个占位符?),自动进行Java类型到JDBC类型的转换(因此#{}可以有效防止SQL注入).#{}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,#{}花括号中可以是value或其它名称.${}: 表示拼接SQL串,通过${}可将parameterType内容拼接在SQL中而不进行JDBC类型转换,${}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,${}花括号中只能是value. 虽然${}不能防止SQL注入,但有时${}会非常方便(如order by排序,需要将列名通过参数传入SQL,则用ORDER BY ${column},使用#{}则无法实现此功能(详见JDBC基础关于PreparedStatement的讨论). SqlSession 提供操作数据库的方法(如:selectOne/selectList).但SqlSession是线程不安全的,因此最好将其定义成局部变量使用. MyBatis优点(与JDBC相比) SQL写在Java代码中导致不易维护, 而MyBatis将SQL写在mapper中,XML与Java代码分离.向SQL语句传参繁琐(如:SQL的where条件不一,SQL数据类型与Java不同),MyBatis通过parameterType自动将Java对象映射至SQL语句.结果集解析麻烦(SQL变化导致解析代码变化,SQL数据类型与Java不同),MyBatis通过resultType自动将SQL执行结果映射成Java对象.附: 最好在pom.xml中添加一个日志系统实现(logback/log4j), 这样会在调试程序时打印日志信息,便于查错, 以logback为例: pom.xml dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.1.2/version /dependency logback.xml configurationproperty namelogRoot value/data/logs/property namepattern value%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n/appender nameSTDOUT classch.qos.logback.core.ConsoleAppenderencoderpattern${pattern}/pattern/encoder/appenderappender nameFILE classch.qos.logback.core.rolling.RollingFileAppenderrollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${logRoot}/common-server.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory7/maxHistory/rollingPolicyencoderpattern${pattern}/pattern/encoder/appenderroot levelDEBUGappender-ref refSTDOUT/appender-ref refFILE//root/configuration 其他关于MyBatis日志的详细信息可参考MyBatis文档日志部分. DAO开发 使用MyBatis开发DAO有两个方法,原始DAO开发与Mapper映射DAO开发. 原始DAO开发 原始DAO开发需要开发人员编写DAO接口与DAO实现,如根据ID查询用户信息: mapper(同前) select idselectUserById parameterTypejava.lang.Integer resultTypecom.fq.domain.UserSELECT * FROM user WHERE id #{id}; /select UserDAO接口 /*** author jifang* since 16/2/22 上午10:20.*/ public interface UserDAO {User selectUserById(Integer id) throws Exception; } UserDAO实现 public class UserDAOImpl implements UserDAO {private SqlSessionFactory factory;public UserDAOImpl(SqlSessionFactory factory) {this.factory factory;}Overridepublic User selectUserById(Integer id) throws Exception {SqlSession session factory.openSession();User user session.selectOne(namespace.selectUserById, id);session.close();return user;} } Client public class MyBatisClient {Testpublic void originalClient() throws Exception {UserDAO dao new UserDAOImpl(new SqlSessionFactoryBuilder().build(ClassLoader.getSystemResourceAsStream(mybatis/mybatis-configuration.xml)));User user dao.selectUserById(1);System.out.println(user);} } 原始DAO开发中存在的问题: 1) DAO实现方法体中存在很多过程性代码. 2) 调用SqlSession的方法(select/insert/update)需要指定Statement的id,存在硬编码,不利于代码维护.Mapper映射开发 mapper映射开发方法只需编写DAO接口,MyBatis根据接口定义与mapper文件中的SQL语句动态创建接口实现. mapper ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.fq.mybatis.UserDAOselect idselectUserById parameterTypejava.lang.Integer resultTypecom.fq.domain.UserSELECT * FROM user WHERE id #{id};/select /mapper 注意: 此时namespace必须与UserDAO接口的全限定名相同. UserDAO接口与前面相同, 但不再使用UserDAOImplClient /*** author jifang* since 16/2/22 下午2:57.*/ public class MyBatisClient {private SqlSession session;private SqlSessionFactory factory;Beforepublic void setUp() {factory new SqlSessionFactoryBuilder().build(ClassLoader.getSystemResourceAsStream(mybatis/mybatis-configuration.xml));session factory.openSession();}Testpublic void mapperClient() throws Exception {UserDAO dao session.getMapper(UserDAO.class);User user dao.selectUserById(1);System.out.println(user);}Afterpublic void tearDown() {session.close();} } mapper映射开发方法需要遵循以下规范: mapper文件中的namespace与DAO接口的全限定名相同;mapper文件中的Statement的id与DAO接口方法名相同;mapper文件中的Statement的parameterType/resultType与DAO方法的入参/回参类型相同.Mapper映射 mapper映射文件(如UserDAO.xml)主要作用是定义SQL语句(每个SQL是一个Statement),是MyBatis的核心. MyBatis官方推荐使用mapper映射的方法来开发DAO,因此我们以后就不再过多介绍原始DAO的开发. 输入映射 多个形参 传递简单类型前面示例已经使用过,在此就不再赘述.当需要传递多个形参时,不再需要设置parameterType参数: mapper update idupdateUserByIdUPDATE user SET name #{1}, password #{2} WHERE id #{0}; /update UserDAO void updateUserById(Integer id, String name, String password) throws Exception; 传入PO MyBatis使用OGNL表达式解析对象属性值: mapper select idselectUserByNamePassword parameterTypecom.fq.domain.User resultTypecom.fq.domain.UserSELECT *FROM userWHERE name #{name} AND password #{password}; /select UserDAO User selectUserByNamePassword(User user) throws Exception; 传入Map mapper select idselectUserByMap parameterTypejava.util.Map resultTypecom.fq.domain.UserSELECT *FROM userWHERE name #{name} AND password #{password}; /select #{}花括号内对应Map的key. UserDAO User selectUserByMap(MapString, Object map) throws Exception; 输出映射 输出简单类型 mapper select idselectUserCount parameterTypejava.lang.String resultTypejava.lang.IntegerSELECT count(*)FROM userWHERE name LIKE %${value}%; /select UserDAO Integer selectUserCount(String name) throws Exception; 返回简单类型必须保证查询结果只有一行记录,最终将第一个字段的值转换为输出类型. 输出PO对象/列表 前面已经演示过输出两种类型(selectUserById/selectUserByName虽然当时使用的是原始DAO开发方法, 但mapper定义形式大同小异),因此在这儿只做简单总结: 输出单个PO对象和输出PO列表在mapper中定义的resultType是一样的;输出单个PO对象要保证SQL查询结果为单条数据,其内部使用selectOne方法调用;输出PO列表表示查询结果可能为多条,其内部使用selectList方法调用,接口返回值可用ListPO/SetPO承载.输出Map 输出PO对象完全可以改用Map输出,字段名作key,字段值作value. mapper select idselectUserLikeName resultTypejava.util.MapSELECT *FROM userWHERE name LIKE %${value}%; /select UserDAO ListMapString, Object selectUserLikeName(String name) throws Exception; resultMap resultType可将查询结果映射为PO,但前提是PO属性名与SQL字段名必须一致,如不一致,则可通过resultMap作对应映射: mapper resultMap iduserMap typecom.fq.domain.Userid columnuser_id propertyid/result columnuser_name propertyname/result columnuser_password propertypassword/ /resultMapselect idselectUserByName parameterTypejava.lang.String resultMapuserMapSELECTid user_id,name user_name,password user_passwordFROM userWHERE name #{name}; /select 属性描述id/表示查询结果集的唯一标识;result/表示普通结果,即PO属性;column表示SQL查询出来的字段名,property表示PO属性. UserDAO接口同前.
http://www.zqtcl.cn/news/39192/

相关文章:

  • 旅游网站项目策划书金融网站框架模板下载
  • 地方网站 域名选择中信建设有限责任公司获奖
  • 成都教育行业网站建设永久网站域名
  • 展厅设计作品欣赏案例seo查询 站长之家
  • 江苏省建设局报考网站北海网站开发
  • 搭建网站做财务系统域名注册后怎么使用
  • 孝感网站开发优搏快网站seo在线检测
  • 丹阳网站建设公司登陆网站取消备案
  • 电脑端网站和手机网站区别社团网站模板
  • 产品网站建设多少钱网站建设要会哪些方面
  • 网站建设能做什么工作工商管理局注册查询
  • 网站开发易语言网站页面优化方法有哪些
  • jquery网站发展历史时间轴网站源码论坛
  • 做室内设计兼职的网站七牛云动静分离wordpress
  • 厦门好的网站设计东昌府做网站
  • 现在在市场上做网站怎么样成都大邑网站建设
  • 网站权重对应的等级wordpress如何重置
  • 东莞网站推广优化搜索推广什么是网站关键词
  • 网站建设需要具备的能力域名查询工具
  • 建设银行住房公积金预约网站电子商务网站建设实训心得体会
  • 资源专业网站优化排名帮别人做海报网站
  • 商城网站 没有什么文章 怎样优化新闻聚合网站开发
  • 企业网站建设总结如何做好网络维护工作
  • 虚拟主机网站被挂马现在网站建站的主流语言是什么
  • 嘉兴网站优化排名做微商必备十大软件
  • 网站开发实例WordPress缓存插件开发
  • 珠海好的网站制作平台win7iis如何做网站
  • 给企业做网站多少钱广州视频制作
  • 西安网站制作顶尖会员卡管理系统代码
  • 深圳做网站的好公司网站建设教程搭建