-
点击File---New----project
選擇Maven--Project SDK 選擇1.8--不勾選 Create from archetype
-- 最後點擊 Next
image.png
在Groupid中填入项目的包名即可(com.xag)。Artifactid 填入項目名(bybatis_sample)
-
输入项目信息
image.png 引入mysql依赖包
mysql
mysql-connector-java
8.0.16
- 引入 mybatis 依赖包
org.mybatis
mybatis
3.5.2
- 引入日志依赖包
org.slf4j
slf4j-log4j12
1.7.28
7.引入junit依赖
junit
junit
4.12
- 准备数据
创建数据库:
CREATE DATABASE mybatis_demo;
DROP TABLE IF EXISTS tb_user;
CREATE TABLE tb_user
(
id int auto_increment not null,
user_name varchar(32) DEFAULT NULL,
password varchar(32) DEFAULT NULL,
name varchar(32) DEFAULT NULL,
age int(10) DEFAULT NULL,
sex int(2) DEFAULT NULL,
birthday date DEFAULT NULL,
created datetime DEFAULT NULL,
updated datetime DEFAULT NULL,
primary key (id)
);
alter table tb_user auto_increment=100;
插入数据:
INSERT INTO tb_user (user_name, password, name, age, sex, birthday, created, updated) VALUES ( 'zpc', '123456', '鹏程', '22', '1', '1990-09-02', sysdate(), sysdate());
INSERT INTO tb_user (user_name, password, name, age, sex, birthday, created, updated) VALUES ( 'hj', '123456', '静静', '22', '1', '1993-09-05', sysdate(), sysdate());
- JDBC 代码回顾
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @author xag
*/
public class JDBCTest {
public static void main(String[] args) throws Exception {
Connection connection = null;
PreparedStatement prepareStatement = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接
String url = "jdbc:mysql://192.168.139.8:3306/mybatis_demo";
String user = "system";
String password = "123456";
connection = DriverManager.getConnection(url, user, password);
// 获取statement,preparedStatement
String sql = "select * from tb_user where id=?";
prepareStatement = connection.prepareStatement(sql);
// 设置参数
prepareStatement.setLong(1, 100);
// 执行查询
rs = prepareStatement.executeQuery();
// 处理结果集
while (rs.next()) {
System.out.println(rs.getString("user_name"));
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
System.out.println(rs.getDate("birthday"));
}
} finally {
// 关闭连接,释放资源
if (rs != null) {
rs.close();
}
if (prepareStatement != null) {
prepareStatement.close();
}
if (connection != null) {
connection.close();
}
}
}
}
开始 Mybaits 测试
- 新建mybatis-config.xml 文件(resources/mappers目录下)
- 新建 MyMapper.xml 文件(resources目录下)
- 新建 log4j.properties 文件(resources目录下)
log4j.rootLogger=DEBUG,A1
log4j.logger.org.apache=DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
- 新建User类
package com.xag.mybatis.pojo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
private String id;
private String userName;
private String password;
private String name;
private Integer age;
private Integer sex;
private Date birthday;
private String created;
private String updated;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
public String getUpdated() {
return updated;
}
public void setUpdated(String updated) {
this.updated = updated;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", birthday='" + new SimpleDateFormat("yyyy-MM-dd").format(birthday) + '\'' +
", created='" + created + '\'' +
", updated='" + updated + '\'' +
'}';
}
}
- 新建 MybatisTest 测试类
package com.xag.mybatis;
import com.xag.mybatis.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 java.io.InputStream;
public class MybatisTest {
public static void main(String[] args) throws Exception {
// 指定全局配置文件
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 操作CRUD,第一个参数:指定statement,规则:命名空间+“.”+statementId
// 第二个参数:指定传入sql的参数:这里是用户id
User user = sqlSession.selectOne("MyMapper.selectUser", 100);
System.out.println(user);
} finally {
sqlSession.close();
}
}
}
开始 完整的CRUD操作
- 创建UserDao接口
package com.xag.mybatis.dao;
import com.xag.mybatis.pojo.User;
import java.util.List;
public interface UserDao
{
/**
* 根据id查询用户信息
*
* @param id
* @return
*/
public User queryUserById(String id);
/**
* 查询所有用户信息
*
* @return
*/
public List queryUserAll();
/**
* 新增用户
*
* @param user
*/
public void insertUser(User user);
/**
* 更新用户信息
*
* @param user
*/
public void updateUser(User user);
/**
* 根据id删除用户信息
*
* @param id
*/
public void deleteUser(String id);
}
16.创建UserDaoImpl
package com.xag.mybatis.dao.impl;
import com.xag.mybatis.dao.UserDao;
import com.xag.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class UserDaoImpl implements UserDao {
public SqlSession sqlSession;
public UserDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public User queryUserById(String id) {
return this.sqlSession.selectOne("UserDao.queryUserById", id);
}
public List queryUserAll() {
return this.sqlSession.selectList("UserDao.queryUserAll");
}
public void insertUser(User user) {
this.sqlSession.insert("UserDao.insertUser", user);
}
public void updateUser(User user) {
this.sqlSession.update("UserDao.updateUser", user);
}
public void deleteUser(String id) {
this.sqlSession.delete("UserDao.deleteUser", id);
}
}
17.编写UserDao对应的UserDaoMapper.xml
INSERT INTO tb_user (
user_name,
password,
name,
age,
sex,
birthday,
created,
updated
)
VALUES
(
#{userName},
#{password},
#{name},
#{age},
#{sex},
#{birthday},
now(),
now()
);
UPDATE tb_user
user_name = #{userName},
password = #{password},
name = #{name},
age = #{age},
sex = #{sex},
birthday = #{birthday},
updated = now(),
WHERE
(id = #{id});
delete from tb_user where id=#{id}
19.在mybatis-config.xml中添加配置
-
添加UserDaoImpl的测试用例(按住Alt+Enter)
image.png
image.png 编写UserDaoImpl的测试用例
package com.xag.mybatis.dao.impl;
import com.xag.mybatis.dao.UserDao;
import com.xag.mybatis.dao.impl.UserDaoImpl;
import com.xag.mybatis.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.InputStream;
import java.util.Date;
import java.util.List;
public class UserDaoImplTest {
public UserDao userDao;
public SqlSession sqlSession;
@Before
public void setUp() throws Exception {
// mybatis-config.xml
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream is = Resources.getResourceAsStream(resource);
// 构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 获取sqlSession
sqlSession = sqlSessionFactory.openSession();
this.userDao = new UserDaoImpl(sqlSession);
}
@Test
public void queryUserById() throws Exception {
System.out.println(this.userDao.queryUserById("100"));
}
@Test
public void queryUserAll() throws Exception {
List userList = this.userDao.queryUserAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void insertUser() throws Exception {
User user = new User();
user.setAge(16);
user.setBirthday(new Date("1990/09/02"));
user.setName("大鹏");
user.setPassword("123456");
user.setSex(1);
user.setUserName("evan");
this.userDao.insertUser(user);
this.sqlSession.commit();
}
@Test
public void updateUser() throws Exception {
User user = new User();
user.setBirthday(new Date());
user.setName("静鹏");
user.setPassword("654321");
user.setSex(1);
user.setUserName("evanjin");
user.setId("100");
this.userDao.updateUser(user);
this.sqlSession.commit();
}
@Test
public void deleteUser() throws Exception {
this.userDao.deleteUser("102");
this.sqlSession.commit();
}
}
使用动态代理改造CRUD
修改测试用例的setUp方法
// 1. 映射文件的命名空间(namespace)必须是mapper接口的全路径
// 2. 映射文件的statement的id必须和mapper接口的方法名保持一致
// 3. Statement的resultType必须和mapper接口方法的返回类型一致
// 4. statement的parameterType必须和mapper接口方法的参数类型一致(不一定)
this.userMapper = sqlSession.getMapper(UserDao.class);完整的例子
创建UserMapper接口(对应原UserDao)
package com.xag.mybatis.dao;
import org.apache.ibatis.annotations.Param;
import com.xag.mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
/**
* 登录(直接使用注解指定传入参数名称)
* @param userName
* @param password
* @return
*/
public User login(@Param("userName") String userName, @Param("password") String password);
/**
* 根据表名查询用户信息(直接使用注解指定传入参数名称)
* @param tableName
* @return
*/
public List queryUserByTableName(@Param("tableName") String tableName);
/**
* 根据Id查询用户信息
* @param id
* @return
*/
public User queryUserById(Long id);
/**
* 查询所有用户信息
* @return
*/
public List queryUserAll();
/**
* 新增用户信息
* @param user
*/
public void insertUser(User user);
/**
* 根据id更新用户信息
* @param user
*/
public void updateUser(User user);
/**
* 根据id删除用户信息
* @param id
*/
public void deleteUserById(Long id);
}
24.创建UserMapper.xml
INSERT INTO tb_user (
id,
user_name,
password,
name,
age,
sex,
birthday,
created,
updated
)
VALUES
(
null,
#{userName},
#{password},
#{name},
#{age},
#{sex},
#{birthday},
NOW(),
NOW()
);
UPDATE tb_user
user_name = #{userName},
password = #{password},
name = #{name},
age = #{age},
sex = #{sex},
birthday = #{birthday},
updated = now(),
WHERE
(id = #{id});
delete from tb_user where id=#{id}
- 全局配置文件mybatis-config.xml引入UserMapper.xml
26.创建UserMapper测试用例
package com.xag.mybatis.dao;
import com.xag.mybatis.dao.UserMapper;
import com.xag.mybatis.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.InputStream;
import java.util.Date;
import java.util.List;
public class UserMapperTest {
public UserMapper userMapper;
@Before
public void setUp() throws Exception {
// 指定配置文件
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 1. 映射文件的命名空间(namespace)必须是mapper接口的全路径
// 2. 映射文件的statement的id必须和mapper接口的方法名保持一致
// 3. Statement的resultType必须和mapper接口方法的返回类型一致
// 4. statement的parameterType必须和mapper接口方法的参数类型一致(不一定)
this.userMapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void testQueryUserByTableName() {
List userList = this.userMapper.queryUserByTableName("tb_user");
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testLogin() {
System.out.println(this.userMapper.login("hj", "123456"));
}
@Test
public void testQueryUserById() {
long i=100;
System.out.println(this.userMapper.queryUserById(i));
}
@Test
public void testQueryUserAll() {
List userList = this.userMapper.queryUserAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testInsertUser() {
User user = new User();
user.setAge(20);
user.setBirthday(new Date());
user.setName("大神");
user.setPassword("123456");
user.setSex(2);
user.setUserName("bigGod222");
this.userMapper.insertUser(user);
System.out.println(user.getId());
}
@Test
public void testUpdateUser() {
User user = new User();
user.setBirthday(new Date());
user.setName("静静");
user.setPassword("123456");
user.setSex(0);
user.setUserName("Jinjin");
user.setId("1");
this.userMapper.updateUser(user);
}
@Test
public void testDeleteUserById() {
long i=102;
this.userMapper.deleteUserById(i);
}
}
- 开启驼峰匹配(mybatis-config.xml的configuration节点下)
Spring 集成Mybatis
28.引入spring和Mybatis相关依赖
com.alibaba
druid
1.1.20
org.mybatis
mybatis-spring
2.0.2
org.springframework
spring-jdbc
5.2.0.RELEASE
org.springframework
spring-test
5.2.0.RELEASE
test
org.springframework
spring-context
5.2.0.RELEASE
- 新建mybatis-config2.xml 配置(resource下)
- 配置spring配置文件,new - >XML Configuration File -> Spring Config applicationContext-dao.xml(resource/spring 下)
注:右上角有个提示需要点击
- 新建 db.properties 文件(resource/properties下)将先前的log4j.properties 也移到此目录
jdbc.driver=com.mysql.jdbc.Driver
jdbc.host=192.168.139.8
jdbc.database=mybatis_demo
jdbc.userName=system
jdbc.passWord=123456
jdbc.initialSize=0
jdbc.maxActive=20
jdbc.maxIdle=20
jdbc.minIdle=1
jdbc.maxWait=3000
- 新建测试 UserMapperSpringTest.java
package com.xag.mybatis.dao;
import com.xag.mybatis.dao.UserMapper;
import com.xag.mybatis.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 org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
//目标:测试一下spring的bean的某些功能
@RunWith(SpringJUnit4ClassRunner.class)//junit整合spring的测试//立马开启了spring的注解
@ContextConfiguration(locations="classpath:spring/applicationContext-*.xml")//加载核心配置文件,自动构建spring容器
public class UserMapperSpringTest {
@Autowired
public UserMapper userMapper;
@Test
public void testQueryUserByTableName() {
List userList = this.userMapper.queryUserByTableName("tb_user");
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testLogin() {
System.out.println(this.userMapper.login("hj", "123456"));
}
@Test
public void testQueryUserById() {
long i = 100;
System.out.println(this.userMapper.queryUserById(i));
User user = new User();
user.setName("美女");
user.setId("1");
userMapper.updateUser(user);
System.out.println(this.userMapper.queryUserById(i));
}
@Test
public void testQueryUserAll() {
List userList = this.userMapper.queryUserAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testInsertUser() {
User user = new User();
user.setAge(20);
user.setBirthday(new Date());
user.setName("大神");
user.setPassword("123456");
user.setSex(2);
user.setUserName("bigGod222");
this.userMapper.insertUser(user);
System.out.println(user.getId());
}
@Test
public void testUpdateUser() {
User user = new User();
user.setBirthday(new Date());
user.setName("静静");
user.setPassword("123456");
user.setSex(0);
user.setUserName("Jinjin");
user.setId("1");
this.userMapper.updateUser(user);
}
@Test
public void testDeleteUserById() {
long i = 102;
this.userMapper.deleteUserById(i);
}
}
说明
Could not autowire. No beans of 'UserMapper' type found问题处理
Settings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class - disable(idea是把√去掉)