信息管理系统网站开发教程,怎么注册阿里巴巴店铺,合肥企业快速建站,北京建设教育协会网站Mybatis
学习Mybatis就要学会查看官网#xff0c;官网地址如下#xff1a;MyBatis中文网
1、简介
1.1什么是Mybatis
MyBatis 是一款优秀的持久层框架#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取…Mybatis
学习Mybatis就要学会查看官网官网地址如下MyBatis中文网
1、简介
1.1什么是Mybatis
MyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOPlain Old Java Objects普通老式 Java 对象为数据库中的记录。
1.2如何获得Mybatis 通过Maven仓库直接获取 dependenciesdependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.2/version/dependency
/dependenciesgithub上获取 中文文档
1.3持久化
数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程内存断电即失数据持久化的两种方式数据库jdbcio文件持久化
为什么需要持久化 因为内存断电即失有一些对象我们不能让他丢掉需要持久化将他存储起来。 内存太贵了
1.4持久层
三层结构Dao层Service层Controller层
持久层是完成持久化工作的代码块层界限十分明显
1.5为什么需要Mybatis 帮助程序员将数据存入到数据库中 传统的JDBC代码太复杂了为了把它简化形成一个框架实现自动化。 不用Mybatis也可以只是用了Mybatis框架可以更容易上手 优点 sql和代码的分离提高可维护性提供映射标签支持对象与数据库的orm字段关系映射提供对象关系映射标签支持对象关系组建维护提供xml标签支持编写动态sql
2、第一个Mybatis程序
思路搭建环境–导入Mybatis–编写代码–测试
2.1搭建环境
搭建数据库
create database Mybatis;
use Mybatis;update table user(
id int(20) not null primary key,
name varchar(30) default null,
password int(20) default null
)ENGINEINNODB DEFAULT CHARSETUTF8;
alter table user modify column password varchar(20);
insert into user values
(1,狂神,123456),
(2,狂神,123456),
(3,狂神,123456)#####2.2搭建项目
1、新建一个普通的maven项目
2、导入依赖
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdMybatis/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packagingnameMybatis/nameurlhttp://maven.apache.org/urlpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--JUNIT驱动--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/versionscopetest/scope/dependency!--Mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.37/version/dependency!--Mybatis驱动--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.2/version/dependency/dependencies
/project2.3创建模块
编写mybatis的核心配置文件编写mybatis的工具类
package com.kuang.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;//SqlSessionFactory 工厂模式 用来构建SqlSession的
public class MybatisUtil {private static SqlSessionFactory sqlSessionFactory;//静态代码块,按照官方文档填写static{//第一步获取SqlSessionFactory对象try {//获取配置资源String resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}
}
//通过sqlSessionFactory获取SqlSession对象public static SqlSession getSession(){return sqlSessionFactory.openSession();}
}2.4编写代码 实体类 根据数据库中的数据元素编写类的属性。 package com.kuang.pojo;public class User {private int id;private String name;private String pwd;Overridepublic String toString() {return User{ id id , name name \ , pwd pwd \ };}public User(int id, String name, String pwd) {this.id id;this.name name;this.pwd pwd;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd pwd;}
}Dao接口 Dao接口定义了sql语句的实现方法 package com.kuang.dao;import com.kuang.pojo.User;import java.util.List;public interface UserDao {ListUser getUserList();
}接口实现类 在Mapper配置文件中直接配置对应接口信息查询的数据库返回结果的类型等等侧面实现接口方法不用重复编写代码 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
!--名字对应所要实现的接口--
mapper namespacecom.kuang.dao.UserDao!--id对应所要实现的接口方法resultType对象所要返回的数据类型--select idgetUserList resultTypecom.kuang.pojo.Userselect * from mybatis.user/select
/mapper#####2.5测试
报错提示org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.
这是因为pom.xml文件中maven没有配置我们定义的Dao层文件。 ####3、CRUD
id就是对应的namespace中的方法名resultTypeSql语句执行的返回值parameterType参数的类型
步骤
1、编写接口2、配置xml文件实现接口编写对应sq语句3、测试增删改要注意提交事务
3.1接口文件
package com.kuang.dao;
import com.kuang.pojo.User;
import java.util.List;
public interface UserMapper {//查询全部用户ListUser getUserList();//根据ID查询用户User getUserById(int id);//新增用户Integer addUser(User user);//修改用户Integer updateUser(User user);//删除用户void deleteUser(int id);}3.2实现接口
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
!--名字对应所要实现的接口--
mapper namespacecom.kuang.dao.UserMapper!--id对应所要实现的接口方法resultType对象所要返回的数据类型--select idgetUserList resultTypecom.kuang.pojo.Userselect * from mybatis.user/selectselect id getUserById resultTypecom.kuang.pojo.User parameterTypeint
select * from mybatis.user where id #{id}/selectselect idaddUser parameterTypecom.kuang.pojo.User resultTypejava.lang.Integer
insert into user (id,name,password) values (#{id},#{name},#{password});/selectupdate idupdateUser parameterTypecom.kuang.pojo.User
update user set name #{name},password #{password} where id #{id}/updatedelete iddeleteUser parameterTypeintdelete from user where id #{id}/delete
/mapper3.3测试类
package com.kuang.dao;import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.testng.annotations.Test;import java.util.List;public class UserDaoTest {Testpublic void test(){//第一步获得 SqlSession对象SqlSession sqlSessionMybatisUtil.getSession();//执行sqlUserMapper userDaosqlSession.getMapper(UserMapper.class);ListUser userList userDao.getUserList();for(User user : userList){System.out.println(user);}sqlSession.close();}Testpublic void getUserById(){SqlSession sqlSession MybatisUtil.getSession();UserMapper userMapper sqlSession.getMapper(UserMapper.class);User user userMapper.getUserById(1);System.out.println(user);sqlSession.close();}//增删改需要提交事务Testpublic void addUser(){SqlSession sqlSession MybatisUtil.getSession();UserMapper userMapper sqlSession.getMapper(UserMapper.class);Integer resuserMapper.addUser(new User(4,哈哈,123456));if(resnull)System.out.println(insert ok);else System.out.println(insert failed);//提交事务sqlSession.commit();sqlSession.close();}Testpublic void updateUser() {SqlSession sqlSession MybatisUtil.getSession();UserMapper userMapper sqlSession.getMapper(UserMapper.class);Integer res userMapper.updateUser(new User(4, 哈哈, 12345));sqlSession.commit();sqlSession.close();}Testpublic void deleteUser(){SqlSession sqlSession MybatisUtil.getSession();UserMapper userMapper sqlSession.getMapper(UserMapper.class);userMapper.deleteUser(2);sqlSession.commit();sqlSession.close();}
}3.4万能的Map写项目较好
假设实体类或者数据库中的表字段或者参数过多我们应当考虑使用map
在接口方法中参数直接传递Map
User selectUserByNP2(MapString,Object map);编写sql语句的时候需要传递参数类型参数类型为map
select idselectUserByNP2 parameterTypemap resultTypecom.kuang.pojo.Userselect * from user where name #{username} and pwd #{pwd}
/select在使用方法的时候Map的 key 为 sql中取的值即可没有顺序要求
MapString, Object map new HashMapString, Object();
map.put(username,小明);
map.put(pwd,123456);
User user mapper.selectUserByNP2(map);4、配置解析
4.1核心配置文件
mybatis-config.xmlMybatis的配置文件包含了会深深影响Mybatis行为的设置和属性信息
configuration配置
properties属性
settings设置
typeAliases类型别名
typeHandlers类型处理器
objectFactory对象工厂
plugins插件
environments环境配置
environment环境变量
transactionManager事务管理器
dataSource数据源
databaseIdProvider数据库厂商标识
mappers映射器4.2环境配置environment
environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBCproperty name... value...//transactionManagerdataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment
/environments配置MyBatis的多套运行环境将SQL映射到多个不同的数据库上必须指定其中一个为默认运行环境通过default指定
4.3Properties优化
数据库这些属性都是可外部配置且可动态替换的既可以在典型的 Java 属性文件中配置亦可通过 properties 元素的子元素来传递 。
第一步 在资源目录下新建一个db.properties
drivercom.mysql.jdbc.Driver
urljdbc:mysql://localhost:3306/mybatis?useSSLtrueuseUnicodetruecharacterEncodingutf8
usernameroot
password123456第二步 : 将文件导入properties 配置文件
configuration!--导入properties文件--properties resourcedb.properties/environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment/environmentsmappersmapper resourcemapper/UserMapper.xml//mappers
/configuration可以直接引入外部文件可以在其中增加一些属性配置如果两个文件有同一个字段优先使用外部配置文件
4.4类型别名typeAliases
类型别名是为Java类型设置一个短的名字存在的意义仅在于用来减少类完全限定名的冗余
!--配置别名,注意顺序--
typeAliasestypeAlias typecom.kuang.pojo.User aliasUser/
/typeAliases也可以指定一个包名Mybatis会在包名下面搜索需要的java Bean比如扫描实体类的包意思就是当包名为User时我们可以使用包的小写别名“user”。
也可以在实体上增加注解来添加类的别名
Alias(user)
public class User{}4.5设置
设置查看官方文档 懒加载 日志实现 缓存开启关闭 一个配置完整的settings元素的实例如下 settingssetting namecacheEnabled valuetrue/setting namelazyLoadingEnabled 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 namemapUnderscoreToCamelCase valuefalse/setting namelocalCacheScope valueSESSION/setting namejdbcTypeForNull valueOTHER/setting namelazyLoadTriggerMethods valueequals,clone,hashCode,toString/
/settings4.6映射器mappers
MapperRegistry注册绑定我们的mapper文件
方式一文件定位
mappersmapperresourcecoom/kuang/dao/UserMapper.xml/
/mappers方式二使用class文件绑定注册
mappersmapper classcom.kuang.dao.UserMapper/
/mappers注意点
接口和他的Mapper配置文件必须同名接口和他的Mapper配置文件必须在同一个包下
方式三使用扫描包进入诸如绑定
mapperspackage namecom.kuang.dao/
/mappers4.7作用域和生命周期
生命周期和作用域时非常重要的。
“lazyLoadTriggerMethods” value“equals,clone,hashCode,toString”/ ##### 4.6映射器mappersMapperRegistry注册绑定我们的mapper文件方式一文件定位xml
mappersmapperresourcecoom/kuang/dao/UserMapper.xml/
/mappers方式二使用class文件绑定注册
mappersmapper classcom.kuang.dao.UserMapper/
/mappers注意点
接口和他的Mapper配置文件必须同名接口和他的Mapper配置文件必须在同一个包下
方式三使用扫描包进入诸如绑定
mapperspackage namecom.kuang.dao/
/mappers4.7作用域和生命周期
生命周期和作用域时非常重要的。 sqlSessionFactoryBuilder 一旦创建了sqlSessionFactory就不需要了局部变量 sqlSessionFactory 可以理解为数据库连接池一旦被创建就应该在应用的运行期间一直存在没有任何理由丢弃它或重新创建另一个实例最佳作用域是应用作用域最简单的是使用单例模式或者静态单例模式 sqlSession 连接到连接池的一个请求SqlSession的实例不是线程安全的因此是不能被共享的最佳作用域是调用作用域或者方法作用域用完之后需要赶紧关闭
5、ResultMap
解决属性名和字段名不一致的问题
数据库中的字段和定义类中的字段不一样
解决办法 起别名 select idselectUserById resultTypeUserselect id , name , pwd as password from user where id #{id}
/selectresultMap结果集映射 resultMap idUserMap typeUser!-- id为主键 --id columnid propertyid/!-- column是数据库表的列名 , property是对应实体类的属性名 --result columnname propertyname/result columnpwd propertypassword/
/resultMap
select idselectUserById resultMapUserMapselect id , name , pwd from user where id #{id}
/select6、日志
6.1日志工厂
如果一个数据库操作出现了异常我们需要排错。
SLF4JApache Commons LoggingLog4j 2Log4jJDK logging
在Mybatis中具体使用哪一个日志实现在设置中配置
settingssetting namelogImpl valueSTDOUT_LOGGING/
/settings6.2Log4j
1.先导入Log4j的包
dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version
/dependency2.配置文件
#将等级为DEBUG的日志信息输出到console和file这两个目的地console和file的定义在下面的代码
log4j.rootLoggerDEBUG,console,file
#控制台输出的相关设置
log4j.appender.console org.apache.log4j.ConsoleAppender
log4j.appender.console.Target System.out
log4j.appender.console.ThresholdDEBUG
log4j.appender.console.layout org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern[%c]-%m%n
#文件输出的相关设置
log4j.appender.file org.apache.log4j.RollingFileAppender
log4j.appender.file.File./log/kuang.log
log4j.appender.file.MaxFileSize10mb
log4j.appender.file.ThresholdDEBUG
log4j.appender.file.layoutorg.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatisDEBUG
log4j.logger.java.sqlDEBUG
log4j.logger.java.sql.StatementDEBUG
log4j.logger.java.sql.ResultSetDEBUG
log4j.logger.java.sql.PreparedStatementDEBUGsetting设置日志实现
settingssetting namelogImpl valueLOG4J/
/settings测试类
//注意导包org.apache.log4j.Logger
static Logger logger Logger.getLogger(MyTest.class);
Test
public void selectUser() {logger.info(info进入selectUser方法);logger.debug(debug进入selectUser方法);logger.error(error: 进入selectUser方法);SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);ListUser users mapper.selectUser();for (User user: users){System.out.println(user);}session.close();
}
文章转载自: http://www.morning.xsjfk.cn.gov.cn.xsjfk.cn http://www.morning.kgrwh.cn.gov.cn.kgrwh.cn http://www.morning.pyzt.cn.gov.cn.pyzt.cn http://www.morning.rfhm.cn.gov.cn.rfhm.cn http://www.morning.pypbz.cn.gov.cn.pypbz.cn http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn http://www.morning.qhczg.cn.gov.cn.qhczg.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.xkzr.cn.gov.cn.xkzr.cn http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn http://www.morning.mgbcf.cn.gov.cn.mgbcf.cn http://www.morning.qftzk.cn.gov.cn.qftzk.cn http://www.morning.tsdqr.cn.gov.cn.tsdqr.cn http://www.morning.trqhd.cn.gov.cn.trqhd.cn http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn http://www.morning.ygwbg.cn.gov.cn.ygwbg.cn http://www.morning.qqbjt.cn.gov.cn.qqbjt.cn http://www.morning.hrkth.cn.gov.cn.hrkth.cn http://www.morning.yqpck.cn.gov.cn.yqpck.cn http://www.morning.gxklx.cn.gov.cn.gxklx.cn http://www.morning.swyr.cn.gov.cn.swyr.cn http://www.morning.fdlyh.cn.gov.cn.fdlyh.cn http://www.morning.zynjt.cn.gov.cn.zynjt.cn http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.kmkpm.cn.gov.cn.kmkpm.cn http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn http://www.morning.mplb.cn.gov.cn.mplb.cn http://www.morning.qpnmd.cn.gov.cn.qpnmd.cn http://www.morning.hwbf.cn.gov.cn.hwbf.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.yggwn.cn.gov.cn.yggwn.cn http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.xfwnk.cn.gov.cn.xfwnk.cn http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn http://www.morning.yesidu.com.gov.cn.yesidu.com http://www.morning.pbknh.cn.gov.cn.pbknh.cn http://www.morning.wxckm.cn.gov.cn.wxckm.cn http://www.morning.jxscp.cn.gov.cn.jxscp.cn http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn http://www.morning.jfjbl.cn.gov.cn.jfjbl.cn http://www.morning.yktwr.cn.gov.cn.yktwr.cn http://www.morning.kjjbz.cn.gov.cn.kjjbz.cn http://www.morning.monstercide.com.gov.cn.monstercide.com http://www.morning.bmsqq.cn.gov.cn.bmsqq.cn http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.lbzgt.cn.gov.cn.lbzgt.cn http://www.morning.fygbq.cn.gov.cn.fygbq.cn http://www.morning.xcxj.cn.gov.cn.xcxj.cn http://www.morning.mhnr.cn.gov.cn.mhnr.cn http://www.morning.chmcq.cn.gov.cn.chmcq.cn http://www.morning.nypsz.cn.gov.cn.nypsz.cn http://www.morning.bwhcl.cn.gov.cn.bwhcl.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.lffrh.cn.gov.cn.lffrh.cn http://www.morning.xjtnp.cn.gov.cn.xjtnp.cn http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.nlywq.cn.gov.cn.nlywq.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.llsrg.cn.gov.cn.llsrg.cn http://www.morning.lhwlp.cn.gov.cn.lhwlp.cn http://www.morning.mzgq.cn.gov.cn.mzgq.cn http://www.morning.sfdky.cn.gov.cn.sfdky.cn http://www.morning.gprzp.cn.gov.cn.gprzp.cn http://www.morning.mtrz.cn.gov.cn.mtrz.cn http://www.morning.qqpg.cn.gov.cn.qqpg.cn http://www.morning.fwkq.cn.gov.cn.fwkq.cn http://www.morning.qineryuyin.com.gov.cn.qineryuyin.com http://www.morning.ytbr.cn.gov.cn.ytbr.cn http://www.morning.dgxrz.cn.gov.cn.dgxrz.cn http://www.morning.mzydm.cn.gov.cn.mzydm.cn http://www.morning.fewhope.com.gov.cn.fewhope.com http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn http://www.morning.krdmn.cn.gov.cn.krdmn.cn http://www.morning.wfmqc.cn.gov.cn.wfmqc.cn http://www.morning.lgrkr.cn.gov.cn.lgrkr.cn http://www.morning.hqbk.cn.gov.cn.hqbk.cn http://www.morning.rbnp.cn.gov.cn.rbnp.cn http://www.morning.hgsylxs.com.gov.cn.hgsylxs.com http://www.morning.gjsjt.cn.gov.cn.gjsjt.cn