测试类当作持久层
package com.ahu.mybatis;
import com.ahu.dao.Impl.UserDaoImpl;
import com.ahu.dao.UserDao;
import com.ahu.pojo.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisCRUD {
private SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws IOException {
//创建sqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//Mybatis提供Resource静态类方法getResourceAsStream(),底层封装的是类加载器
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//自动从源码src目录下读取文件
sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
}
/**
* 本层看作是业务层
*/
@Test
public void testDao(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = new UserDaoImpl(sqlSession);
List<User> users = userDao.queryUser();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
}
Dao层
- UserDao
package com.ahu.dao;
import com.ahu.pojo.User;
import java.util.List;
public interface UserDao {
List<User> queryUser();
}
- UserDaoImpl
package com.ahu.dao.Impl;
import com.ahu.dao.UserDao;
import com.ahu.pojo.User;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class UserDaoImpl implements UserDao {
private SqlSession sqlSession;
public UserDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
/**
* 需要sqlSession对象,但是不应该自己获取,要从业务层获取(事务安全性)
* @return
*/
@Override
public List<User> queryUser() {
List<User> users = sqlSession.selectList("queryList");
return users;
}
}
其他类和配置文件
- pojo
package com.ahu.pojo;
import java.util.Date;
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
- 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">
<!--约束文件,位置在mybatis的jar包-->
<configuration>
<!--
environments 运行环境,可以配置多个
default="development" 默认,值=development 开发环境
environment 运行环境,配置一个
id="development" id唯一性的属性 值=id="development" 开发环境
id="product" 生产环境
id="test" 测试环境
-->
<environments default="development">
<environment id="development">
<!--
transactionManager 事务管理配置
type="JDBC" 使用的是最原始的JDBC的事务处理机制
type="MANAGERED" 不管理事务
-->
<transactionManager type="JDBC" />
<!--
dataSource 配置数据源,连接池
type="POOLED" 使用连接池
MyBatis自带连接池 (type=""UNPOOLED)
-->
<dataSource type="POOLED">
<!-- 使用自带的数据库连接池-->
<!--配置的是,数据库连接四大信息-->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3305/mybatis?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="ahulml005" />
</dataSource>
</environment>
<!--
<environment id="produce">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisProduce?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisTest?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>-->
</environments>
<!--
配置的是映射关系 ORM Java对象和数据表
-->
<mappers>
<!--
单独的映射关系
resource资源,映射文件的路径
UserMapper.xml 配置的是数据表user的SQL语句,每个xml文件对应每一张表,对应一个namespace
命名空间是唯一的,不同的表的xml应该命名不同
-->
<mapper resource="UserMapper.xml" />
<!--<mapper resource="StudentMapper.xml"/>-->
</mappers>
</configuration>
- UserMapper.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 命名空间,属性值要求唯一性
整个的SQL语句配置文件
-->
<mapper namespace="test">
<!--
配置删除数据,标签delete
-->
<delete id="deleteUserById" parameterType="Integer">
delete from user where id = #{id}
</delete>
<!--
配置更新数据,标签update
-->
<update id="updateUserById" parameterType="com.ahu.pojo.User">
update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}
</update>
<!--
配置新增数据,标签insert
新增数据,SQL语句中,一定会有很多参数
参数封装在pojo对象,配置的时候,标签属性parameterType
SQL语句中参数的数据类型是数据库表的列名
pojo对象User,封装了所有的数据
增删改,结果是行数,int类型,不要配置resultType
新增操作:insert标签中,子标签 <selectKey> 获取上一次新增主键值
属性:
order="after或者before" 获取主键,是在SQL语句之前,还是之后执行
resultType 获取主键的结果数据类型
keyProperty 属性,查询后的值放那里 pojo对象的属性中
-->
<insert id="saveUser" parameterType="com.ahu.pojo.User">
<!--
传递的参数是对象 pojo
#{pojo对象的属性名!!}
-->
insert into user values (null,#{username},#{sex},#{birthday},#{address})
<selectKey order="AFTER" resultType="Integer" keyProperty="id">
SELECT LAST_INSERT_ID ()
</selectKey>
</insert>
<!-- selectKey自动封装为pojo对象的id值,只有连接有效-->
<!--
select 标签,配置的是查询语句
id 属性,唯一性,在当前文件中唯一 ,属性值 queryList
框架执行SQL语句: namespace+"."+queryList 确定SQL语句
resultType: 查询的结果集,是pojo对象
标签体: 是SQL语句
-->
<select id="queryList" resultType="com.ahu.pojo.User">
select * from user
</select>
<!--
配置,数据表user模糊查询
用户名模糊查询
SQL语句参数
${参数名} 写参数名字,固定写为value
#{} ${} 获取参数的区别
select * from user where username like #{value}
select * from user where username like ? '%王%'
参数编译为 ? 传递的实际参数 "'%王%'" 替换到?占位符
框架底层使用的JDBC中的接口 PreparedStatement
select * from user where username like ${value}
select * from user where username like '%王%'
直接拼接了字符串!!
${} 适合于特殊场景, SQL语句中的参数是 列名或者表名的时候
select * from user order by
-->
<select id="queryUserByUserName" resultType="com.ahu.pojo.User" parameterType="String">
select * from user where username like #{value}
</select>
<!--
配置,主键查询的SQL语句 ,标签 select
id具有唯一性
查询是有结果集
标签中属性 resultType:配置结果集的类型
SQL语句有参数的
标签中属性 parameterType: SQL语句的参数类型
-->
<select id="queryUserById" resultType="com.ahu.pojo.User" parameterType="Integer">
<!--
SQL语句
MyBatis配置SQL语句,参数不能写问号
取参数 #{参数名}
参数名,如果只有一个参数,基本类型及其包装类和String,任意
-->
select * from user where id = #{id}
</select>
<!-- <select id="queryUserById" resultType="com.ahu.pojo.User" parameterType="Integer">-->
<!-- select * from user where id = #{id}-->
<!-- </select>-->
</mapper>