Mybatis入门

一、使用SqlSession对象创建Dao接口代理对象进行持久化操作

1、使用maven构建java项目

2、修改pom.xml配置,添加所需jar包坐标

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>sun</groupId>
<artifactId>mybatis05crud</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies> </project>

3、在src/main/java下创建实体类和dao接口

实体类:

 package sun.domain;

 import java.io.Serializable;
import java.util.Date; public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}

Dao接口:

 package sun.dao;

 import sun.domain.QueryObj;
import sun.domain.User; import java.util.List; public interface UserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll(); /**
* 创建用户
*/
void saveUser(User user); /**
* 更新用户
*/
void updateUser(User user); /**
* 删除用户
*/
void deleteUser(Integer userId); /**
* 查询用户(根据ID)
*/
User findUserById(Integer userId); /**
* 模糊查询
*/
List<User> findUserByName(String name); /**
* 查询总用户数
*/
int getCount(); /**
* 模糊查询
*/
List<User> findUserByQueryObj(QueryObj qobj);
}

4、在src/main/resources下创建SqlMapConfig.xml(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"> <!--mybatis主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据库连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的四个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/javatest"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource> </environment>
</environments> <!--指定映射配置文件位置-->
<mappers>
<mapper resource="sun/dao/UserDao.xml"></mapper>
</mappers>
</configuration>

5、src/main/resources下创建和Dao接口同名,同包路径的xml映射配置文件

 <?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="sun.dao.UserDao"> <!--查询所有-->
<select id="findAll" resultType="sun.domain.User">
SELECT * from user;
</select>
<!--创建用户-->
<insert id="saveUser" parameterType="sun.domain.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
SELECT last_insert_id();
</selectKey>
insert into user(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="sun.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id};
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id};
</delete>
<!--根据id查询用户-->
<select id="findUserById" parameterType="int" resultType="sun.domain.User">
SELECT * from user where id=#{id};
</select>
<!--模糊查询-->
<select id="findUserByName" parameterType="String" resultType="sun.domain.User">
SELECT * from user where username like #{username};
</select>
<!--获取总记录数-->
<select id="getCount" resultType="int">
SELECT count(1) from user;
</select>
<!--模糊查询-->
<select id="findUserByQueryObj" parameterType="sun.domain.QueryObj" resultType="sun.domain.User">
SELECT * from user where username like #{user.username};
</select>
</mapper>

6、在test目录下创建test测试类

 package sun.test;

 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.After;
import org.junit.Before;
import org.junit.Test;
import sun.dao.UserDao;
import sun.domain.QueryObj;
import sun.domain.User; import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; public class MybatisTest { private InputStream in;
private SqlSession sqlSession;
private UserDao userDao; @Before
public void init() throws IOException {
// 读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 使用工厂生产sqlsession对象
sqlSession = factory.openSession();
// 使用sqlsession创建UserDao接口代理对象
userDao = sqlSession.getMapper(UserDao.class);
} @After
public void destory() throws IOException {
sqlSession.commit();
sqlSession.close();
in.close();
} @Test
public void findAllTest() {
// 使用代理对象执行方法
List<User> all = userDao.findAll();
for (User user : all) {
System.out.println(user);
}
} @Test
public void saveUserTest() {
User user = new User();
user.setUsername("kelvin");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("安徽省宿州市");
System.out.println(user);
userDao.saveUser(user);
System.out.println(user);
} @Test
public void updateUserTest() {
User user = new User();
user.setId(50);
user.setUsername("sun");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("安徽省宿州市");
userDao.updateUser(user);
} @Test
public void deleteUserTest(){
userDao.deleteUser(50);
} @Test
public void findUserById(){
User user = userDao.findUserById(48);
System.out.println(user);
}
@Test
public void findUserByName(){
List<User> userByName = userDao.findUserByName("%王%");
for (User user : userByName) {
System.out.println(user);
}
}
@Test
public void findUserByQueryObj(){
QueryObj queryObj = new QueryObj();
User user1 = new User();
user1.setUsername("%王%");
queryObj.setUser(user1);
List<User> userByName = userDao.findUserByQueryObj(queryObj);
for (User user : userByName) {
System.out.println(user);
}
} @Test
public void getCountTest(){
int count = userDao.getCount();
System.out.println(count);
}
}

7、数据库表结构如图

操作中遇到的问题及解决办法

1、在执行增删改的操作中,测试未报错但数据库中数据未生效?
答:在使用Mybatis执行增删改时,AutoCommit会设置为false,所以如果没有手动添加sqlSession.commit()时增删改操作会触发事务回滚导致操作未生效。

2、如果实现类和表中字段名称不一致,查询后不能正确将查询结果封装为指定对象如何解决?
答:方法一、可以在映射配置文件的sql语句中将查询后的字段重命名为实体类中的字段。该方式是在sql语句上对该问题进行解决,因此效率较高,但是每一个查询语句都要对字段进行修改别名操作比较繁琐。
  方法二、可以再映射配置文件mapper内部添加下列内容,在每一个查询操作中将属性resultType="全类名"改为resultMap="resultMap的id属性名",对于resultMap中的property为实体类中字段,column为数据库表字段。该方式在加载配置文件时需要多加载resultMap项,但是在mapper内的所有查询操作中只需配置属性,不需要对查询sql语句进行修改,操作简便。

 <resultMap id="userMap" type="sun.domain.User">
<!--主键字段对应-->
<id property="user_id" column="id"></id>
<!--非主键关系对应-->
<result property="user_name" column="username"></result>
<result property="user_birthday" column="birthday"></result>
<result property="user_address" column="address"></result>
<result property="user_sex" column="sex"></result>
</resultMap>

3、在映射配置文件中,#{ }和${ }的区别的什么?

答:#{ } 预编译后使用PrepareStatement的?占位,而${ }使用Statement对象直接将参数和sql语句拼接成字符串然后在进行编译。

二、使用Dao实现类实现持久化操作

对比使用SqlSession创建代理对象方式有两处改变

1、在dao包下创建dao实现类

 package sun.dao.impl;

 import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import sun.dao.UserDao;
import sun.domain.User; import java.util.List; /**
* @Classname UserDaoImpl
* @Description TODO
* @Date 2020/9/10 10:15
* @Created by Administrator
*/
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
} public List<User> findAll() {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("sun.dao.UserDao.findAll");
sqlSession.commit();
sqlSession.close();
return users;
} public void saveUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int insert = sqlSession.insert("sun.dao.UserDao.saveUser", user);
sqlSession.commit();
sqlSession.close();
} public void updateUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int update = sqlSession.update("sun.dao.UserDao.updateUser", user);
sqlSession.commit();
sqlSession.close();
} public void deleteUser(Integer userId) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int delete = sqlSession.delete("sun.dao.UserDao.deleteUser", userId);
sqlSession.commit();
sqlSession.close();
} public User findUserById(Integer userId) {
SqlSession sqlSession= sqlSessionFactory.openSession();
User user = sqlSession.selectOne("sun.dao.UserDao.findUserById", userId);
sqlSession.commit();
sqlSession.close();
return user;
} public List<User> findUserByName(String name) {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("sun.dao.UserDao.findUserByName", name);
sqlSession.commit();
sqlSession.close();
return users;
} public int getCount() {
SqlSession sqlSession = sqlSessionFactory.openSession();
int count = sqlSession.selectOne("sun.dao.UserDao.getCount");
return count;
}
}

