Mybatis 学习

环境搭建

pom.xml

     <!--log4j-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>

mybatis.properties

# jdbc
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456 #dbcp
initialSize=0
maxActive=10
maxIdle=10
minIdle=1
maxWait=60000

mybatis-config.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> <!-- 不建议使用这种方式定义别名,但要知道
<typeAlias type="com.zhengqing.mybatis.bean.User" ></typeAlias> --> <!-- 自定义别名: typeAliases:类型的别名 -->
<!-- <typeAliases>-->
<!-- &lt;!&ndash; typeAlias:这个type和alias的关系 -》 一一关系-->
<!-- 注意:如果不写alias,默认是类型的简单类名:首字母大小写无关,但是建议使用的时候使用大写! &ndash;&gt;-->
<!-- &lt;!&ndash; 表示这个包路径下的所有的类都有别名,默认简单类名 &ndash;&gt;-->
<!-- <package name="com.kdgc.wangxianlin.entity"></package>-->
<!-- </typeAliases>--> <!-- 引用mybatis.properties配置文件 -->
<properties resource="mybatis.properties" />
<!--日志输出的方式-->
<settings>
<setting name="logImpl" value="LOG4J" />
<setting name="cacheEnabled" value="true"/>
</settings> <!-- environments:多个环境 development:开发 -->
<environments default="development">
<!--可以设置多个数据库的链接 id是唯一的标识,通过id来进行区分-->
<environment id="development">
<!--transactionManager事务控制-->
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<!-- value属性值引用db.properties配置文件中配置的值 -->
<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="mapper/UserDao.xml" />
</mappers>
</configuration>

log4j.properties

log4j.rootLogger=DEBUG,stdout
### console ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout ### mybatis ###
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=ERROR
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

测试准备

 SqlSession openSession = null;

    /**
* 创建会话工厂
* @return
* @throws IOException
*/
@Before
public void getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
openSession = sqlSessionFactory.openSession();
} @After
public void closeOpsession() throws IOException {
if(openSession!=null){
openSession.close();
}
}

新增

 <!--新增所有列-->
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into test.user(user_name, age, nick_name, create_time)
values (#{userName}, #{age}, #{nickName}, #{createTime})
</insert>

UserDao.java

    /**
* 新增数据
*
* @param user 实例对象
* @return 影响行数
*/
int insert(User user);

UserDaoTest.java

  /**
* 新增
* @throws IOException
*/
@Test
public void insert() throws IOException {
UserDao userDao = openSession.getMapper(UserDao.class);
User user = new User();
user.setUserName("Tony");
user.setNickName("托尼");
user.setAge(24);
int res = userDao.insert(user);
System.out.println(res);
openSession.commit();
}

日志

Connected to the target VM, address: '127.0.0.1:55181', transport: 'socket'
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - Opening JDBC Connection
DEBUG - Created connection 685558284.
DEBUG - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@28dcca0c]
DEBUG - ==> Preparing: insert into test.user(user_name, age, nick_name, create_time) values (?, ?, ?, ?)
DEBUG - ==> Parameters: halo(String), 22(Integer), Halos(String), null
DEBUG - <== Updates: 1
1
DEBUG - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@28dcca0c]
Disconnected from the target VM, address: '127.0.0.1:55181', transport: 'socket'

修改

UserDao.xml

 <!--通过主键修改数据-->
<update id="update">
update test.user
<set>
<if test="userName != null and userName != ''">
user_name = #{userName},
</if>
<if test="age != null">
age = #{age},
</if>
<if test="nickName != null and nickName != ''">
nick_name = #{nickName},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
</set>
where id = #{id}
</update>

UserDao.java

/**
* 修改数据
*
* @param user 实例对象
* @return 影响行数
*/
int update(User user);

UserDaoTest.java

     /**
* 修改
* @throws IOException
*/
@Test
public void updateById() throws IOException {
UserDao userDao = openSession.getMapper(UserDao.class);
User user = new User();
user.setId(3);
user.setUserName("Tony");
user.setNickName("托尼");
user.setAge(24);
int res = userDao.update(user);
System.out.println(res);
openSession.commit();
}

日志

DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - Opening JDBC Connection
DEBUG - Created connection 1686369710.
DEBUG - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@6483f5ae]
DEBUG - ==> Preparing: update test.user SET user_name = ?, age = ?, nick_name = ? where id = ?
DEBUG - ==> Parameters: helo(String), 24(Integer), Helos(String), 3(Integer)
DEBUG - <== Updates: 1
1

删除

UserDao.xml

  <!--通过主键删除-->
<delete id="deleteById">
delete from test.user where id = #{id}
</delete>

UserDao.java

    /**
* 通过主键删除数据
*
* @param id 主键
* @return 影响行数
*/
int deleteById(Integer id);

UserDaoTest.java

   /**
* 删除
* @throws IOException
*/
@Test
public void deleteById() throws IOException {
UserDao userDao = openSession.getMapper(UserDao.class);
int res = userDao.deleteById(3);
System.out.println(res);
openSession.commit();
}

日志

DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - Opening JDBC Connection
DEBUG - Created connection 1739876329.
DEBUG - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@67b467e9]
DEBUG - ==> Preparing: delete from test.user where id = ?
DEBUG - ==> Parameters: 3(Integer)
DEBUG - <== Updates: 1
1

查询

UserDao.xml

  <!--通过实体作为筛选条件查询-->
<select id="queryAll" resultMap="UserMap">
select
id, user_name, age, nick_name, create_time
from test.user
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="userName != null and userName != ''">
and user_name = #{userName}
</if>
<if test="age != null">
and age = #{age}
</if>
<if test="nickName != null and nickName != ''">
and nick_name = #{nickName}
</if>
<if test="createTime != null">
and create_time = #{createTime}
</if>
</where>
</select>

UserDao.java

   /**
* 通过实体作为筛选条件查询
*
* @param user 实例对象
* @return 对象列表
*/
List<User> queryAll(User user);

UserDaoTest.java

 /**
* 按条件查询所有
* @throws IOException
*/
@Test
public void queryAll() throws IOException {
UserDao userDao = openSession.getMapper(UserDao.class);
User user = new User();
user.setAge(24);
List<User> list= userDao.queryAll(user);
System.out.println(list.toString());
}

日志

DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - Cache Hit Ratio [com.kdgc.wangxianlin.dao.UserDao]: 0.0
DEBUG - Opening JDBC Connection
DEBUG - Created connection 1475491159.
DEBUG - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@57f23557]
DEBUG - ==> Preparing: select id, user_name, age, nick_name, create_time from test.user WHERE age = ?
DEBUG - ==> Parameters: 24(Integer)
DEBUG - <== Total: 1
[User{id=4, userName='Tony', age=24, nickName='托尼', createTime=null}]

批量新增/删除

批量新增

UserDao.xml

    <insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
insert into test.user(user_name, age, nick_name, create_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.userName}, #{entity.age}, #{entity.nickName}, #{entity.createTime})
</foreach>
</insert>

UserDao.java

    /**
* 批量新增数据(MyBatis原生foreach方法)
*
* @param entities List<User> 实例对象列表
* @return 影响行数
*/
int insertBatch(@Param("entities") List<User> entities);

UserDaoTest.java

 /**
* 批量插入
* @throws IOException
*/
@Test
public void insertBatch() throws IOException {
UserDao userDao = openSession.getMapper(UserDao.class);
List<User> list= new ArrayList<>();
User user = new User();
user.setUserName("Tony");
user.setNickName("托尼");
user.setAge(24); list.add(user);
User user2 = new User();
user2.setUserName("Hony");
user2.setNickName("哈尼");
user2.setAge(22);
list.add(user2); int res= userDao.insertBatch(list);
System.out.println(res);
openSession.commit();
}

日志

DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - Opening JDBC Connection
DEBUG - Created connection 323326911.
DEBUG - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@134593bf]
DEBUG - ==> Preparing: insert into test.user(user_name, age, nick_name, create_time) values (?, ?, ?, ?) , (?, ?, ?, ?)
DEBUG - ==> Parameters: Tony(String), 24(Integer), 托尼(String), null, Hony(String), 22(Integer), 哈尼(String), null
DEBUG - <== Updates: 2
2
DEBUG - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@134593bf]

