一、mybatis环境搭建
1.新建一个mave project
2.在pom.xml下导入jar包坐标,mybatis,mysql驱动,log4j,junit
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
3.把log4j配置导入到main/resource下
4.在java下创建domian实体类,变量与mysql对应
public class User implements Serializable {}
5.在main/resource下创建mybatis的主配置文件:SqlMapConfig.xml,导入config的约束,并且进行配置
<?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>
<!--环境配置-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--配置映射文件的位置-->
<mappers>
<mapper resource="sise/cn/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
6.在java/sise/sn/dao下创建IUserDao接口
/**
* 用户的持久层接口
*/
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
}
7.创建 IUserDao的映射配置文件,在main/resource下创建于IUserDao同级目录的IUserDao.xml文件,导入map约束,并配置
<?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">
<!--namespace确定在哪个dao接口-->
<mapper namespace="sise.cn.dao.IUserDao">
<!--查询所有操作-->
<!--id:dao接口中的哪个方法 resultType结果类型:封装到哪里去 -->
<select id="findAll" resultType="sise.cn.domain.User">
/*sql语句*/
select * from user;
</select>
</mapper>
8.编写测试类测试
/**
* 测试mybatis的crud操作
*/
public class MybatisTest {
/**
* 测试查询所有
*/
@Test
public void testFindAll() throws IOException {
//1.读取配置文件,生成字节输入流
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSeesion对象
SqlSession sqlSession = factory.openSession();
//4.获取dao的代理对象
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//5.执行查询所有方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//6.释放资源
sqlSession.close();
in.close();
}
}
二、保存操作
1.dao, IUserDao中添加saveUser方法
/**
* 用户的持久层接口
*/
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
/**
* 保存方法
* @param user
*/
void saveUser(User user);
}
2.在IUserDao.xml映射配置文件中添加
<!--保存用户操作-->
<!--parameterType:参数的类型-->
<insert id="saveUser" parameterType="sise.cn.domain.User">
<!--配置新增数据后,获取新增数据的id-->
<!--keyProperty:返回的值得名称对应实体类 order:先后执行 keyColumn:id列名对应表-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user (username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
</insert>
3.在测试类中测试,把默认操作提取方法初始化
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
//定义初始化方法
@Before//用于在测试方法执行之前执行
public void init() throws IOException {
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSeesion对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
//定义释放资源方法
@After//用于在测试方法执行之后执行
public void destory() throws IOException {
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
in.close();
}
/**
* 测试保存操作
*/
@Test
public void testSave() throws IOException {
User user = new User();
user.setUsername("6ms");
user.setAddress("北京");
user.setSex("男");
user.setBirthday(new Date());
//5.执行查询所有方法
userDao.saveUser(user);
}
}
.
三、修改和删除操作
IUserdao:
/**
* 更新用户
* @param user
*/
void updateUser(User user);
/**
* 根据id删除用户
* @param userId
*/
void deleteUser(Integer userId);
IUserdao.xml:
<!--更新用户-->
<update id="updateUser" parameterType="sise.cn.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
test:
/**
* 测试更新操作
*/
@Test
public void testUpdate(){
User user = new User();
user.setId(49);
user.setUsername("update 6maosong");
user.setAddress("北京");
user.setSex("男");
user.setBirthday(new Date());
//5.执行更新方法
userDao.updateUser(user);
}
/**
* 测试删除操作
*/
@Test
public void testDelete(){
//5.执行删除方法
userDao.deleteUser(42);
}
四、模糊查询
IUserDao:
/**
* 根据名称模糊查询
* @param username
* @return
*/
List<User> findByName(String username);
IUserDao.xml
<!--根据名称模糊查询-->
<select id="findByName" parameterType="String" resultType="sise.cn.domain.User">
select * from user where username like #{name};
</select>
test:
/**
* 测试模糊查询
*/
@Test
public void testfindByName(){
//5.执行模糊查询方法
//要提供%
List<User> users = userDao.findByName("%王%");
for (User user : users) {
System.out.println(user);
}
}
优化
用配置文件配置连接池
1.把jdbcConfig.properties导入resource中
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy
jdbc.username=root
jdbc.password=root
2.在SqlMapConfig.xml中修改代码
配置properties和修改DataSource
<!--配置properties-->
<!--resource属性:用于指定文件的位置,是按照类路径写法来写,并且必须保存在于类路径下。-->
<properties resource="jdbcConfig.properties"></properties>
<!--环境配置-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<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>
全限定类名的优化
在SqlMapConfig.xml中
<typeAliases>
<!--用于指定要配置别名的包,当指定后,该包下的实体类都会注册别名,并且类名就是别名,不在区分大小写-->
<package name="sise.cn.domain"/>
</typeAliases>
在IUserDao.xml中, resultType="sise.cn.domain.User”可改为resultType=“user”
<!--根据名称模糊查询-->
<select id="findByName" parameterType="String" resultType="user">
select * from user where username like #{name};
</select>
在SqlMapConfig.xml中配置映射文件的位置
<mappers>
<!--package 用于指定dao接口所在的包,当指定完成之后就不需要在写mapper以及resource或者class了-->
<package name="sise.cn.dao"/>
</mappers>