SSM框架整合(一)
1 原生态jdbc编程
1.1 jdbc程序
使用jdbc查询mysql数据库中用户表的记录
package cn.itcast.jdbcTest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement pst=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8");
String sql="select * from users where username=?";
pst=conn.prepareStatement(sql);
pst.setString(1, "zhangsan");
rs=pst.executeQuery();
while(rs.next()) {
System.out.println("name--->"+rs.getString(2)+" passsword-->"+rs.getString(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}
}
}
}
1.2 jdbc存在的问题
2 mybatis框架
2.1 mybatis框架是什么
mybatis框架是一个持久层的框架,是appache下的*项目。
mybaits让程序员将主要精力放在sql上,通过mybatis提供的映射方式,*灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向preparedStatement中输入的参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
2.2 mybatis框架
3 入门程序
3.1 需求
根据用户id(主键)查询用户信息
根据用户名称模糊查询用户信息
添加用户
删除用户
更新用户
3.2mybatis运行环境(jar包)
从https://github.com/mybatis/mybatis-3/releases下载,下3.2.7版本。
https://github.com/mybatis/mybatis-3/releases?after=mybatis-3.2.8
lib下,依赖包
mybatis-3.2.7.jar:核心包
3.3log4.properties
# Global logging configuration
# 在开发环境下日志级别要设置成DEBUG,生产环境设置成error或者info
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
3.4 工程结构
3.5 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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3.6 根据用户id(主键)查询用户信息
映射文件命名:
User.xml(原始ibatis命名),mapper代理开发映射文件名称叫xxxMapper.xml,UserMapper.xml,ItemsMapper.xml。
在映射文件中配置sql语句
User.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命名空间,作用就是对sql进行分了化管理,理解sql隔离
注意:使用mapper代理方法,namespace有特殊作用 -->
<mapper namespace="test">
<!-- 在映射文件中配置很多sql语句,通过select执行数据库查询
需求:通过id查询用户表的记录
id:表示映射文件中的sql,成为statement的id,
将sql语句封装到mapperStatement对象中,所以id称为statement的id
parameterType:指定输入参数的类型,这里指定int型
#{}表示一个占位符
#{id}:其中的id表示输入输出的参数,参数的名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以使value或者其他
resultType:指定sql输出结果所映射的java对象类型,select指定resultType表示将单挑记录映射成java对象
-->
<select id="findUserById" parameterType="int" resultType="cn.itcast.po.User">
select * from user where id=#{id}
</select>
</mapper>
3.5.2 在sqlMapConfig.xml中加载映射文件
在sqlMapConfig.xml中加载User.xml
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
3.5.3 编写代码
package cn.itcast.mybatis.first;
import java.io.IOException;
import java.io.InputStream;
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.Test;
import cn.itcast.po.User;
public class MybatisFirst {
//根据id查询用户信息,得到一条记录信息
@Test
public void findUserByIdTest() throws IOException {
//mybaits配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建回话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession操作数据库
SqlSession sqlSession=sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数:映射文件中的statement的id,等于namespace+.+statement的id
//第二个参数:指定和映射文件中所匹配的parameterType类型的参数
User user=sqlSession.selectOne("test.findUserById", 1);
//释放资源
sqlSession.close();
}
}
3.6模糊查询
3.6.1 基本配置
User.xml
<!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定是单挑记录映射的java对象类型
${}:表示拼接sql串,将收到的参数内容不加任何修饰拼接在sql中。
使用${}拼接sql串,引起sql注入
${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.po.User">
select * from users where username like '%${value}%'
</select>
3.6.3 java代码进行测试,模糊查询
//根据用户名称模糊查询用户列表
@Test
public void findUserByName() throws IOException {
//mybaits配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建回话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession操作数据库
SqlSession sqlSession=sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数:映射文件中的statement的id,等于namespace+.+statement的id
//第二个参数:指定和映射文件中所匹配的parameterType类型的参数
List<User> list=sqlSession.selectList("test.findUserByName","sa");
//list中的user和映射文件中resultType所指定的类型一致
System.out.print(list);
sqlSession.close();
}
3.7总结
3.7.1 parameterType
在映射文件中通过parameterType指定输入参数的类型
3.7.2 resultType
在映射文件中通过resultType指定输出结果类型
3.7.4#{}和${}
#{}表示一个占位符。
${}表示一个拼接符号,会引起sql注入。
3.7.4 selectOne和selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现,使用selectList也可以实现
selectList表示查询出一个列表(多条记录)进行映射。selectOne不能够代替。