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. YII文件上传

    <span style="font-size:14px;">use yii\web\UploadedFile; public function actionDoarta ...

  2. .NET快速开发框架-RDIFramework.NET 全新EasyUI版发布

    RDIFramework.NET,基于.NET的快速信息化系统快速开发框架.10年专注.易上手.多组件.全源码.可灵活构建各类型系统. 1.RDIFramework.NET快速开发框架简介 RDIFr ...

  3. 18-html压缩

    const { resolve } = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); modul ...

  4. MKL稀疏矩阵运算示例及函数封装

    Intel MKL库提供了大量优化程度高.效率快的稀疏矩阵算法,使用MKL库的将大型矩阵进行稀疏表示后,利用稀疏矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装 ...

  5. .net使用nacos配置,手把手教你分布式配置中心

    .net使用nacos配置,手把手教你分布式配置中心 Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. 这么优秀的分布式服务管理平台,怎么能不接入呢? nacos的安装和使 ...

  6. Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)

    Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践) 相关文章:Gradio入门到进阶全网最详细教程[一]:快速搭建AI算法可视化部署演示(侧重项目搭建 ...

  7. laravel框架三级联动,详细代码

    这里运用到省份表中,下面是效果图 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 需要一个省份表,里面的字段要有个pid,name这些字段 下面是控制器代码,(Cit ...

  8. 【Xpath】 xpath语法总结

    节点选取 表达式 描述 用法 说明 nodename 选取此节点的所有子节点 div 选取div下的所有标签 // 从全局节点中选择节点,任意位置均可 //div 选取整个HTML页面的所有div标签 ...

  9. 2020-12-26:mysql中,表person有字段id、name、age、sex,id是主键,name是普通索引,age和sex没有索引。select * from person where id=1 and name='james' and age=1 and sex=0。请问这条语句有几次回表?

    2020-12-26:mysql中,表person有字段id.name.age.sex,id是主键,name是普通索引,age和sex没有索引.select * from person where i ...

  10. 2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2

    2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对.例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2 ...