大佬教程收集整理的这篇文章主要介绍了学完MyBatis整理了一下,希望能帮助大家,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在中文字典中框架的意思是:比喻事物的整体结构。
这个框架就好像现在我们买房子的时候买的毛坯房c;省的以前自己整水泥c;砖头自己一步一步搭建房子了那么我们软件中的框架又有什么作用呢?
1.重用代码大大增加c;软件生产效率和质量也得到了提高。
2.代码结构的规范化c;降低程序员之间沟通以及日后维护的成本
3.软件设计人员要专注于对领域的了解c;使需求分析更充分;
4.允许采用快速原型技术; 有利于在一个项目内多人协同工作;
5.开发速度快c;成本降低c;开发人员少c;维护费用降低
我的理解是ORM框架就是把数据库和对象之间的一个映射关系,就是解决我们三层架构中的dao层。
还记得最初链接数据库么?1.加载数据驱动c;2.获取数据库链接c;3.通过数据库的连接操作数据库c;实现增删改查(使用Statement类)4.处理数据库的返回结果c;5.关闭链接
String URL="jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&characterEncoding=utf-8";
String USER="root";
String passworD="tiger";
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库链接
Connection conn=DriveRMANager.getConnection(URL, USER, passworD);
//3.通过数据库的连接操作数据库c;实现增删改查(使用Statement类)
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select * from user");
//4.处理数据库的返回结果(使用ResultSet类)
while(rs.next()){
System.out.println(rs.getString("user_name");
}
//关闭资源
rs.close();
st.close();
conn.close();
ORM框架有很多种c;这里我只介绍我学过的MyBatis
@H_509_5@myBatis 本是 Apache 的一个开源项目iBatis, 2010 年这个项目由 Apache Software Foundation 迁移到了 Google Codec;且改名为 MyBatis 。2013 年 11 月迁移到 GitHub。 MyBatis 是一款优秀的持久层框架c;它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使 用简单的 XML 或注解来配置和映射原生信息c;将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java 对象)映射成数据库中的记录。 简单的说:MyBatis 是一个半自动 ORM 框架c;其本质是对 JDBC 的封装。使用 MyBatis 重点需要程序员编写 SQL 命令c;不需要写一行 JDBC 代码。 与 Hibernate 的比较 6 Hibernate 是一个全自动的 ORM 框架。因为 Hibernate 创建了 Java 对象和数据库表 之间的完整映射c;可以完全以面向对象的思想来操作数据库c;程序员不需要手写 SQL 语句c; 而 MyBatis 中还需要手写 SQL 语句c;所以是半自动化的c;工作量要大于 Hibernate。 为什么半自动化的 Mybatis 比自动化的 Hibernate 受欢迎? MyBatis 需要手写 SQL 语句c;所以工作量要大于 Hibernate。但是也正是由于自定义 SQL 语句c;所以其灵活性、可优化性就超过了 Hibernateasm-7.1.jar | 字节码修改框架 |
javassist-3.27.0-GA.jar | 可用来检查、”动态”修改及创建 Java 类。功能与 JDK 自 带反射功能类似c;但比反射功能更强大 |
cglib-3.3.0.jar | 反射功能类似c;但比反射功能更强大 cglib-3.3.0.jar 实现动态代理的技术c;延迟加载时使用 |
ognl-3.2.14.jar | 对象导航图语言的缩写c;功能强大的表达式语言工具包。在 动态 SQL 和${param}中使用 |
还有一些其他日志包
SqlSessionFactoryBuilder对象 目的:通过构建着模式构建SqlSessionFactory接口对象
SqlSessionFactory对象 目的:一个数据库连接池c;它的作用是创建 SqlSession 接口对象
SqlSession对象 目的:SqlSession 就相当于一个数 据库连接(Connection 对象)c;你可以在一个事务里面执行多条 SQLc;然后通过它的 commit、rollBACk 方法提交或者回滚事务
@H_509_5@mapper对象 目的:由一个 Java 接口和 XML 文件(或者注解构成)c;需要给出对应的 SQL 和映 射规则c;负责发送 SQL 去执行并返回结果。全局配置文件名字一般自定义放在src目录下对 Mybatis 框架的设置、别名设置、 环境设置、指定映射配置文件等相关配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入properties文件-->
<properties resource="db.properties"/>
<!--配置别名-->
<typeAliases>
<typeAlias alias="users" type="com.whq.pojo.Users"></typeAlias>
<package name="com.whq.pojo"/>
</typeAliases>
<!--环境配置-->
<environments default="development">
<environment id="development">
<!--配置事务-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源-->
<datasource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.passworD}"/>
</datasource>
</environment>
<!--这里可以配置第二个数据源-->
<environment id="">
<transactionManager type=""></transactionManager>
<datasource type=""></datasource>
</environment>
</environments>
<!--引入映射配置文件-->
<mappers>
<!--相对路径引入-->
<mapper resource="com/whq/mapper/Usersmapper.xml"/>
<!--指定映射接口引入-->
<!-- <mapper class="com.whq.mapper.UserMapper"/>-->
<!--使用 filter:///协议指定映射配置文件-->
<!-- <mapper url="file:///D:codemybatissrccombjsxtmapperUserMapper.xml"/>-->
<!--包的方式引入-->
<!-- <package name="com.whq.mapper"/>-->
</mappers>
</configuration>
这里的配置数据源除了用propertiesc;也可以直接在全局配置文件中写死
除了可以配置以上的数据源c;别名c;引入映射配置文件外还可以配置
<setTings>
<setTing name="cacheEnabled" value="true"/> 该配置影响的所有映射器中配置的缓存的全局开关
<setTing name="lazyLoadingEnabled" value="true"/> 配置懒加载
<setTing name="multipleResultSetsEnabled" value="true"/>当启用时c;带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之c;每种属性将会按需加载
<setTing name="usecolumnLabel" value="true"/>是否允许单一语句返回多结果集(需要兼容驱动)。
<setTing name="useGeneratedKeys" value="false"/>使用列标签代替列名。不同的驱动在这方面会有不同的表现c;具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结
<setTing name="autoMappingBehavior" value="PARTIAL"/>
<setTing name="autoMappingUnknowncolumnBehavior"
value="WARNING"/>
<setTing name="defaultExecutorType" value="SIMPLE"/>
<setTing name="defaultStatementTimeout" value="25"/>
<setTing name="defaultFetchSize" value="100"/>
<setTing name="safeRowBoundsEnabled" value="false"/>
<setTing name="mapUnderscoreToCamelCase" value="false"/>
<setTing name="localCacheScope" value="SESSION"/>
<setTing name="jdbcTypeForNull" value="OTHER"/>
<setTing name="lazyLoadtriggerMethods"
value="equals,clone,hashCode,toString"/>
</setTings>
映射配置文件:主要是用来编写 sql 语句的c;结果集的映射关系的指定c;以及缓存的一些 配置等等
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.whq.mapper.UserMapper">
<!--查询所有-->
<SELEct id="selectUsersAll" resultType="com.whq.pojo.Users">
SELEct * from users
</SELEct>
<!--根据主键查询所有-->
<SELEct id="selectUsersById" resultType="com.whq.pojo.Users">
SELEct * from users
<where>
<if test="userid != null">
and userid = #{useriD}
</if>
</where>
</SELEct>
<!--insert添加用户 -->
<insert id="insertUsers" >
insert into users value (default ,#{usernamE} ,#{usersex})
</insert>
<!--update语句-->
<update id="updateUserById" parameterType="map">
update users set username=#{userNamE},usersex=#{userSex} where
userid =#{userID}
</update>
<!--还可以自己写个sql出来方便后期用-->
<sql id="selectUser">userid,username,usersex</sql>
<SELEct id="selectUsersById2" resultType="com.whq.pojo.Users">
SELEct <include refid="selectUser"/> from users where userid = #{aaa}
</SELEct>
<delete id="deleteUserById">
delete from users where userid = #{useriD}
</delete>
</mapper>
SELEct标签的属性 :
parameterType:指定参数类型。该属性是可选属性。因为 MyBatis 可以通过类型处理 器(TypeHandler)推断出具体传入语句的参数。
resultType:期望从这条语句中返回结果的类全名或别名。
resultMap:使用 resultMap 标签来处理结果集映射
insert标签的属性:
id:当前添加语句的唯一标识c;该属性的值不能重复。
parameterType:指定参数类型c;可以给定别名。该属性是可选属性。
update标签的属性:
id:当前更新语句的唯一标识c;该属性的值不能重复。
parameterType:指定参数类型c;可以给定别名。该属性是可选属性
delete 标签的属性:
id:当前删除语句的唯一标识c;该属性的值不能重复。
parameterType:指定参数类型c;可以给定别名。该属性是可选属性
先创建表:
create table `users` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`usersex` varchar(10) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果本地没有网可以添加mybatis的dtd约束文件
下 载 dtd : 在 浏 览 器 中 输 入 dtd 的 网 络 地 址 即 可 实 现 下 载 。 比 如 : http://mybatis.org/dtd/mybatis-3-config.dtd 将下载的 dtd 拷贝到本地的一个目录下 Idea 操作路径:File---SetTings---Languages & Frameworks 其中 URI 复制 dtd 的网络地址即可。File 选择 dtd 文件在本地的地址。OK!
根据数据库创建实体
public class Users {
privatE int userid;
private String username;
private String usresex;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
thiS.Userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String userName) {
this.username = username;
}
public String getUsresex() {
return usresex;
}
public void setUsresex(String usreseX) {
thiS.Usresex = usresex;
}
}
创建数据库链接配置文件propertiesc;方便日后修改
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bjsxt
jdbc.username=root
jdbc.password=root
创建全局配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入 properties 文件-->
<properties resource="db.properties"/>
<!--环境的配置-->
<environments default="development">
<environment id="development">
<!-- 配置事务-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源-->
<datasource type="POOLED">
24
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.passworD}"/>
</datasource>
</environment>
</environments>
<!--引入映射配置文件-->
<mappers>
<!-- 使用相对路径方式引入-->
<mapper resource="com/whq/mapper/Usersmapper.xml"/>
</mappers>
</configuration>
创建配置映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.whq.mapper.UserMapper">
<!--查询所有用户-->
<SELEct id="selectUsersAll" resultType="com.whq.pojo.Users">
SELEct * from users
</SELEct>
</mapper>
创建UsersDao接口和实现类
public interface UsersDao {
List<Users> SELEctUsersAll()throws IOException;
}
创建实现类
public class UsersDaoImpl implements UsersDao {
/**
* 查询所有用户
* @return
*/
@Override
public List<Users> SELEctUsersAll()throws IOException {
//创建 SqlSessionFactory 对象
InputStream inputStream =
resources.getresourceAsStream("mybatis-cfg.xml");
SqlSessionFactory sqlSessionFacotry = new
SqlSessionFactoryBuilder().build(inputStream);
//获取 SqlSession 对象
SqlSession sqlSession = sqlSessionFacotry.openSession();
//通过 SqlSession 对象下的 API 完成对数据库的操作
List<Users> list =
sqlSession.SELEctList("com.whq.mapper.UserMapper.SELEctUsersAll");
//关闭 SqlSession 对象
sqlSession.close();
return list;
}
}
写一个测试类
public class Test {
public static void main(String[] args)throws IOException {
UsersDao usersDao = new UsersDaoImpl();
List<Users> list = usersDao.SELEctUsersAll();
for(Users users:list){
System.out.println(users.getUserid()+"t"+users.getUsername()+"t"+users.getUsersex());}
}
}
剩下就可以在映射配置文件中添加SELEct和insertc;update等标签去实现增删改查操作
在映射配置文件中向 SQL 语句中绑定参数的语法结构为#{ }和${ }。
#{ } 和 ${ }的区别: #{ } 解析为一个 JDBC 预编译语句(PreparedStatement)的参数标记符占位符 ?。使 用该方式可避免 SQL 注入。 ${ } 仅仅为一个纯碎的 String 替换c;在 Mybatis 的动态 SQL 解析阶段将会进行变量替 换。${ } 在预编译之前已经被变量替换了c;这会存在 SQL 注入问题。
是不是只要能拿到同一个sqlsession就可以c;其实就是采用静态方法c;代码跑的时候直接生成一个sqlsessionc;把sqlsession放在threadLocal中
public class MybatisUtils {
private static ThreadLocal<SqlSession> threadLocal = new
ThreadLocal<>();
private static SqlSessionFactory sqlSessionFactory = null;
static{
//创建 SqlSessionFactory
InputStream is = null;
try{
is = resources.getresourceAsStream("mybatis-cfg.xml");
}catch (IOException E){
e.printStackTrace();
}
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(is);
}
//获取 SqlSession
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
//关闭 SqlSession
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
threadLocal.set(null);
}
}
}
这时候在业务层中调用不同的insertc;这时候出现异常都可以回滚了
只要调用
sqlSession.rollBACk();
以上是大佬教程为你收集整理的学完MyBatis整理了一下,希望能帮助大家全部内容,希望文章能够帮你解决学完MyBatis整理了一下,希望能帮助大家所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。