文章目录
1、使用注意事项
- (1)parameterType和resultType
parameterType
:指定输入参数类型
,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType
:指定输出结果类型
,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
如果有多条数据,则分别进行映射,并把对象放到容器List中
注意:
parameterType一般可以省略不写.
resultType 不能!!! - (2)selectOne和selectList
selectOne
查询一条记录,如果使用selectOne查询多条记录则抛出异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)
selectList
可以查询一条或多条记录。
2、插入数据
(1)编写sql 执行映射文件中的sql
(2)mybatis默认不会提交事务,所以如果是增删改,则需要手动提交事务
src\test\java\com.smp.pack01\Test03Session
@Test
public void test02SaveUser(){
SqlSession sqlSession = MySessionUtils.getSession();
User user = new User();
user.setUsername("jack");
user.setSex(1);
user.setBirthday(new Date());
user.setAddress("大鸡腿");
//insert into user values(null,#{username},#{birthday},#{sex},#{address});
sqlSession.insert("com.smp.bean.User.saveUser",user);
sqlSession.commit();
sqlSession.close();
}
映射文件:
src\main\resource\UserMapper.xml
<!--User user 调用 user.getUsername() user.getSex() 但在标签里 #{
username} -->
<insert id="saveUser" parameterType="com.smp.bean.User" >
insert into user values(null,#{
username},#{
birthday},#{
sex},#{
address});
</insert>
3、修改用户
(1)在映射文件中编写sql
(2)设置参数与返回值
(3)调用方法
src\test\java\com.smp.pack01\Test03Session
@Test
public void test03UpdateUser(){
SqlSession sqlSession = MySessionUtils.getSession();
User user = new User();
user.setId(30);
user.setUsername("rose");
user.setSex(2);
user.setBirthday(new Date());
user.setAddress("小鸡腿");
// update user set username = #{username},birthday=#{birthday},sex=#{sex},address=#{address} where id =#{id}
sqlSession.update("com.smp.bean.User.updateUser",user);
sqlSession.commit();
sqlSession.close();
}
}
映射文件:
src\main\resource\UserMapper.xml
<update id="updateUser" parameterType="com.smp.bean.User">
update user set username = #{
username},birthday=#{
birthday},sex=#{
sex},address=#{
address} where id =#{
id}
</update>
4、删除数据
<!--//删除用户-->
<delete id="deleteUserData" parameterType="int">
delete from user where id = #{
xxxxxxxxxxxx}
</delete>
//删除用户信息
@Test
public void deleteUserData(){
//5:执行sql
int rows = sqlSession.delete("test.deleteUserData", 15);
System.out.println("rows="+rows);
}
5、解决JDBC的问题
- 1 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据连接池
,使用连接池管理数据库链接。 - 2 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,
sql变动需要改变java代码
。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。 - 3 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,
占位符需要和参数一一对应
。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。 - 4对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
6、关键类解析
- 》1 SqlSession的使用范围
SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。
SqlSession通过SqlSessionFactory创建。
SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。 - 》2 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。 - 》3 SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。
7、动态代理
1、根据id查询
(1)接口与类是实现关系
public interface MyDao{
public void save();
}
//编写实现类文件
public class MyDaoClass implements MyDao{
public void save(){
System.out.println("Hello");
//sql
//jdbc
}
}
(2)动态代理生成实现类
src\main\java\com\smp\dao\UserDao.java
//com.smp.dao.UserDao.findById
public interface UserDao {
public User findById(int id);
}
src\main\resources\com\smp\dao\UserDao.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">
<!--
使用代理以后 当前的映射文件要与接口同名,并且放在同一个位置
使用代理以后 namespace要求写接口的全类名 包名+类名=全类名
UserDao-->
<mapper namespace="com.smp.dao.UserDao">
<!-- 使用代理以后id必须是方法名-->
<select id="findById" parameterType="int" resultType="com.smp.bean.User">
select * from user where id =#{
id};
</select>
</mapper>
src\test\java\com\smp\pack02\Test01Proxy.java
public class Test01Proxy {
@Test
public void test01(){
SqlSession sqlSession = MySessionUtils.getSession();
//select * from user where id =1;
UserDao dao = sqlSession.getMapper(UserDao.class);//内部就使用你编写接口来生成代理对象
//代理对象的方法内部 查询sql,并且执行jdbc代码
User user = dao.findById(1);
System.out.println(user);
//定义接口
sqlSession.close();
}
}
src\main\resources\SqlMapConfig.xml
<!-- 配置多个映射文件-->
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="com/smp/dao/UserDao.xml"/>
</mappers>
2、根据用户名模糊查询
(1)定义接口中的方法
(2)语句
(3)配置
(4)通过session.getMapper()返回的对象不是实现类对象
@Test
public void test02(){
SqlSession sqlSession = MySessionUtils.getSession();
//返回的是实现接口的实现类对象
UserDao dao = sqlSession.getMapper(UserDao.class);
//搜索名字
List<User>list=dao.findByKeyWord("张%");
System.out.println(list);
//定义接口
sqlSession.close();
}
UserDao .java
//com.smp.dao.UserDao.findById
public interface UserDao {
public User findById(int id);
//select * from user where username like '张%'
List<User> findByKeyWord(String s);
}
UserDao .xml
<select id="findByKeyWord" parameterType="string" resultType="com.smp.bean.User">
select * from user where username like #{
keyword}
</select>
3、删除数据
(1)定义接口中的方法
(2)语句
(3)配置
(4)通过session.getMapper()返回的对象不是实现类对象
@Test
public void test03(){
SqlSession sqlSession = MySessionUtils.getSession();
//返回的是实现接口的实现类对象
UserDao dao = sqlSession.getMapper(UserDao.class);
//删除
dao.deleteById(16);
//
sqlSession.commit();
sqlSession.close();
}
//com.smp.dao.UserDao.findById
public interface UserDao {
//delete from user where id = 16;
void deleteById(int id);
}
<delete id="deleteById" parameterType="int">
delete from user where id = #{
id};
</delete>
4、插入数据
(1)定义接口中的方法
(2)语句
(3)配置
(4)通过session.getMapper()返回的对象不是实现类对象
@Test
public void test04(){
SqlSession sqlSession = MySessionUtils.getSession();
//返回的是实现接口的实现类对象
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setId(100);
user.setUsername("jackjhone");
user.setAddress("北京");
user.setBirthday(new Date());
dao.saveUser(user);
//
sqlSession.commit();
sqlSession.close();
}
//com.smp.dao.UserDao.findById
public interface UserDao {
//insert into user value(null,#{username},#{birthday},#{sex},#{address})
void saveUser(User user);
}
<insert id="saveUser" parameterType="com.smp.bean.User">
insert into user value(null,#{
username},#{
birthday},#{
sex},#{
address})
</insert>
5、给类名起别名
src\main\resources\SqlMapConfig.xml
<typeAliases>
<!-- <typeAlias type="com.smp.bean.User" alias="user"></typeAlias> -->
<package name="com.smp.bean"/>
</typeAliases>