通过xml文件来配置mybatis的工作空间
1 maven的整体目录
2 配置文件
2.1 dao目录下的IUserDao接口
import com.xgh.domain.QueryVo;
import com.xgh.domain.User;
import java.util.List;
public interface IUserDao {
// 获取指定查询所有方法
List<User> findAll();
// 添加用户
void addUser(User user);
// 更新用户信息
void updateUser(User user);
// 删除操作
void deleteUser(int userId);
// 根据用户的id查询所有信息
User findUserAll(Integer userId);
// 模糊查询信息
List<User> findUsersByName(String username);
// 查询用户的总数
int countUser();
// 模糊查询2,封装成一个对象
List<User> findUserByVo(QueryVo queryVo);
}
2.2 domain目录下的User封装类
package com.xgh.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public int getId() {
return id;
}
public void setId(int 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 + '\'' +
'}';
}
}
2.3 domain目录下的QueryVo查询类
package com.xgh.domain;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2.4 resources目录下dao目录下IUserDao.xml文件配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xgh.dao.IUserDao">
<!--1 配置查询所有 resultType="" 代表保存的用户-->
<select id="findAll" resultType="com.xgh.domain.User">
select * from user;
</select>
<!--2 添加用户信息 parameterType=" " 代表插入的类型-->
<!--
<insert id="addUser" parameterType="com.xgh.domain.User">
insert into user(id,username,sex,address,birthday) values(#{id},#{username},#{sex},#{address},#{birthday});
</insert>
-->
<!--2 添加用户信息 parameterType=" " 代表插入的类型-->
<insert id="addUser" parameterType="com.xgh.domain.User">
<!-- 配置插入操作后,获取插入数据的id order="" 代表在什么时候获取id的值,after代表之后-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(id,username,sex,address,birthday) values(#{id},#{username},#{sex},#{address},#{birthday});
</insert>
<!--3 更新信息-->
<update id="updateUser" parameterType="com.xgh.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
<!--删除操作-->
<!-- <delete id="deleteUser" parameterType="com.xgh.domain.User">-->
<!-- delete from user where id=#{id};-->
<!-- </delete>-->
<!-- -->
<!--删除的另一种写法,parameter="";代表设置传参的属性值-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id};
</delete>
<!--根据用户的id查询所有信息-->
<select id="findUserAll" resultType="com.xgh.domain.User" parameterType="int">
select * from user where id=#{id};
</select>
<!--模糊查询根据用户的姓名来实现-->
<select id="findUsersByName" parameterType="String" resultType="com.xgh.domain.User">
<!-- 此方法通过Parparement对象来实现的,通过使用预处理的方式来实现-->
<!--select * from user where username like #{username};-->
<!-- 此方法通过Statement对象来实现的-->
select * from user where username like '%${value}%'
</select>
<!--查询用户的总数量-->
<select id="countUser" resultType="int">
select count(id) from user;
</select>
<!--根据QueryVo来查询条件-->
<select id="findUserByVo" parameterType="com.xgh.domain.QueryVo" resultType="com.xgh.domain.User">
<!--user是一个对象,user.username 用来调用属性-->
select * from user where username like #{user.username}
</select>
</mapper>
2.5 IUserDao.xml中各各sql语句的编写
2.5.1 查询
<!--1 配置查询所有 resultType="" 代表保存的用户-->
<select id="findAll" resultType="com.xgh.domain.User">
select * from user;
</select>
查询结果
2.5.2 添加用户
- 方式一
<!--2.1 添加用户信息 parameterType=" " 代表插入的类型-->
<insert id="addUser" parameterType="com.xgh.domain.User">
insert into user(id,username,sex,address,birthday) values(#{id},#{username},#{sex},#{address},#{birthday});
</insert>
测试结果:
- 方式二:
<!--2.2 添加用户信息 parameterType=" " 代表插入的类型-->
<insert id="addUser" parameterType="com.xgh.domain.User">
<!-- 配置插入操作后,获取插入数据的id order="" 代表在什么时候获取id的值,after代表之后-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(id,username,sex,address,birthday) values(#{id},#{username},#{sex},#{address},#{birthday});
</insert>
可以看出 两种方式的区别:方式一当传入到mysql前的id是没有值的,而方式二的方式传入之前id提前已经含有值了。
2.5.3 更新用户
<!--3 更新信息-->
<update id="updateUser" parameterType="com.xgh.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
2.5.3 删除用户
编写删除功能含有两种方式
- 方式一
<!--删除操作-->
<delete id="deleteUser" parameterType="com.xgh.domain.User">
delete from user where id=#{id};
</delete>
- 方式二
<!--删除的另一种写法,parameter="";代表设置传参的属性值-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id};
</delete>
两种方式都可以实现,主要区别是类型不同
2.5.4 根据id查询用户信息
<!--根据用户的id查询所有信息-->
<select id="findUserAll" resultType="com.xgh.domain.User" parameterType="int">
select * from user where id=#{id};
</select>
- 属性值:
resultType:代表封装类对象
parameterType:参数值类型
查询结果
2.5.5 根据模糊查询用户信息
- 方式一:
<!--模糊查询根据用户的姓名来实现-->
<select id="findUsersByName" parameterType="String" resultType="com.xgh.domain.User">
select * from user where username like #{username};
</select>
- 方式二:
<!--模糊查询根据用户的姓名来实现-->
<select id="findUsersByName" parameterType="String" resultType="com.xgh.domain.User">
<!-- 此方法通过Statement对象来实现的-->
select * from user where username like '%${value}%'
</select>
两种方式的区别
第一中方式通过Parparement对象来实现的,通过使用预处理的方式来实现,线程更加安全
第二种方法通过Statement对象来实现,线程安全性较弱
2.6 配置SqlMapConfig.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>
<!--配置properties-->
<!-- <properties>-->
<!--方式一,直接再该文件中编写-->
<!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"></property>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/db1?userSSL=false&serverTimezone=UTC"></property>-->
<!-- <property name="username" value="root"></property>-->
<!-- <property name="password" value="cmsxgh"></property>-->
<!--方式二:通过properties的属性来查找-->
<!-- <properties resource=""></properties><!–引用同目录下的properties文件–>-->
<properties url="file:///E:/Java/Document/JDBC/Java_Mysql/src/jdbc.properties"></properties><!--可以引用其他目录下的文件-->
<!-- </properties>-->
<!--配置环境-->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="${Driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${user}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置 通过配置xml文件来实现 -->
<mappers>
<mapper resource="com/xgh/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
前方高能
2.6 测试类
package com.xgh.test;
import com.xgh.dao.IUserDao;
import com.xgh.domain.QueryVo;
import com.xgh.domain.User;
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.Date;
import java.util.List;
public class mybatisTest {
private InputStream is = null;
private SqlSession sqlSession = null;
private IUserDao userDao = null;
@Test
@Before//用于在测试方法之前执行
public void init() throws IOException {
//1 读取配置文件,生成字节输入流
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2 获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 获取SqlSession对象
sqlSession = factory.openSession();
//4 获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After //用于执行方法之后执行
public void destory() throws IOException {
//6 提交事务
sqlSession.commit();
//7 释放资源
sqlSession.close();
is.close();
}
/**
* 测试查询所有用户
*/
@Test
public void testFindAll() throws IOException {
//5 执行查询所有方法
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
}
//添加用户功能
@Test
public void addUserTest() throws IOException {
//创建插入对象
User user = new User();
//设置值
user.setUsername("zhangsan");
user.setAddress("河南");
user.setBirthday(new Date());
user.setSex("男");
System.out.println("保存前用户的信息:"+user);
//5 执行保存方法
userDao.addUser(user);
System.out.println("保存后用户的信息:"+user);
}
//更新用户信息
@Test
public void updateUserTest() throws IOException {
//创建插入对象
User user = new User();
//设置值
user.setUsername("lisi");
user.setAddress("shanghai");
user.setBirthday(new Date());
user.setSex("女");
//5 执行保存方法
userDao.updateUser(user);
}
//删除操作
@Test
public void deleteUserTest(){
userDao.deleteUser(56);
}
//根据用户的id查询个人用户的所有信息
@Test
public void findUserAllTest(){
User user = userDao.findUserAll(58);
System.out.println(user);
}
//模糊查询,查询表中带有 王 的用户
@Test
public void findUsersByName(){
// List<User> users = userDao.findUsersByName("%王%");
List<User> users = userDao.findUsersByName("王");
for(User user : users){
System.out.println(user);
}
}
// 查询用户的总数
@Test
public void countUserTest(){
int countUser = userDao.countUser();
System.out.println("用户总数为:"+countUser);
}
//模糊查询,查询表中带有 王 的用户
@Test
public void findUserByVo(){
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUsername("%王%");
queryVo.setUser(user);
List<User> users = userDao.findUserByVo(queryVo);
for(User s : users){
System.out.println(s);
}
}
}