批量删除

UserDao.xml

   <!-- void deleteBatch(List<Long> ids);-->
<delete id="deleteBatch" parameterType="list">
<!-- DELETE from user where id in(2,3,4,5) -->
<!-- collection="list":遍历的集合 index:索引 item:每次遍历得到的对象 open:以什么开始 close:以什么关闭 separator:分隔符 -->
DELETE from user where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>

UserDao.java

   /**
* 批量删除数据
*
* @param id 主键
* @return 影响行数
*/
int deleteBatch(List<Integer> id);

UserDaoTest.java

   /**
* 批量删除
* @throws IOException
*/
@Test
public void deleteBatch() throws IOException {
UserDao userDao = openSession.getMapper(UserDao.class);
List<Integer> list= new ArrayList<>();
list.add(3);
list.add(4);
int res= userDao.deleteBatch(list);
System.out.println(res);
openSession.commit();
}

日志

DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - Opening JDBC Connection
DEBUG - Created connection 323326911.
DEBUG - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@134593bf]
DEBUG - ==> Preparing: DELETE from user where id in ( ? , ? )
DEBUG - ==> Parameters: 3(Integer), 4(Integer)
DEBUG - <== Updates: 2
2
DEBUG - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@134593bf]

【Mybatis】学习的更多相关文章

  1. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

  2. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...

  3. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  4. (原创)mybatis学习二,spring和mybatis的融合

    mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...

  5. (原创)mybatis学习一,夯实基础

    一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...

  6. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...

  7. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  8. 【Todo】Mybatis学习-偏理论

    之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html  <SSM(SpringMVC+Spring+Myba ...

  9. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  10. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

随机推荐

  1. sql求每家店铺销量前三的sku, 附python解法

    背景 有一张表: date store_id sku sales 2023-01-01 CK005 03045 50 date 代表交易日期,store_id代表门店编号,sku代表商品,sales代 ...

  2. 【必知必会的MySQL知识】⑤DQL语言

    目录 一.前言 二.基础查询 2.1 语法 2.2 实践操作 三.条件查询 3.1 语法 3.2 where 语句操作符 3.3 实践操作 四.排序查询 4.1 语法格式 4.2 实践操作 五.分组查 ...

  3. 5分钟实现调用ChatGPT接口API实现多轮问答

    5分钟实现调用ChatGPT接口API完成多轮问答 最近ChatGPT也是火爆异常啊,在亲自使用了几个月之后,我发现这东西是真的好用,实实在在地提高了生产力.那么对于开发人员来说,有时候可能需要在自己 ...

  4. 我自己写了一个波场(Tron)本地网页版钱包

    最近由于项目需要,需要给每个用户分配一个充币地址,考虑到钱包安全性和方便管理,于是自己动手写了一个本地网页版的钱包,附上源代码跟大家交流下. Github 源代码地址 钱包和项目是分离的,项目通过鉴权 ...

  5. Python定时任务框架apscheduler的简单使用

    apscheduler的简单使用 APScheduler有四大组件: 1.触发器 triggers : 触发器包含调度逻辑.每个作业都有自己的触发器,用于确定下一个任务何时运行.除了初始配置之外,触发 ...

  6. 2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。5.6笔试。

    2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度. n <= 10^6. 来自字节.5.6笔试. 答案2022-08- ...

  7. 2022-02-23:如何搭建k8s单机环境(用k3s),并且搭建dashboard?

    2022-02-23:如何搭建k8s单机环境(用k3s),并且搭建dashboard? 答案2022-02-03: 使用场景:个人电脑.需要安装虚拟机,操作系统是centos. 个人电脑上测试,不需要 ...

  8. 2022-02-06:等差数列划分 II - 子序列。 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称

    2022-02-06:等差数列划分 II - 子序列. 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目. 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称 ...

  9. WARNING: The repository located at mirrors.aliyun.com is not a trusted or secure host and is being

    更换下载源: https://pypi.tuna.tsinghua.edu.cn/simple/

  10. AcWing 1019. 庆功会

    为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员. 期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力. 输入格式 第一行二个数n,m,其中n代表 ...