php做网站登录界面,如何建企业网站,学建网站要多久,电脑培训学校网站1、CRUD
1.namespace
namespace中的包名要和Dao/Mapper 接口的包名一致#xff01;
1个Dao接口类对应1个mapper#xff0c;也对应1个namespace#xff0c;
1个Dao接口中的方法对应1个namespace中一个SQL语句
2.CRUD
id#xff1a;对应的namespace接口中的方法名resul…1、CRUD
1.namespace
namespace中的包名要和Dao/Mapper 接口的包名一致
1个Dao接口类对应1个mapper也对应1个namespace
1个Dao接口中的方法对应1个namespace中一个SQL语句
2.CRUD
id对应的namespace接口中的方法名resultTypeSQL语句执行的返回值——承载数据的实体类parameterType参数类型
1、编写接口UserMapper(修改UserDao为UserMapper)
public interface UserMapper {// 查询全部用户ListUser getUserList();// 根据id查询用户User getUserById(int id);// 插入一个用户int addUser(User user);// 修改一个用户int updateUser(User user);// 删除一个用户void deleteUser(int id);}2、编写对应的mapper中的sql语句UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
!--namespace绑定一个对应的Dao/Mapper接口--
mapper namespacecom.kuang.dao.UserMapperselect idgetUserList resultTypecom.kuang.pojo.Userselect * from mybatis.user/selectselect idgetUserById parameterTypeint resultTypecom.kuang.pojo.Userselect * from user where id#{id}/select!--对象中的属性可以直接取出来--insert idaddUser parameterTypecom.kuang.pojo.Userinsert into user(id,name,pwd) values(#{id},#{name},#{pwd})/insertupdate idupdateUser parameterTypecom.kuang.pojo.Userupdate user set name#{name},pwd#{pwd} where id#{id}/updatedelete iddeleteUser parameterTypeintdelete from user where id#{id}/delete
/mapper3、将mapper注册到核心配置文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttps://mybatis.org/dtd/mybatis-3-config.dtd
!--核心配置文件--
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLED!--数据库驱动--property namedriver valuecom.mysql.cj.jdbc.Driver/!--amp;表示转义后的--property nameurl valuejdbc:mysql://localhost:3306/mybatis?useSSLtrueamp;useUnicodetrueamp;characterEncodingUTF-8amp;serverTimezoneAsia/Shanghai/property nameusername valueroot/property namepassword valueniit1234//dataSource/environment/environments!--注册mapper--mappersmapper resourcecom/kuang/mapper/UserDaoMapper.xml//mappers
/configuration4、测试
package com.kuang.dao;import com.kuang.Utils.MybatisUtils;
import com.kuang.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class UserDaoTest {//对于Test的方法光标聚焦在对应方法上右键Testpublic void test(){//第一步获取SqlSession对象SqlSession sqlSession MybatisUtils.getSqlSession();;try{//方式1:getMapper()UserMapper userMapper sqlSession.getMapper(UserMapper.class);ListUser userList userMapper.getUserList();for(User user:userList){System.out.println(user);}System.out.println();//方式2selectList() 不推荐
// ListUser userList2sqlSession.selectList(com.kuang.dao.UserMapper.getUserList);
// for(User user : userList2){
// System.out.println(user);
// }}catch(Exception e){e.printStackTrace();}finally{//关闭sqlSessionsqlSession.close();}}Testpublic void getUserById(){SqlSession sqlSessionMybatisUtils.getSqlSession();try{UserMapper mappersqlSession.getMapper(UserMapper.class);User user mapper.getUserById(1);System.out.println(user);}catch(Exception e){e.printStackTrace();}finally {sqlSession.close();}}//增删改必须要提交事务Testpublic void addUser(){SqlSession sqlSessionMybatisUtils.getSqlSession();try{UserMapper mapper sqlSession.getMapper(UserMapper.class);//修改Userdao中的该方法返回值为void则没有返回值int resmapper.addUser(new User(4,赵六,123489));if(res0){System.out.println(插入成功);}//提交事务sqlSession.commit();}catch(Exception e){e.printStackTrace();}finally {sqlSession.close();}}Testpublic void updateUser(){SqlSession sqlSession MybatisUtils.getSqlSession();UserMapper mappersqlSession.getMapper(UserMapper.class);int resmapper.updateUser(new User(4,赵六六,124376));if(res0){System.out.println(修改成功);}sqlSession.commit();sqlSession.close();}Testpublic void deleteUser(){SqlSession sqlSession MybatisUtils.getSqlSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);int resmapper.deleteUser(4);if(res0) {sqlsession.commit();System.out.println(SUCCESS!);}else {sqlsession.rollback();System.out.println(FAILED!);}sqlSession.commit();sqlSession.close();}
}
注意增删改必需要提交事务sqlSession.commit()
常见错误
标签不要匹配错resource绑定mapper需要使用路径程序配置文件必须符合规范空指针异常没有注册到资源target输出xml文件中存在中文乱码问题maven资源没有导出问题
2、万能Map
假设我们的实体类或者数据库中的表字段或者参数过多我们应当考虑使用Map!
1、UserMapper //万能的mapint addUser2(MapString,Object map);2、UserMapper
!--传递map的key--
insert idaddUser2 parameterTypemap insert into mybatis.user(id,name,pwd) values (#{userid},#{userName},#{passWord});
/insert3、测试
Test
public void addUser2(){SqlSession sqlSession MybatisUtils.getSqlSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);HashMapString, Object map new HashMap();map.put(userid,5);map.put(userName,hello);map.put(passWord,976543);mapper.addUser2(map);sqlSession.commit();sqlSession.close();
}Map 传递参数直接在sql中取出key 【parameterType“Map”】 对象传递参数直接在sql中取对象的属性即可 【parameterType“com.kuang.pojo.User”】 只有一个基本类型参数的情况下可以直接在sql中取到 多个参数用Map或注解
3、模糊查询
like通配符
通配符%——0或多个 _——1个
两种方法 在sql拼接中使用通配符(不推荐有sql注入问题 select idgetUserLikeselect * from user where name like %#{value}%
/selectJava代码执行的时候传递通配符 %%。如下步骤 1、UserMapper //模糊查询
ListUser getUserLike(String value);2、UserMapper.xml select idgetUserLike resultTypecom.study.pojo.Userselect * from user where name like #{value}
/select3、测试 Test
public void getUserLike(){SqlSession sqlSession MybatisUtils.getSqlSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);ListUser userlist mapper.getUserLike(李%);for(User user:userlist){System.out.println(user);}
}4、配置解析
核心配置文件 mybatis-config.xml
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下
configuration配置 properties属性 settings设置 typeAliases类型别名 typeHandlers类型处理器 objectFactory对象工厂 plugins插件 environments环境配置 environment环境变量 transactionManager事务管理器dataSource数据源 databaseIdProvider数据库厂商标识 mappers映射器
新建模块
1. 在src/main/resources路径下建立mybatis-config.xml文件2. 在src/main/java/com/study/utils路径下编写工具类MybatisUtils.java读取配置文件获取sqlsessionfactory3. 在src/main/java/com/study/pojo路径下编写实体类User.java4. 在src/main/java/com/study/dao路径下编写接口UserMapper.java和UserMapper.xml5. 编写测试类
环境配置environments MyBatis 可以配置成适应多种环境根据id识别不同环境 尽管可以配置多个环境但每个 SqlSessionFactory 实例只能选择一种环境。 学会配置多套运行环境-----更改id environments defaultidMybatis默认的事务管理器就是JDBC连接池POOLED 连接池使并发 Web 应用快速响应请求
!--默认使用的环境 ID比如defaultdevelopment--environments defaultdevelopment!--每个 environment 元素定义的环境 ID比如iddevelopment--environment iddevelopment!--事务管理器的配置 typeJDBC(默认)|MANAGED--transactionManager typeJDBC/!--数据源的配置 typePOOLED(默认)|UNPOOLED|JDN连接池使并发 Web 应用快速响应请求--dataSource typePOOLED!--driver – 这是 JDBC 驱动的 Java 类全限定名并不是 JDBC 驱动中可能包含的数据源类--property namedriver valuecom.mysql.jdbc.Driver/!--url – 这是数据库的 JDBC URL 地址。 amp;表示转义后的--property nameurl valuejdbc:mysql://localhost:3306/mybatis?useSSLtrueamp;useUnicodetrueamp;characterEncodingUTF-8amp;serverTimezoneAsia/Shanghai/!--username – 登录数据库的用户名--property nameusername valueroot/!--password – 登录数据库的密码--property namepassword value123456//dataSource/environment/environments事务管理器transactionManager type[ JDBC | MANAGED ]/ 有三种内建的数据源类型 dataSource type[UNPOOLED|POOLED|JNDI] unpooled 这个数据源的实现只是每次被请求时打开和关闭连接。pooled 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得 并发 Web 应用快速响应请求的流行处理方式。jndi这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用容器可以集中或在外部配置数据源然后放置一个 JNDI 上下文的引用。数据源也有很多第三方的实现比如dbcpc3p0druid等等…
属性properties 数据库这些属性都是可外部配置且可动态替换的 我们可以通过properties属性来实现引用属性文件 这些属性可以在外部进行配置并可以进行动态替换。你既可以在典型的 Java 属性文件【db.properties】中配置这些属性也可以在 properties 元素的子元素中设置
我们来优化我们的配置文件 编写一个配置文件db.properties drivercom.mysql.cj.jdbc.Driver
urljdbc:mysql://localhost:3306/mybatis?useSSLtrueuseUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai
usernameroot
passwordniit1234将db.properties文件导入核心 配置文件mybatis-config.xml properties元素要卸载environmens元素前面否则报错 !--引入外部属性文件 由于db.properties和mabatis-config.xml都在resource目录下不必考虑路径名--!--方法1所有属性都是用db.properties中的--
!-- properties resourcedb.properties/--!--方法2既可以在典型的 Java 属性文件中配置这些属性也可以在 properties 元素的子元素中设置。在mybatis-config.xml中设置property元素不会覆盖db.properties中的值--properties resourcedb.propertiesproperty nameusername valueroot/property namepassword valueniit12//properties也可以在 SqlSessionFactoryBuilder.build() 方法中传入属性值。例如 SqlSessionFactory factory new SqlSessionFactoryBuilder().build(reader, props);// ... 或者 ...SqlSessionFactory factory new SqlSessionFactoryBuilder().build(reader, environment, props);注意事项 可以直接引入外部文件 可以在中通过增加一些属性配置 如果两个文件有同一个字段优先使用外部配置文件(db.proerpties)的 如果一个属性在不只一个地方进行了配置那么MyBatis 将按照下面的顺序来加载 首先读取在 properties 元素体内指定的属性。 然后根据 properties 元素中的 resource 属性读取类路径下属性文件(如com/kuang/dao/UserDaoMapper.xml)或根据url 属性指定的路径读取属性文件并覆盖之前读取过的同名属性。 最后读取作为方法参数传递的属性并覆盖之前读取过的同名属性。 通过方法参数传递的属性具有最高优先级resource/url 属性中指定的配置文件次之最低优先级的则是 properties 元素中指定的属性。
类型别名typeAliases
类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置意在降低冗余的全限定类名书写。
方法1typeAlias
方法1typeAlias方法2package
指定一个包名MyBatis 会在包名下面搜索需要的 Java Bean比如
即扫描实体类所在的包包下类的类名就是该类的别名首字母小写大写也行 !--给实体类起别名--typeAliases!--方法1--typeAlias typecom.kuang.pojo.User aliasUser/!--方法2--package namecom.kuang.pojo//typeAliases
每一个在包 com.kuang.pojo.User 中的 Java Bean在没有注解的情况下会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.kuang.pojo.Author 的别名为 author若有注解则别名为其注解值。见下面的例子
Alias(author)
public class Author {...
}两种方法的区别
实体类比较少的时候使用第一种方式如果实体类十分多建议使用第二种第一种可以DIY别名第二种则不行如果非要改需要在实体类上增加注解
Alias(Hello)
public class User select idgetUserList resultTypeHelloselect * from mybatis.user
/selectMybatis自带别名
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的注意为了应对原始类型的命名重复采取了特殊的命名风格。八大基本数据类型前加下划线对应的包装类小写即可
别名映射的类型_bytebyte_char (since 3.5.10)char_character (since 3.5.10)char_longlong_shortshort_intint_integerint_doubledouble_floatfloat_booleanbooleanstringStringbyteBytechar (since 3.5.10)Charactercharacter (since 3.5.10)CharacterlongLongshortShortintIntegerintegerIntegerdoubleDoublefloatFloatbooleanBooleandateDatedecimalBigDecimalbigdecimalBigDecimalbigintegerBigIntegerobjectObjectdate[]Date[]decimal[]BigDecimal[]bigdecimal[]BigDecimal[]biginteger[]BigInteger[]object[]Object[]mapMaphashmapHashMaplistListarraylistArrayListcollectionCollectioniteratorIterator
设置settings
这是 MyBatis 中极为重要的调整设置它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。部分重要设置官网有完整版
设置名描述有效值默认值cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。truefalselazyLoadingEnabled延迟加载的全局开关。当开启时所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。truefalsemapUnderscoreToCamelCase是否开启驼峰命名自动映射即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。truefalselogImpl指定 MyBatis 所用日志的具体实现未指定时将自动查找。SLF4JLOG4J3.5.9 起废弃
一个配置完整的 settings 元素的示例如下
settingssetting namecacheEnabled valuetrue/setting namelazyLoadingEnabled valuetrue/setting nameaggressiveLazyLoading valuetrue/setting namemultipleResultSetsEnabled valuetrue/setting nameuseColumnLabel valuetrue/setting nameuseGeneratedKeys valuefalse/setting nameautoMappingBehavior valuePARTIAL/setting nameautoMappingUnknownColumnBehavior valueWARNING/setting namedefaultExecutorType valueSIMPLE/setting namedefaultStatementTimeout value25/setting namedefaultFetchSize value100/setting namesafeRowBoundsEnabled valuefalse/setting namesafeResultHandlerEnabled valuetrue/setting namemapUnderscoreToCamelCase valuefalse/setting namelocalCacheScope valueSESSION/setting namejdbcTypeForNull valueOTHER/setting namelazyLoadTriggerMethods valueequals,clone,hashCode,toString/setting namedefaultScriptingLanguage valueorg.apache.ibatis.scripting.xmltags.XMLLanguageDriver/setting namedefaultEnumTypeHandler valueorg.apache.ibatis.type.EnumTypeHandler/setting namecallSettersOnNulls valuefalse/setting namereturnInstanceForEmptyRow valuefalse/setting namelogPrefix valueexampleLogPreFix_/setting namelogImpl valueSLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING/setting nameproxyFactory valueCGLIB | JAVASSIST/setting namevfsImpl valueorg.mybatis.example.YourselfVfsImpl/setting nameuseActualParamName valuetrue/setting nameconfigurationFactory valueorg.mybatis.example.ConfigurationFactory/
/settings其它配置
typeHandlers类型处理器objectFactory对象工厂plugins插件 mybatis-generator-coremybatis-plus通用mapper
映射器mappers MapperRegistry注册绑定我们的Mapper文件每写一个dao接口就要写一个Mapper文件 映射器 : 定义映射SQL语句文件 既然 MyBatis 的行为其他元素已经配置完了我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。Java 在自动查找这方面没有提供一个很好的方法所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用 或完全限定资源定位符包括 file:/// 的 URL或类名和包名等。映射器是MyBatis中最核心的组件之一在MyBatis 3之前只支持xml映射器即所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始还支持接口映射器这种映射器方式允许以Java代码的方式注解定义SQL语句非常简洁。 1张表——1个Entity类——1个EntityDao/EntityMapper接口——1个Mapper.xml——核心配置文件中的1个 Dao/Maapper接口中的1个方法——Mapper.xml中的1个sql语句
方式1使用resource属性
使用相对于类路径的资源引用推荐
!-- 每一个Mapper.xml都需要在MyBatis核心配置文件中注册--
mappersmapper resourcecom/kuang/dao/UserDaoMapper.xml/
/mappers方式2使用class属性
使用映射器接口实现类的完全限定类名需要配置文件名称和接口名称一致并且位于同一目录下
mappers!--mapper classcom.kuang.dao.UserDaoMapper/--!--报错--mapper classcom.kuang.dao.UserMapper/
/mappers
注意点 接口和它的Mapper配置文件必须同名 接口和它的Mapper配置文件必须在同一个包下
方式3package元素
将包内的映射器接口实现全部注册为映射器但是需要配置文件名称和接口名称一致并且位于同一目录下
mapperspackage namecom.kuang.dao/
/mappers注意点同方法二
方式4url属性(不常用)
!-- 使用完全限定资源定位符URL --
mappersmapper urlfile:///var/mappers/AuthorMapper.xml/mapper urlfile:///var/mappers/BlogMapper.xml/mapper urlfile:///var/mappers/PostMapper.xml/
/mappers5、生命周期
不同作用域和生命周期类别是至关重要的因为错误的使用会导致非常严重的并发问题。 SqlSessionFactoryBuilder 作用创建 SqlSessionFactory 一旦创建了 SqlSessionFactory就不再需要它了。 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域也就是局部方法变量。 SqlSessionFactory 可以理解为数据库连接池SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在没有任何理由丢弃它或重新创建另一个实例。一般的应用中我们往往希望 SqlSessionFactory 作为一个单例让它在应用中被共享。SqlSessionFactory 的最佳作用域是应用作用域(Application Scope)。最简单的就是使用单例模式或者静态单例模式 SqlSession相当于从连接池中获取一个连接 连接到连接池的一个请求相当于一个数据库连接Connnection对象 SqlSession 的实例不是线程安全的因此是不能被共享的它的最佳的作用域是请求或方法作用域 用完之后需要赶紧关闭否则资源被占用。用 try…catch…finally… 语句来保证其正确关闭。 可以在一个事务里面执行多条 SQL然后通过它的 commit、rollback 等方法提交或者回滚事务。 一个 SqlSession 可以多次使用它的 getMapper 方法获取多个 mapper 接口实例 打个比方 SqlSessionFactoryBuilder 是造车公司 造了 100 台车然后卖给租车公司SQLSessionFactory然后倒闭 SQLSession 用户 租车使用车 mapper 用户的使用用户租到车之后可以开去这开去那任凭使用 用户SQLSession 执行完想做的事之后必须归还 “汽车” 给租车公司SQLSessionFactory 这里面的每一个 mapper 就代表一个具体的业务。