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. LeetCode 647. Palindromic Substrings的三种解法

    转载地址 https://www.cnblogs.com/AlvinZH/p/8527668.html#_label5 题目详情 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同 ...

  2. mysql的ATM存取款机系统

    ##建库 CREATE DATABASE bankDB; ##客户信息表 CREATE TABLE userInfo ( customerID INT PRIMARY KEY AUTO_INCREME ...

  3. 【算法•日更•第二期】查找算法:三分VS二分

    ▎前言:函数 如果你已经上过初二的数学课了,那么你十有八九会被函数折磨到吐血,这是一种中考压轴题类的题目,往往分类讨论到你恶心.不过没学过也不打紧,现场讲解一下: ☞『数学中的函数』 一般地,如果在一 ...

  4. Python3 执行JS出现JSON未定义问题

    two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...

  5. XSS的构造技巧

    XSS的构造技巧 By:Mirror王宇阳 E-mail:2821319009@qq.com 本文为长期持续维护,一旦遇到新的技术技巧将及时更新本文内容 非常的欢迎技术大佬纠正并补充,也欢迎技术同僚讨 ...

  6. Scala集合操作中的几种高阶函数

    Scala是函数式编程,这点在集合操作中大量体现.高阶函数,也就是能够接收另外一个函数作为参数的函数. 假如现在有一个需要是将List集合中的每个元素变为原来的两倍,现在来对比Java方式实现和Sca ...

  7. Python的序列数据和变量

    本篇内容涉及字符串.列表.元组.Python中的报错,以及变量本质,包括引用计数技术 该篇只为抛砖引玉,其内容来自Python学习中总结,另外感谢李老师的教导和Python班同学们的帮助 附上李老师和 ...

  8. SparkSQL DSL开发(Old)

    import org.apache.spark.sql.SQLContextimport org.apache.spark.sql.expressions.Windowimport org.apach ...

  9. Ubuntu18.04 解决umount: /mnt: device is busy

    通过该命令查看那个进程占用该device fuser -m /mnt 然后 kill -9 PID 最后就可以umount /mnt 了

  10. superslide滚动插件使用记录-产品滚动-图片滚动

    在用wordpress制作一个企业网站时,用到了这个superslide的滚动插件,用于案例.证书等滚动效果.该插件网站在这里:http://www.superslide2.com/ 我所使用的wor ...