Mybatis项目构建和CURD操作
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操作的更多相关文章
- jenkins学习之多项目构建
多项目构建,即指的是同时构建多个源代码中的项目,我所知道的有两种方法,一种是在某个项目“构建完成后操作”中设置如下: 另外一种是借助于插件——Multijob plugin,如下: 使用方法其实比较简 ...
- Mybatis学习第一天——Mybatis的安装配置以及基本CURD操作
1.Mybatis下载 Mybatis是开源的持久层框架,能够度jdbc进行简单的封装,但其并不是完全的ORM(Object Relational Mapping,对象关系映射),无法脱离数据库进行适 ...
- Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化
知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...
- MyBatis 单表CURD操作(五)
MyBatis的CURD操作 添加CURD接口方法 package mapper; import entity.UserEntity; import org.apache.ibatis.annotat ...
- Maven的学习资料收集--(八) 构建MyBatis项目
在这里,写一下,怎么使用Maven构建MyBatis项目. 1. 新建一个Web项目 可以参考前面的博客 2. 修改pom.xml,添加MyBatis依赖 <project xmlns=&quo ...
- 通过Mybatis原始Dao来实现curd操作
环境的配置见我上一篇博客. 首先,在上一篇博客中,我们知道,SqlSession中封装了对数据库的curd操作,通过sqlSessionFactory可以创建SqlSession,而SqlSessio ...
- 3、MyBatis教程之CURD操作
4.CURD操作 1.查询 根据用户 Id查询用户 在UserMapper中添加对应方法 public interface UserMapper { List<User> getUserL ...
- Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版
一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...
- Mybatis项目搭建
MyBatis是一个优秀的持久层框架.原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等).框架的作用就是把这些繁琐的代码封装. MyBatis通过XM ...
随机推荐
- java中threadlocal的理解
[TOC] #java中threadlocal的理解##一.threadlocal的生命周期和ThreadLocalMap的生命周期可以吧TreadLocal看做是一个map来使用,只不过这个map是 ...
- [持续更新]——关于C++的一些可能会常用的函数
写在前面 这些函数都是我和朋友一点一点写出来的,可能部分代码会有点雷同,但大部分代码都是自我总结出来的.目前包含的函数功能分别是: 1.设置控制台颜色 2.设置控制台光标位置 3.隐藏控制台光标 4. ...
- 配置 Eureka Server 集群
简介 为了使 Eureka Server 实现高可用,我们需要为它配置集群.这样当有一台 Eureka Server 有故障时,集群中的其他 Server 可以进行代替.Eureka 集群之中的 No ...
- linux 查找删除
find -name "*.php" -exec rm -f '{}' \;
- Redis高级项目实战,都0202年了,还不会Redis?
导读 大家都听过1万小时定律,可事实真的是这样吗?做了1万小时的CRUD,不还只会CRUD吗,这年头不适当的更新自身下技术栈,出门和别人聊天吹牛的时候,都没拿不出手,(⊙o⊙)…Redis没入门的童鞋 ...
- Golang bytes.buffer详解
原文:https://www.jianshu.com/p/e53083132a25 Buffer 介绍 Buffer 是 bytes 包中的一个 type Buffer struct{…} A buf ...
- Excel数据分析 --数据透析表
数据透析表主要用于各种数据总汇,对各项数据指标进行分类统计 实例分析 如下所示:是一份销售流水数据,有时间,地区,销售员,商品名称,数量,单价和金额几个字段,如下所示: 现在针对不同的数据汇总需求,可 ...
- latex:公式中的文字
公式环境中的说明文字应置于\mbox命令中.如果已经调用了数学工具宏包或者公式宏包,可改为选用一下3条功能更强的文本命令将简短文字插入公式中. \intertext{文本} 由amsmath宏包提供, ...
- pytest与Allure集成
1.窗口的方式 重启jenkins,重新连接,继续上次的内容.(注意:点击launch,重新下载slave-agent文件,然后双击slave-agent文件进行连接.上次下载的slave-agent ...
- Java方法传参,测试在方法内部改变参数内容是否会影响到原值
我分了三种类型的参数进行测试 一.基本类型 public static void main(String[] args) { System.out.println("验证基本类型int作为参 ...