2、测试类

 package sun.test;

 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.After;
import org.junit.Before;
import org.junit.Test;
import sun.dao.UserDao;
import sun.dao.impl.UserDaoImpl;
import sun.domain.User; import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; public class MybatisTest { private InputStream in;
private UserDaoImpl userDao; @Before
public void init() throws IOException {
// 读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in); userDao = new UserDaoImpl(factory);
} @After
public void destory() throws IOException {
in.close();
} @Test
public void findAllTest() {
// 使用代理对象执行方法
List<User> all = userDao.findAll();
for (User user : all) {
System.out.println(user);
}
} @Test
public void saveUserTest() {
User user = new User();
user.setUsername("kelvin");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("安徽省宿州市");
System.out.println(user);
userDao.saveUser(user);
System.out.println(user);
} @Test
public void updateUserTest() {
User user = new User();
user.setId(54);
user.setUsername("sun");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("安徽省宿州市");
userDao.updateUser(user);
} @Test
public void deleteUserTest(){
userDao.deleteUser(54);
} @Test
public void findUserById(){
User user = userDao.findUserById(48);
System.out.println(user);
}
@Test
public void findUserByName(){
List<User> userByName = userDao.findUserByName("%王%");
for (User user : userByName) {
System.out.println(user);
}
} @Test
public void getCountTest(){
int count = userDao.getCount();
System.out.println(count);
}
}

