点击关注公众号,实用技术文章随时了解 1.Mybatis介绍 MyBatis是一个ORM工具,封装了JDBC操作,简化了业务编程; Mybatis在Web项目中与spring集成,为业务提供读写数据库的能力。 2。使用步骤 1.引入依赖 使用Maven包依赖管理,mybatis-3.5.5版本;还需要数据库连接驱动 <依赖> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <版本>3.5.5版本>依赖><依赖> <groupId>MySQLgroupId> <artifactId>mysql-connector-javaartifactId> <版本>5.1.49版本>依赖项> 2。配置文件 配置文件配置数据库连接源和映射文件。 配置 PUBLIC "-//www.sychzs.cn//DTD Config 3.0//EN" "http:// www.sychzs.cn/dtd/mybatis-3-config.dtd"> <配置> <环境 默认= “开发”> <环境 id=“开发”> <transactionManager 类型="JDBC" /> <数据源 类型=“POOLED”> <属性 名称=“驱动程序” 值= “com.mysql.jdbc.驱动程序” /> <属性 名称="url" 值 ="jdbc:mysql://localhost/user"/ > <属性 名称=“用户名” 值=“根” /> <属性 名称=“密码” 值 ="123456"/> 数据源> 环境> 环境 > <映射器 ? /> 映射器> 配置>3.接口定义 定义实体 package com.xiongxin.mybatis.entity; public class 用户 { private 字符串用户名; private 字符串密码; ...getter&&setter} 接口定义 package com.xiongxin.mybatis.mapper;importcom.xiongxin.mybatis.entity.User;importjava.util.列表;公开 接口 UserMapper { 列表 queryUser();} 定义映射文件mapper PUBLIC "-//www.sychzs.cn//DTD Mapper 3.0 //CN" "http:// www.sychzs.cn/dtd/mybatis-3-mapper.dtd"> <mapper 命名空间= "com.xiongxin.mybatis.mapper.UserMapper" > <选择 id="queryUser" resultType="com.xiongxin. mybatis.entity.User"> 从 tbl_user 选择> 映射器> 4.加载加载包 com.xiongxin.mybatis; 导入 com.alibaba.fastjson.JSON;导入 com.xiongxin.mybatis.entity.User;导入 com.xiongxin.mybatis.mapper.UserMapper;导入 www.sychzs.cn.资源;导入 org.apache.ibati s.session.SqlSession;导入 org.apache.ibatis.session.SqlSessionFactory;导入 org.apache.ibatis.session.SqlSessionFactoryBuilder; 导入java.io.IOException;导入java.io.Reader;导入java.util.List;公共 类TestMain{ 公共 静态 void main(String[] args) 抛出 IOException { 字符串资源= “mybatis-config.xml”; //加载mybatis的配置文件(它也加载关联的映射文件) Reader reader = Resources.getResourceAsReader(resource); //构建sqlSession的工厂 SqlSsessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //在可执行映射文件中创建sql sqlSession SqlSession session = sessionF actory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List users = userMapper.queryUser( ); System.out.println(JSON .toJSONString(users)); } }---------------------------- ----..控制台打印..[{"密码":"密码", “用户名”:“雄心”}]到这里Mybatis的使用就结束了。 整个实现过程中,我们并没有编写Mapper的实现类。在没有实现类的场景下,框架如何实现接口方法返回呢? 这里就不得不说一下接口的动态代理方法了。 3。原理分析 在SqlSession接口的实现中,获取Mapper的代理实现类 使用JDK动态代理的功能 代理类执行方法调用 MethodInvoker 在方法调用期间执行 最后执行execute方法。 获取返回结果Result 4。手撕框 必备知识: 源码:<依赖项> <依赖项> <groupId>com.alibabagroupId> < artifactId>fastjsonartifactId> <版本> 1.2.74版本> 依赖> <依赖> <groupId>com.h2databasegroupId> <artifactId> h2artifactId> <版本>1.4.199 版本> 依赖>依赖项>package com.dbutil.session; 导入 java.lang.annotation.Retention;导入 www.sychzs.cn;导入 java.lang.reflect.*;导入java.sql.Connection;导入java.sql.DriverManager;导入 java.sql.ResultSet; 导入java.sql.Statement;导入java.util.ArrayList;导入java.util.List; 进口 static java.lang.annotation.ElementType.*;导入 staticwww.sychzs.cn时间; /*** @authorxiongxin*/公共 班级 SqlSession { 公共 静态 连接getConnH2() 抛出 异常{ 字符串 url = "jdbc:h2 :mem:db_h2;MODE=MYSQL;INIT=RUNSCRIPT FROM './src/main/resources/schema.sql'"; 字符串 user = "root" ;斯特里ng密码=“123456”;//1.加载驱动程序 Class.forName("org.h2.Driver"); //2.获取数据库链接 Connection conn = DriverManager.getConnection(url, user, password); conn; } /** @Target({类型、字段、方法}) @Retention(运行时) public @interface 查询列表 { 公共字符串值( ); } /** * @param映射器接口 static T getMapper(类(T)Proxy.newProxy实例(mapperInterface.getClassLoader(),新类[]{mapperInterface},新 MapperIncationHandler()); } /** * 代理类方法 */ 公共 静态 类 MapperIncationHandler 实现 IncationHandler { @Override public 对象调用(对象代理,方法方法,对象[]参数)抛出Th rowable { String sql = method.getAnnotation(QueryList .类).值(); Class> returnType = method.getReturnType(); //返回类型为List if(returnType == List.class){ Type genericReturnType = method.getGenericReturnType(); 字符串typeName = genericReturnType.getTypeName(); 字符串替换= typeName.replace("java.util.List<", "").替换("> “,”" ); forName (替换); forName); ; 设置转换 公共 接口 ResultMap<T> { T 转换(ResultSet结果集) 抛出异常; } /** @param sql * @param resultMap * @param <@throws异常 静态列表 queryList(字符串sql,Res ultMap resultMap) 抛出异常 { ?语句 st = conn.createStatement (); ResultSet rs = st.executeQuery(sql); ArrayList<>(); //4.处理 从数据库返回结果(使用 ResultSet 类) while (www.sychzs.cn()) { ” T Convert = resultMap.convert(rs ); 列表.add (转变); } 关 // 关闭资源 RS.Close(); st.close (); conn.close(); 旋转 列表; } /** * * @param returnType * 公共 静态 List queryList(字符串sql,类返回类型)投掷 异常 { List list = SqlSession.queryList(sql, rs -> { T obj = www.sychzs.cn Instance(); Field[] declaredFields = returnType.getDeclaredFields() ; for(字段声明字段:声明字段){ 类 type = declaredField.getType(); //类型为String时的处理方法 if(类型 == 字符串.类) { String value = rs.getString(declaredField.getName()); String fieldName = declaredField.getName(); 方法 方法 = returnType.getDeclaredMethod( "设置".concat(fieldName.substring(0, 1).toUpperCase(). concat(fieldName.substring(1))), String.类); method.invoke(obj, value); }if(类型== 长.类){ 长值 = rs.getLong(declaredField.getName()); 字符串 fieldName = declaredField.getName(); 方法方法= returnType.getDeclaredMethod( "设置".concat(fieldName.substring(0, 1).toUpperCase().concat (fieldName.substring(1))), 长.类) ; method.invoke(obj, value); } //其他类型处理方法 } 返回 obj; }); 返回 列表; }}schema.sql文件掉落 桌子 如果 存在 用户;创建表 用户( id int(11) NOT NULLAUTO_INCRMENT, 用户名varchar(255) 默认 NULL, 密码 varchar(255)默认 NULL, 主KEY(id)); 插入 进入 用户(id,用户名,密码 ) 值(1,‘熊希娜’ ,'123456');插入 到 用户(id,用户名,密码) 值(2,'xiongxinb','12345 6');插入 到 用户(id,用户名,密码) 值(3,'xiongxinc', '123456'); 映射器定义package com.dbutil.mapper; 导入 com.dbutil.entity.UserEntity;导入 com.dbutil.session.SqlSession; 导入 java.util.List; 公共 接口 UserMapper { @ SqlSession.QueryList("从用户中选择*") List queryUser();} 使用:package com.dbutil; 导入 com.dbutil.entity.UserEntity;导入 com.dbutil.mapper.UserMapper;导入 com.dbutil.session.SqlSession; 导入 java.util.List; public 类 UserService { 公共 静态 void main(String[] args) 抛出 异常{ UserMapper userMapper = SqlSession.getMapper(UserMapper.class ); List userEntities = userMapper.queryUser(); for (UserEntity userEntity : userEntities) { System.out.println(userEntity); } }} 来源:www.sychzs.cn/tsxiong123/article/ 详情/119057825 推荐 java面试题宝典 技术内卷群,一起来学习!! PS:因为公众号平台更改了推送规则,如果不想错过内容,看完后记得点击“在看”,并添加一个” star”,这样每次推送新文章都会立即出现在你的订阅列表中。 点击“观看”支持我们!
MyBatis是一个ORM工具,封装了JDBC操作,简化了业务编程;
Mybatis在Web项目中与spring集成,为业务提供读写数据库的能力。
使用Maven包依赖管理,mybatis-3.5.5版本;还需要数据库连接驱动
<依赖> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <版本>3.5.5版本>依赖><依赖> <groupId>MySQLgroupId> <artifactId>mysql-connector-javaartifactId> <版本>5.1.49版本>依赖项>
配置文件配置数据库连接源和映射文件。
配置 PUBLIC "-//www.sychzs.cn//DTD Config 3.0//EN" "http:// www.sychzs.cn/dtd/mybatis-3-config.dtd"> <配置> <环境 默认= “开发”> <环境 id=“开发”> <transactionManager 类型="JDBC" /> <数据源 类型=“POOLED”> <属性 名称=“驱动程序” 值= “com.mysql.jdbc.驱动程序” /> <属性 名称="url" 值 ="jdbc:mysql://localhost/user"/ > <属性 名称=“用户名” 值=“根” /> <属性 名称=“密码” 值 ="123456"/> 数据源> 环境> 环境 > <映射器 ? /> 映射器> 配置>
定义实体
package com.xiongxin.mybatis.entity; public class 用户 { private 字符串用户名; private 字符串密码; ...getter&&setter}
接口定义
package com.xiongxin.mybatis.mapper;importcom.xiongxin.mybatis.entity.User;importjava.util.列表;公开 接口 UserMapper { 列表 queryUser();}
定义映射文件
mapper PUBLIC "-//www.sychzs.cn//DTD Mapper 3.0 //CN" "http:// www.sychzs.cn/dtd/mybatis-3-mapper.dtd"> <mapper 命名空间= "com.xiongxin.mybatis.mapper.UserMapper" > <选择 id="queryUser" resultType="com.xiongxin. mybatis.entity.User"> 从 tbl_user 选择> 映射器>
包 com.xiongxin.mybatis; 导入 com.alibaba.fastjson.JSON;导入 com.xiongxin.mybatis.entity.User;导入 com.xiongxin.mybatis.mapper.UserMapper;导入 www.sychzs.cn.资源;导入 org.apache.ibati s.session.SqlSession;导入 org.apache.ibatis.session.SqlSessionFactory;导入 org.apache.ibatis.session.SqlSessionFactoryBuilder; 导入java.io.IOException;导入java.io.Reader;导入java.util.List;公共 类TestMain{ 公共 静态 void main(String[] args) 抛出 IOException { 字符串资源= “mybatis-config.xml”; //加载mybatis的配置文件(它也加载关联的映射文件) Reader reader = Resources.getResourceAsReader(resource); //构建sqlSession的工厂 SqlSsessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //在可执行映射文件中创建sql sqlSession SqlSession session = sessionF actory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List users = userMapper.queryUser( ); System.out.println(JSON .toJSONString(users)); } }---------------------------- ----..控制台打印..[{"密码":"密码", “用户名”:“雄心”}]
到这里Mybatis的使用就结束了。
整个实现过程中,我们并没有编写Mapper的实现类。在没有实现类的场景下,框架如何实现接口方法返回呢?
这里就不得不说一下接口的动态代理方法了。
在SqlSession接口的实现中,获取Mapper的代理实现类
使用JDK动态代理的功能
代理类执行方法调用
MethodInvoker 在方法调用期间执行
最后执行execute方法。
获取返回结果Result
必备知识:
源码:
<依赖项> <依赖项> <groupId>com.alibabagroupId> < artifactId>fastjsonartifactId> <版本> 1.2.74版本> 依赖> <依赖> <groupId>com.h2databasegroupId> <artifactId> h2artifactId> <版本>1.4.199 版本> 依赖>依赖项>
package com.dbutil.session; 导入 java.lang.annotation.Retention;导入 www.sychzs.cn;导入 java.lang.reflect.*;导入java.sql.Connection;导入java.sql.DriverManager;导入 java.sql.ResultSet; 导入java.sql.Statement;导入java.util.ArrayList;导入java.util.List; 进口 static java.lang.annotation.ElementType.*;导入 staticwww.sychzs.cn时间; /*** @authorxiongxin*/公共 班级 SqlSession { 公共 静态 连接getConnH2() 抛出 异常{ 字符串 url = "jdbc:h2 :mem:db_h2;MODE=MYSQL;INIT=RUNSCRIPT FROM './src/main/resources/schema.sql'"; 字符串 user = "root" ;斯特里ng密码=“123456”;//1.加载驱动程序 Class.forName("org.h2.Driver"); //2.获取数据库链接 Connection conn = DriverManager.getConnection(url, user, password); conn; } /** @Target({类型、字段、方法}) @Retention(运行时) public @interface 查询列表 { 公共字符串值( ); } /** * @param映射器接口 static T getMapper(类(T)Proxy.newProxy实例(mapperInterface.getClassLoader(),新类[]{mapperInterface},新 MapperIncationHandler()); } /** * 代理类方法 */ 公共 静态 类 MapperIncationHandler 实现 IncationHandler { @Override public 对象调用(对象代理,方法方法,对象[]参数)抛出Th rowable { String sql = method.getAnnotation(QueryList .类).值(); Class> returnType = method.getReturnType(); //返回类型为List if(returnType == List.class){ Type genericReturnType = method.getGenericReturnType(); 字符串typeName = genericReturnType.getTypeName(); 字符串替换= typeName.replace("java.util.List<", "").替换("> “,”" ); forName (替换); forName); ; 设置转换 公共 接口 ResultMap<T> { T 转换(ResultSet结果集) 抛出异常; } /** @param sql * @param resultMap * @param <@throws异常 静态列表 queryList(字符串sql,Res ultMap resultMap) 抛出异常 { ?语句 st = conn.createStatement (); ResultSet rs = st.executeQuery(sql); ArrayList<>(); //4.处理 从数据库返回结果(使用 ResultSet 类) while (www.sychzs.cn()) { ” T Convert = resultMap.convert(rs ); 列表.add (转变); } 关 // 关闭资源 RS.Close(); st.close (); conn.close(); 旋转 列表; } /** * * @param returnType * 公共 静态 List queryList(字符串sql,类返回类型)投掷 异常 { List list = SqlSession.queryList(sql, rs -> { T obj = www.sychzs.cn Instance(); Field[] declaredFields = returnType.getDeclaredFields() ; for(字段声明字段:声明字段){ 类 type = declaredField.getType(); //类型为String时的处理方法 if(类型 == 字符串.类) { String value = rs.getString(declaredField.getName()); String fieldName = declaredField.getName(); 方法 方法 = returnType.getDeclaredMethod( "设置".concat(fieldName.substring(0, 1).toUpperCase(). concat(fieldName.substring(1))), String.类); method.invoke(obj, value); }if(类型== 长.类){ 长值 = rs.getLong(declaredField.getName()); 字符串 fieldName = declaredField.getName(); 方法方法= returnType.getDeclaredMethod( "设置".concat(fieldName.substring(0, 1).toUpperCase().concat (fieldName.substring(1))), 长.类) ; method.invoke(obj, value); } //其他类型处理方法 } 返回 obj; }); 返回 列表; }}
schema.sql文件
掉落 桌子 如果 存在 用户;创建表 用户( id int(11) NOT NULLAUTO_INCRMENT, 用户名varchar(255) 默认 NULL, 密码 varchar(255)默认 NULL, 主KEY(id)); 插入 进入 用户(id,用户名,密码 ) 值(1,‘熊希娜’ ,'123456');插入 到 用户(id,用户名,密码) 值(2,'xiongxinb','12345 6');插入 到 用户(id,用户名,密码) 值(3,'xiongxinc', '123456');
映射器定义
package com.dbutil.mapper; 导入 com.dbutil.entity.UserEntity;导入 com.dbutil.session.SqlSession; 导入 java.util.List; 公共 接口 UserMapper { @ SqlSession.QueryList("从用户中选择*") List queryUser();}
使用:
package com.dbutil; 导入 com.dbutil.entity.UserEntity;导入 com.dbutil.mapper.UserMapper;导入 com.dbutil.session.SqlSession; 导入 java.util.List; public 类 UserService { 公共 静态 void main(String[] args) 抛出 异常{ UserMapper userMapper = SqlSession.getMapper(UserMapper.class ); List userEntities = userMapper.queryUser(); for (UserEntity userEntity : userEntities) { System.out.println(userEntity); } }}
来源:www.sychzs.cn/tsxiong123/article/
详情/119057825
推荐
java面试题宝典
技术内卷群,一起来学习!!
PS:因为公众号平台更改了推送规则,如果不想错过内容,看完后记得点击“在看”,并添加一个” star”,这样每次推送新文章都会立即出现在你的订阅列表中。 点击“观看”支持我们!