使用mybatis连接MySQL数据库并对其进行增删改查
- 这里通过mybatis框架对MySQL数据库进行操作
提示:里面环境搭建和实体类的建立在我上篇文章里!
需要的点这里!
文章目录
前言
mybatis 环境搭建步骤
第一步:创建 maven 工程
第二步:导入坐标
第三步:编写必要代码(实体类和持久层接口)
第四步:编写 SqlMapConfig.xml
第五步:编写映射配置文件
第六步:编写测试类
提示:以下是本篇文章正文内容,下面案例可供参考
一、 基于代理 Dao 实现 CRUD 操作
使用要求:
1、持久层接口和持久层接口的映射配置必须在相同的包下
2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名
3、SQL 语句的配置标签,,,的 id 属性必须和持久层接口的
方法名相同。
目录结构:
二、使用步骤
1. 在持久层接口(UserDao.java)中添加 findById 方法
代码如下(示例):
package cn.it.dao;
import cn.it.domain.Users;
import java.util.List;
public interface UserDao {
/*//映射查询方法
List<Users> findAll();*/
//使用注解查询方法
/*@Select("SELECT * from users")*/
List<Users> findAll();
//id查询
Users findByID(Integer id);
//添加
void addUser(Users users);
//删除
void deleteByID(Integer id);
//更新操作
void updateUser(Users users);
//模糊查询
List<Users> findByFuzzy(String name);
//条件查询
List<Users> findByName(String name);
//查询总记录数
int findTotal();
}
2.在用户的映射配置文件中配置
代码如下(示例):
<?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="cn.it.dao.UserDao">
<!-- namespace:把要映射的接口路径加载过来-->
<select id="findAll" resultType="cn.it.domain.Users">
SELECT * from users
</select>
<!--ID查询-->
<!--id=方法名,resultType=返回值类型(包路径),parameterType=参数类型(包路径)-->
<select id="findByID" resultType="cn.it.domain.Users" parameterType="java.lang.Integer">
SELECT * from users where id = #{ id }
</select>
<!--添加-->
<insert id="addUser" parameterType="cn.it.domain.Users">
/*获取当前插入值的key值,id*/
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id();
</selectKey>
insert into users(name,password,address) values(#{name},#{password},#{address})
</insert>
<!-- 删除-->
<delete id="deleteByID" parameterType="java.lang.Integer">
DELETE from users where id = #{ id }
</delete>
<!--更新-->
<update id="updateUser" parameterType="cn.it.domain.Users">
UPDATE users SET name = #{name},password = #{password},address = #{address} where id = #{id}
</update>
<!--//模糊查询-->
<select id="findByFuzzy" resultType="cn.it.domain.Users" parameterType="String">
SELECT * from users where name like '%${value}%'
</select>
<!--条件查询-->
<select id="findByName" resultType="cn.it.domain.Users" parameterType="String">
SELECT * from users where name = #{name}
</select>
<!--查询总记录数-->
<select id="findTotal" resultType="int">
SELECT count(*) from users
</select>
</mapper>
3.在测试类添加测试
package cn.it.test;
import cn.it.dao.UserDao;
import cn.it.domain.Users;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
//使用封装的方式
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private UserDao userDao;
//初始化方法
@Before
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
factory = builder.build(in);
//4.使用工厂生产SqlSession对象
session = factory.openSession();
//5.使用SqlSession创建Dao接口的代理对象
userDao = session.getMapper(UserDao.class);
}
//关闭资源
@After
public void closeResources() throws IOException{
//移交表
session.commit();
//6.释放资源
session.close();
in.close();
}
//查询所有
@Test
public void findAll(){
//5.使用代理对象执行方法
List<Users> users = userDao.findAll();
for(Users user : users){
System.out.println(user);
}
}
//ID单行查询
@Test
public void findByID01(){
Users users1 = userDao.findByID(1);
System.out.println(users1);
}
//添加
@Test
public void add(){
Users users = new Users();
users.setName("小强2");
users.setPassword("2131");
users.setAddress("深圳");
userDao.addUser(users);
//输出当前插入数据的id
System.out.println(users.getId());
}
//删除
@Test
public void delete(){
userDao.deleteByID(3127);
}
//修改
@Test
public void update(){
Users users = userDao.findByID(2);
users.setName("小玉");
users.setPassword("aaa");
users.setAddress("上海");
userDao.updateUser(users);
}
//模糊查询
@Test
public void findByFezzy(){
List<Users> usersList = userDao.findByFuzzy("强");
for (Users users : usersList){
System.out.println(users);
}
}
//条件查询名字为小爽
@Test
public void findByname(){
List<Users> usersList = userDao.findByName("小爽");
for (Users users : usersList){
System.out.println(users);
}
}
//查询总记录数
@Test
public void getTatal(){
int r = userDao.findTotal();
System.out.println("一共有"+r+"条记录!");
}
}
所有的增删改查操作的代码我都写在里面了,里面有许多需要注意的细节需要注意。
<insert id="saveUser" parameterType="com.itheima.domain.User">
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
细节:
parameterType 属性:
代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。
可以使用:session.commit();来实现事务提交。加入事务提交后的代码如下:
@After//在测试方法执行完成之后执行
public void destroy() throws Exception{
session.commit();
//7.释放资源
session.close();
in.close();
}
新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相
当于我们要在新增后将自动增长 auto_increment 的值返回。
<insert id="saveUser" parameterType="USER">
<!-- 配置保存时获取插入的 id -->
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id();
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
#{}与${}的区别
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
型值,#{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简
单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。
总结
提示:我只说明了部分细节和需要注意的地方,没有的地方还请见谅!
以上就是操作的内容,本文仅仅简单介绍了 CRUD 操作,希望对您有所帮助,谢谢阅读!。