1.结构图
2.实体类User
package com.itheima.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 + '\'' +
'}';
}
}
3.接口IUserDao
package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
public interface IUserDao {
//查询所有
List<User> findAll();
//保存用户
void saveUser(User user);
//更新数据
void updateUser(User user);
//删除一个
void deleteOneUser(Integer userId);
//查询一个
User findUserById(Integer userId);
//模糊查询
List<User> findUserByName(String username);
//查询总条数
int findTotal();
}
4.实现类UserDaoImpl
package com.itheima.dao.impl;
import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
/*
* 使用代理Dao的方式和实现类的方式到底有什么区别
*
*
* */
public class UserDaoImpl implements IUserDao {
/*1.创建构造函数*/
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory) {
this.factory = factory;
}
/*查询所有*/
public List<User> findAll() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现查询列表
List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");
//3.释放资源
session.close();
return users;
}
public void saveUser(User user) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现保存
session.insert("com.itheima.dao.IUserDao.saveUser",user);
//3.提交事务
session.commit();
//4.释放资源
session.close();
}
//更新一个
public void updateUser(User user) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession的方法更新一个
session.update("com.itheima.dao.IUserDao.updateUser",user);
//3.提交事务
session.commit();
//4.释放资源
session.close();
}
//删除一个
public void deleteOneUser(Integer userId) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession的方法更新一个:接口全限定类名:+方法
session.delete("com.itheima.dao.IUserDao.deleteOneUser",userId);
//3.提交事务
session.commit();
//4.释放资源
session.close();
}
//查询一个
public User findUserById(Integer userId) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession的方法更新一个:接口全限定类名:+方法
//此时查询返回的结果将不是一个集合而是一个对象
User users = session.selectOne("com.itheima.dao.IUserDao.findUserById",userId);
//4.释放资源
session.close();
return users;
}
public List<User> findUserByName(String username) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession的方法更新一个:接口全限定类名:+方法
//此时查询返回的结果将是一个集合而不是一个对象
List<User> users= session.selectList("com.itheima.dao.IUserDao.findUserByName",username);
//4.释放资源
session.close();
return users;
}
/*查询数据库总的条数*/
public int findTotal() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession的方法更新一个:接口全限定类名:+方法
//此时查询返回的结果将是一个集合而不是一个对象
int count= session.selectOne("com.itheima.dao.IUserDao.findTotal");
//4.释放资源
session.close();
return count;
}
}
5.对应接口文件IUserMapper.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="com.itheima.dao.IUserDao">
<!--查询所有-->
<select id="findAll" resultType="User">
select * from user
</select>
<!--保存一个-->
<insert id="saveUser" parameterType="com.itheima.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="com.itheima.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
<!--根据id删除一个-->
<delete id="deleteOneUser" parameterType="int">
delete from user where id=#{id}
</delete>
<!--查询一个id-->
<select id="findUserById" parameterType="int" resultType="com.itheima.domain.User">
select * from user where id=#{id}
</select>
<!--模糊查询-->
<select id="findUserByName" parameterType="string" resultType="com.itheima.domain.User">
<!--select * from user where username like '%${value}%'-->
select * from user where username like #{name}
</select>
<!--查询数据库总的条数-->
<select id="findTotal" resultType="int">
select count(id) from user
</select>
</mapper>
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连接数据库
方式一:
可以在标签内部配置数据库的信息。
方式二:
也可以通过属性引用外部的配置文件信息
resources属性:
用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下
并且<property name="driver" value="${driver}"/>中的value必须要和jdbc.properties里的配置名一样
url属性:
必须要按照Url的写法来写路径
URL:Uniform Resource Locator统一资源定位符。他是可以唯一标识以恶搞资源的位置路径写法(全网)
它的写法:
http://localhost:8080/mybatis/login
协议 主机 端口 URI(端口之后的)
URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的(该项目中)
怎么使用尼:把文件拖到网页,网页打开的路径就是该资源的URL的路径 或者 找到项目的路径中的jdbc.properties,复制该文件夹的路径即可
-->
<!--方式一:
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>-->
<!--方式二:外部通过dbc.properties配置了-->
<properties resource="jdbc.properties"></properties>
<!--讲解typeAlias属性和package属性
typeAlias属性:给resultType="com.itheima.domain.User"这样的配置属性的别名,它只能配置domain中;类的别名 指定了别名就区分大小写
package 用于指定要配置别名的包,当指定之后,该包下来的实体类都会注册别名,并且 [类名] 就是别名,不再区分大小写
-->
<typeAliases>
<!--<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>-->
<package name="com.itheima.domain"/>
</typeAliases>
<!--配置环境-->
<environments default="mysql">
<!--配置环境-->
<environment id="mysql">
<!--配置事务管理JDBC-->
<transactionManager type="JDBC"></transactionManager>
<!--POOLED-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--IUserMapper.xml的配置-->
<mappers>
<mapper resource="com/itheima/dao/IUserMapper.xml"></mapper>
<!--package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或class了-->
<!--<package name="com.itheima.dao"></package>-->
</mappers>
</configuration>
7.外部数据库配置jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=123456
8.log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
9.测试类
package com.itheima;
import com.itheima.dao.IUserDao;
import com.itheima.dao.impl.UserDaoImpl;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
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.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisCRUD {
//为了不用重复使用
private InputStream inputStream;
private IUserDao userDao;
/*初始化,在程序一运行的时候就准备好*/
/*不写注解会报空指针异常*/
@Before
public void init() throws Exception{
//1.获取配置文件SqlMapConfig的字节流
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory,让builder创建factory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3.使用工厂创建dao对象
userDao = new UserDaoImpl(factory);
}
//查询所有
@Test
public void findAlData(){
//5.使用userDao调用执行该方法--返回一个结果集
List<User> users = userDao.findAll();
for (User user:users){
System.out.println(user);
}
}
//保存一个
@Test
public void saveUserData(){
User user = new User();
user.setUsername("哈哈");
user.setAddress("武汉市黄陂区");
user.setSex("女");
user.setBirthday(new Date());
//5.使用userDao调用执行该方法--返回一个结果集
System.out.println("保存之前"+user);
userDao.saveUser(user);
System.out.println("插入成功之后"+user);
}
//更新
@Test
public void updateUserDate(){
User user = new User();
user.setId(17);
user.setUsername("帅哥");
user.setAddress("武汉市武昌区");
user.setSex("男");
user.setBirthday(new Date());
//5.使用userDao调用执行该方法——返回一个结果集
userDao.updateUser(user);
System.out.println("更新成功");
}
//删除id根据id
@Test
public void deleteUserDate(){
userDao.deleteOneUser(17);
System.out.println("删除成功");
}
//根据id查询一个用户信息
@Test
public void findUserByIdData(){
User user = userDao.findUserById(16);
System.out.println("查询id成功"+user);
}
//根据名字模糊查询用户信息
@Test
public void findUserByNameData(){
/*注意查询的格式就可以了*/
List<User> users = userDao.findUserByName("%王%");
/*List<User> users = userDao.findUserByName("王");*/
for (User user:users) {
System.out.println("模糊查询name成功"+user);
}
System.out.println("模糊查询成功");
}
//根据id查询一个用户信息
@Test
public void findUserITotal(){
int count = userDao.findTotal();
System.out.println("数据库总的数据为"+count+"条");
}
/*释放资源*/
@After
public void destroy() throws Exception{
//只剩下关闭流
inputStream.close();
}
}
10.pom.xml(先加依赖再从2开始)
<dependencies>
<!--sql驱动:连接数据库用-->
<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>
<scope>test</scope>
</dependency>
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--mybatis环境-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
</dependencies>