JAVA框架 Mybaits
注意:我们在resultType中,对于selectlist方法也是projo类。resultType参数的含义是list的泛型的类型。
一:jar包下载:
https://github.com/mybatis/mybatis-3/releases?after=mybatis-3.2.8
我使用的版本是3.2,7
二、创建项目 导入核心jar包和依赖的jar包。
pom.xml文件内容:
<properties>
<!--需要注意还珠格格编译器的版本要和jdk版本一直-->
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0.</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0.</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.16.-GA</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
mybaits的配置文件说明:
其中SqlMapConfig.xml是核心配置文件,数据源、事务等在这里进行配置,内容:
<?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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池 mybaits自带的连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/day_spring?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers >
<mapper resource="account.xml" />
</mappers>
</configuration>
account.xml是子配置文件。包含一些sql语句的查询。内容如下:
<?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="test1"><!--namespace起到sql隔离的作用-->
<select id="FindAccountById" resultType="jd.com.mybaitstest.account" parameterType="java.lang.Integer" >
SELECT * FROM t_account WHERE id=#{id};
</select>
<!--注意like拼接的需要使用#{value} 必须是value。-->
<select id="FindUsernameByNanme" resultType="jd.com.mybaitstest.account" parameterType="java.lang.String" > SELECT * FROM t_account WHERE NAME LIKE '%${value}%';
</select>
<!--插入语句 注意 这里我们插入值是account对象 注意的是这里的占位符的名字是account的属性--> <insert id="InsertVal" parameterType="jd.com.mybaitstest.account">
<!-- id返回的设置 标签selectkey 属性keyproperty表示:account的属性名,order 获取是插入的前(before)还是后(after)返回的数据类型-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
<!--通过数据库的内置函数SELECT LAST_INSERT_ID()获取插入的语句返回的id的值。mybaits帮我们设置到我们对象中。并设置属性是id-->
SELECT LAST_INSERT_ID();
</selectKey>
INSERT INTO t_account(NAME ,money) VALUES(#{name},#{money});
</insert>
<delete id="DeletAccoutnById" parameterType="int" >
DELETE FROM t_account WHERE id=#{id};
</delete>
<update id="UpdateById" parameterType="jd.com.mybaitstest.account" >
UPDATE t_account SET money=#{money} WHERE id=#{id};
</update>
</mapper>
mybaits的简单的增删改查:
package jd.com.mybaitstest; 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 org.junit.jupiter.api.Test; import java.io.IOException;
import java.io.InputStream;
import java.util.List; public class testmyba { @Test
public void testdemo1() throws IOException {
//查询单条数据
String resouce="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resouce);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
account ac=sqlSession.selectOne("test1.FindAccountById",);
System.out.println(ac);
}
@Test
public void testdemo2() throws IOException {
String resource="SqlMapConfig.xml";
//获取主配置文件流
InputStream inp=Resources.getResourceAsStream(resource);
//创建数据库回话
SqlSession sqlSession=new SqlSessionFactoryBuilder().build(inp).openSession();
List<account> list=sqlSession.selectList("test1.FindUsernameByNanme","ok");
System.out.println(list); }
@Test
public void testInsertdemo() throws IOException {
String resource="SqlMapConfig.xml";
InputStream inp=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inp);
SqlSession sqlSession=sqlSessionFactory.openSession();
account ac=new account();
ac.setMoney();
ac.setName("oko");
sqlSession.insert("test1.InsertVal",ac);
//在主配置文件中配置了事务。需要commit 才能生效。
sqlSession.commit();
System.out.println(ac.getId());
}
@Test
public void deleteDemo() throws IOException {
String resource="SqlMapConfig.xml";
InputStream inp=Resources.getResourceAsStream(resource);
SqlSession sqlSession=new SqlSessionFactoryBuilder().build(inp).openSession();
sqlSession.delete("test1.DeletAccoutnById",);
sqlSession.commit();
}
@Test
public void updateById() throws IOException {
String resource="SqlMapConfig.xml";
InputStream inp=Resources.getResourceAsStream(resource);
SqlSession sqlSession=new SqlSessionFactoryBuilder().build(inp).openSession();
account ac=new account();
ac.setMoney();
ac.setId();
sqlSession.update("test1.UpdateById",ac);
sqlSession.commit();
}
}
注意:我们使用sqlsessionfactory来获取sqlsession,其中通过selelct、delete、update、insert等方法进行进行增删改查。
其中方法内的参数delete(“子配置文件的中namespace.语句id值”,参数)。也就是说我们 通过子配置文件的namespace值和语句中的id值来唯一确定执行那个sql语句。
子配置文件的占位符:
占位符:作用是底层调用jdbc的时候,使用preparestatment的时候,进行sql的占位符一一对应,传入参数。
#{}占位符:
如果传入的是基本的类型那么#{}中的变量名字可以随便写。
如果传入的是pojo类的时候,那么#{}的变量名字必须要和pojo类的属性名字一致。
${}拼接符:
如果传入的是基本的类型那么${}中的变量名称必须为value。
如果传入的是pojo类的时候,那么${}必须是和pojo的类的属性名称一致。
注意${}拼接符,有可能造成sql注入,解决方法可以在用户输入的页面进行校验不可输入sql关键字,不可以输入空格。或者后端做校验验证。
主键返回:
主键一般是自增或者使用uuid。通过数据库的内置函数获取插入值之后的主键值。
1、uuid:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id"> select uuid() </selectKey> insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address}) </insert>
注意这里使用的order是“BEFORE”,因为uuid需要我们提前生成 在插入数据库所以在insert语句之前执行。
2、自增主键:
<insert id="InsertVal" parameterType="jd.com.mybaitstest.account">
<!-- id返回的设置 标签selectkey 属性keyproperty表示:account的属性名,order 获取是插入的前(before)还是后(after)返回的数据类型-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
<!--通过数据库的内置函数SELECT LAST_INSERT_ID()获取插入的语句返回的id的值。mybaits帮我们设置到我们对象中。并设置属性是id-->
SELECT LAST_INSERT_ID();
</selectKey>
INSERT INTO t_account(NAME ,money) VALUES(#{name},#{money});
</insert>
三、原生dao层编写:
dao层:
interface:
package jd.com.dao; import jd.com.mybaitstest.account; public interface acci {
void selecDemo(int i);
void updateDemo(account ac);
}
implement class:
package jd.com.dao; import jd.com.Utils.session;
import jd.com.mybaitstest.account;
import org.apache.ibatis.session.SqlSession; public class acciImpl implements acci {
@Override
public void selecDemo(int i) {
SqlSession sqlSession=session.getSession();
account ac=sqlSession.selectOne("test1.FindAccountById",i);
System.out.println(ac);
} @Override
public void updateDemo(account ac) {
SqlSession sqlSession=session.getSession();
sqlSession.update("test1.UpdateById",ac);
sqlSession.commit();
}
}
测试程序:
package jd.com.dao; import jd.com.mybaitstest.account;
import org.junit.jupiter.api.Test; public class testdemodap { @Test
public void testdemo1(){
acciImpl ac1=new acciImpl();
ac1.selecDemo();
account ac=new account();
ac.setMoney();
ac.setName("poppp");
ac.setId();
ac1.updateDemo(ac);
}
}
JAVA框架 Mybaits的更多相关文章
- JAVA框架 Mybaits 核心配置
一:mybaits的核心配置文件:SqlMapConfig.xml 配置文件中需要关注的属性: 二.properites属性:一般引用配置文件(properites文件)比如:数据库的配置.我们可以编 ...
- JAVA框架 Mybaits 动态代理
一.动态代理: mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类.底层通过反射实例化代理对象,通过代理对象调用相应的方法, ...
- JAVA框架 Mybaits 一对一、一对多
一:阐述 我们在日常操作的时候,很多时候会遇到多表联合查询,由于参照物的不通 ,会出现一对一.一对多的情况.比如说:账号信息和订单表,从订单表角度和账号信息是一对一的情况(一个订单只能是一个用户的情况 ...
- JAVA框架 Mybaits 动态sql
动态sql 一:if标签使用: 我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接. Mapper配置文件: < ...
- JAVA框架 Mybaits 输入和输出映射
一.输入映射 当前端传来的参数,比较复杂,比如说用户名称.订单单号.账号信息等等.后端有可能有多个projo类对应这些信息.我们需要把这些的projo类封装成一个类似一个vo类. 通过设置字段形式关联 ...
- 转 分享我在阿里工作十年接触过Java框架设计模式
转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ...
- 如何在Eclipse中查看JDK以及JAVA框架的源码(转载)
原文链接:http://www.cnblogs.com/outlooking/p/5243415.html 设置步骤如下: 1.点 “window”-> "Preferences&qu ...
- Java框架介绍-13个不容错过的框架项目
本文转自互联网,个人收藏所用. 下面,我们将一同分享各有趣且颇为实用的Java库,大家请任取所需.不用客气~ 1.极致精简的Java Bootique是一项用于构建无容器可运行Java应用的极简技术. ...
- 如何查看JDK以及JAVA框架的源码
如何查看JDK以及JAVA框架的源码 设置步骤如下: 1.点 “window”-> "Preferences" -> "Java" -> &q ...
随机推荐
- python学习之老男孩python全栈第九期_day003作业
1. 有变量name = "aleX leNb" 完成如下操作:(1) 移除 name 变量对应的值两边的空格,并输出处理结果name = ' aleX leNb 'print(n ...
- 本地服务器搭建服务:mysql
话不多少,mysql的优劣不再此讨论. 1.官网地址:https://dev.mysql.com/downloads/mysql/ 下载页面直接 No thanks,just start my do ...
- js-ES6学习笔记-编程风格(1)
1.ES6提出了两个新的声明变量的命令:let和const.其中,let完全可以取代var,因为两者语义相同,而且let没有副作用. 2.var命令存在变量提升效用,let命令没有这个问题.建议不再使 ...
- element-ui Message组件源码分析整理笔记(八)
Message组件源码: main.js import Vue from 'vue'; import Main from './main.vue'; import { PopupManager } f ...
- 【读书笔记】iOS-自定义视图的创建
静态创建自定义视图就是以拖动的方法来创建. 动态创建自定义视图可以理解为使用代码来创建自定义视图. 参考资料:<iOS7开发快速入门>
- SD从零开始59-61,跨公司的库存转移,Interface 修改,可用性检查和需求传递
[原创]SD从零开始59 跨公司的库存转移处理流程 库存转移流程Stock Transfer Procedure 2个工厂间的库存转移能够使用不同的流程来执行: 只执行一个库存转移记账的流程使用MM库 ...
- 怎么给SharePoint得视图设置多个过滤条件? How to set multiple complex filter conditions to the SharePoint list view ?
平时会很容易遇到需要给视图设置复杂得过滤条件,如果是一两个条件还好多,如果条件超过四个,会比较麻烦,很容易会出现逻辑不清,或者没有按照你得意愿来过滤数据得问题. 解决方案: 设置计算列,calcula ...
- Html5+离线打包创建本地消息
自己离线打包Html5+ Runtime,通常是导入SDK的Hello实例,然后修改.在做消息通知功能时,使用push.createMessage不起作用. 首先参考Android平台离线打包推送插件 ...
- 【疑难杂症02】ResultSet.next() 效率低下问题解决
今天帮同事解决了一个问题,记录一下,帮助有需要的人. 一.问题解决经过 事情的经过是这样的,下午我在敲代码的时候,一个同事悄悄走到我身边,问我有没有用没用过Oracle,这下我蒙了,难道我在他们眼中这 ...
- Expo大作战(九)--expo的工作原理,以及版本发行说明
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...