mybatis的动态代理:
mybatis会帮我们创建dao接口对象,在实现类中调用SqlSession方法执行sql语句
如何使用mybatis的动态代理:
1、创建SqlSession对象 SqlSession sqlSession = MyBatisUtils.getSqlSession()
2、调用getMapper()方法获取某个接口的对象 sqlSession.getMapper(接口.class)
3、使用dao接口中定义的方法,调用方法就执行了mapper文件中的sql语句,这里的mapper文件指的是sql映射文件,与接口处在同一目录下。
MyBatisUtils中封装了得到SqlSession的方法,具体如下:
public static SqlSessionFactory factory = null;
static {
String config = "mybatis.xml";
try {
InputStream in = Resources.getResourceAsStream(config);
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
/**获取sqlSession对象的方法**/
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
if(factory != null) {
sqlSession = factory.openSession();
}
return sqlSession;
}
mybatis.xml是主配置文件,提供了数据库的连接信息和sql映射文件的位置信息
<?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>
<settings>
<!--设置mybatis的输出日志 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库的驱动类名,新版的:com.mysql.cj.jdbc.Driver-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--连接数据库的url字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/数据库名"/>
<!--访问数据库的用户名-->
<property name="username" value="XXX"/>
<!--密码-->
<property name="password" value="XXX"/>
</dataSource>
</environment>
</environments>
<!--sql mapper(sql映射文件)的位置-->
<mappers>
<!--一个mapper标签指定一个文件的位置。
从类路径开始的路径信息。 target/classes
-->
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
</mappers>
</configuration>
注意:
- dao接口必须与mapper文件存放在同一目录下
- dao接口和mapper文件名一致
- mapper文件中的namespace是dao接口的全限定名称
- mapper文件中的id是接口中方法的名称
传入参数: 从java代码中把数据传入到mapper文件的sql语句中。
1)parameterType : 写在mapper文件中的 一个属性。 表示dao接口中方法的参数的数据类型。
例如StudentDao接口
public Student selectStudentById(Integer id)
- 一个简单类型的参数: #{任意字符}【掌握】
dao接口:
public Student selectStudentById(Integer id)
mapper文件:
select id,name, email,age from student where id=#{studentId}
- 多个参数,使用@Param命名参数【掌握】
使用 @Param(“参数名”) String name
接口
public List<Student> selectMulitParam(@Param("myname") String name, @Param("myage") Integer age)
mapper文件:
<select>
select * from student where name=#{myname} or age=#{myage}
</select>
- 多个参数,使用java对象【掌握】
语法 #{属性名}
QueryParam 类
public class QueryParam {
private String paramName;
private Integer paramAge;
......
}
接口
List<Student> selectMultiObject(QueryParam queryParam);
mapper文件:
select id,name,email,age from student where name=#{paramName} or age=#{paramAge};
5)【了解】按位置传参
/**
- 多个参数-简单类型的,按位置传值,
- mybatis.3.4之前,使用 #{0} ,#{1}
- mybatis。3.4之后 ,使用 #{arg0} ,#{arg1}
*/
6)【了解】使用map传参
# 和 $区别
1. #使用 ?在sql语句中做站位的, 使用PreparedStatement执行sql,效率高
2. #能够避免sql注入,更安全。
3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
4. $有sql注入的风险,缺乏安全性。
5. $:可以替换表名或者列名