Mybatis项目构建和CURD操作的更多相关文章

  1. jenkins学习之多项目构建

    多项目构建,即指的是同时构建多个源代码中的项目,我所知道的有两种方法,一种是在某个项目“构建完成后操作”中设置如下: 另外一种是借助于插件——Multijob plugin,如下: 使用方法其实比较简 ...

  2. Mybatis学习第一天——Mybatis的安装配置以及基本CURD操作

    1.Mybatis下载 Mybatis是开源的持久层框架,能够度jdbc进行简单的封装,但其并不是完全的ORM(Object Relational Mapping,对象关系映射),无法脱离数据库进行适 ...

  3. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

  4. MyBatis 单表CURD操作(五)

    MyBatis的CURD操作 添加CURD接口方法 package mapper; import entity.UserEntity; import org.apache.ibatis.annotat ...

  5. Maven的学习资料收集--(八) 构建MyBatis项目

    在这里,写一下,怎么使用Maven构建MyBatis项目. 1. 新建一个Web项目 可以参考前面的博客 2. 修改pom.xml,添加MyBatis依赖 <project xmlns=&quo ...

  6. 通过Mybatis原始Dao来实现curd操作

    环境的配置见我上一篇博客. 首先,在上一篇博客中,我们知道,SqlSession中封装了对数据库的curd操作,通过sqlSessionFactory可以创建SqlSession,而SqlSessio ...

  7. 3、MyBatis教程之CURD操作

    4.CURD操作 1.查询 根据用户 Id查询用户 在UserMapper中添加对应方法 public interface UserMapper { List<User> getUserL ...

  8. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  9. Mybatis项目搭建

    MyBatis是一个优秀的持久层框架.原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等).框架的作用就是把这些繁琐的代码封装. MyBatis通过XM ...

随机推荐

  1. myBatis源码解析-类型转换篇(5)

    前言 开始分析Type包前,说明下使用场景.数据构建语句使用PreparedStatement,需要输入的是jdbc类型,但我们一般写的是java类型.同理,数据库结果集返回的是jdbc类型,而我们需 ...

  2. 使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?

    最近在看APUE,试了上面的一些例子,其中有个例子是使用getpid函数获取进程id,但是在我写demo时,并未引入其所在的头文件unistd.h,结果也能编译成功,也能运行,于是就琢磨下为啥. En ...

  3. 简单快速导出word文档

    最近,我写公司项目word导出功能,应该只有2小时的工作量,却被硬生生的拉长2天,项目上线到业务正常运行也被拉长到2个星期. 为什么如此浪费时间呢? 1)公司的项目比较老,采用硬编码模式,意味着wor ...

  4. Typora安装教程

    一:Typora介绍 ​ Markdown是一种轻量级标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式.所谓轻量级标记语言指的是一类用简单句法描述简单格式的文本语言. 二:下载地址 ​ ...

  5. 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇)

    系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 扫码体验,先睹为快 可以扫描下微信小程序的 ...

  6. 在GitHub上删除仓库 or 项目,基操!!

    创建错误或者想要抛弃某个仓库or项目,点击选择项目,选择Setting页面,左侧方框Option页拉到底: 你就可以看到一个红色的危险域,called Danger Zone,这不禁让我想到了黑子篮球 ...

  7. JavaScript学习系列博客_27_JavaScript 遍历数组

    遍历数组 - 遍历数组就是将数组中元素都获取到 - 一般情况我们都是使用for循环来遍历数组: - 使用forEach()方法来遍历数组(不兼容IE8) forEach()方法需要一个回调函数(由我们 ...

  8. 操作系统-中断(2)IA-32/Linux的向量中断方式

    一.Intel定义下的异常和中断 不同体系和教材往往对异常和中断有不同的定义. Intel定义:中断是一种典型的由I/O设备触发的.与当前正在执行的指令无关的异步事件:而异常是处理器执行一条指令时,由 ...

  9. Python中print()函数不换行的方法以及分隔符替换

    一.让print()函数不换行 在Python中,print()函数默认是换行的.但是,在很多情况下,我们需要不换行的输出(比如在算法竞赛中).那么,在Python中如何做到这一点呢? 其实很简单.只 ...

  10. 0基础掌握接口测试神器-Postman

    一:Postman环境搭建 1:postman是什么?Postman是一款功能强大的网页调试与发送网页HTTP请求的接口测试工具.2:postman有几种安装方式?两种,应用程序和浏览器插件 3:po ...