log4j.properties
# Global logging configuration #u5728u5f00u53d1u9636u6bb5uff0cu8bbeu7f6eu4e3aDEBUGuff0cu5230u751fu4ea7u73afu5883u4e0au8bbeu7f6einfou6216erroru5c31u884cu4e86u3002 log4j.rootLogger=DEBUG, stdout # 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
User.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> <!-- 和spring整合后 environments配置将废除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理 --> <transactionManager type="JDBC" /> <!-- 数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="mysql" /> </dataSource> </environment> </environments> <!-- 加载mapper.xml --> <mappers> <!-- 指定classpath下的文件 --> <mapper resource="sqlmap/User.xml"/> </mappers> </configuration>
<?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"> <!-- 一个mapper映射文件是以sql语句为单位进行配置,最终将sql语句封装到MappedStatement对象中 namespace命名空间作用是更好对sql语句进行隔离,方便管理sql 注意:后期讲mybatis的mapper代理开发方式时namespace有特殊的作用??? --> <mapper namespace="test"> <!-- 根据用户id查询一个用户信息 select:用于查询,主要配置sql语句、输入参数类型、输出结果类型 最终该 select 标签 中所配置的内容会封装到MappedStatement对象,可以将该 select称为是一个Statement id:唯 一标识 namespace下的一个sql语句,将id称为Statement的id parameterType:指定输入参数的类型(简单类型、自定义pojo) #{}:表示一个占位符号,占位符号可以防止sql注入 #{value}:value表示接收输入参数的值,如果接收的输入参数是简单类型,#{}里边可以写value或其它的名称 resultType:将sql查询结果集映射成java对象 将多个列的值映射到一个对象中,需要定义的pojo,resultType映射规则是sql查询列名和pojo的属性名必须一致方可完成映射 resultType 指定单条记录所映射的java对象 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT id,username,birthday,sex,address FROM USER WHERE id = #{id} </select> <!-- 根据用户名称模糊查询用户信息列表 resultType:不管结果集记录的数量有多少,resutType指定单条记录所映射的java对象 resultType映射规则是sql查询列名和pojo的属性名必须一致方可完成映射 ${}:表示一个sql拼接符号,相当于字符串的拼接: “SELECT * FROM USER WHERE username LIKE '%” + ${}表示的串 + “%'” ${}:如果接收输入参数是一个简单类型,${} 中只能写value ${}实现sql拼接是无法防止sql注入的。 --> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <!-- 添加用户 需要输入参数是多个值,如果传入简单类型是无法满足要求。 输入参数类型可以定义为pojo(cn.itcast.mybatis.po.User包括多个属性) #{}如何获取对象的值? #{}是通过OGNL读取对象的值,OGNL的表达式方式:属性.属性.属性。。。。直到把对象中的属性值读取过来 过止 mysql数据库通过select LAST_INSERT_ID();获取自增主键的值,在insert语句执行之后去执行LAST_INSERT_ID()获取新记录的主键 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <!-- keyProperty:将主键值设置到输入参数的哪个属性,设置到user的id属性中 order:selectkey中的sql语句在insert语句执行的前或后,这里要设置成"AFTER" resultType:select LAST_INSERT_ID()查询出的值 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}); </insert> <!-- 使用mysql的uuid生成主键 --> <!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> keyProperty:将主键值设置到输入参数的哪个属性,设置到user的id属性中 order:select uuid()在insert执行之前去执行得到uuid作为主键,将主键值设置到user的属性中 resultType:select uuid()查询出的值 <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> select uuid() </selectKey> insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address}); </insert> --> <!-- 修改用户--> <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> <!-- 删除用户 --> <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete> </mapper>
测试类
public class MybatisFirst { // 根据用户id查询用户信息 @Test public void testFindUserById() throws Exception { // mybatis全局配置文件 String resource = "SqlMapConfig.xml"; // 根据mybatis的全局配置文件构造 一个流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建SqlSession会话 SqlSession sqlSession = sqlSessionFactory.openSession(); // 使用sqlSession查询用户 // 第一个参数:statement的id,前边要加namespace // 第二个参数:输入的参数对象值 // selectOne用于返回单个对象,如果sql查询返回一个列表(多个对象),如果使用selectOne报错 User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user); // 关闭sqlsession sqlSession.close(); } // 根据用户名称模糊查询用户信息 @Test public void testFindUserByName() throws Exception { // mybatis全局配置文件 String resource = "SqlMapConfig.xml"; // 根据mybatis的全局配置文件构造 一个流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建SqlSession会话 SqlSession sqlSession = sqlSessionFactory.openSession(); // 根据用户名称模糊查询 // selectList用于 将sql查询结果映射成java对象 ,返回一个List<Object> // 1参数:statement的id(等于namespace+statement的id) // 2参数:输入参数值 List<User> list = sqlSession.selectList("test.findUserByName", "张"); System.out.println(list); // 关闭sqlsession sqlSession.close(); } // 插入用户 @Test public void testInsertUser() throws Exception { // mybatis全局配置文件 String resource = "SqlMapConfig.xml"; // 根据mybatis的全局配置文件构造 一个流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建SqlSession会话 SqlSession sqlSession = sqlSessionFactory.openSession(); // 构造 输入参数,就是插入的用户信息 User user = new User(); user.setUsername("赵六"); user.setBirthday(new Date()); user.setAddress("北京"); // 调用sqlSession插入用户 sqlSession.insert("test.insertUser", user); System.out.println("新user的主键:" + user.getId()); // 提交 sqlSession.commit(); // 关闭sqlsession sqlSession.close(); } // 更新用户 @Test public void testUpdateUser() throws Exception { // mybatis全局配置文件 String resource = "SqlMapConfig.xml"; // 根据mybatis的全局配置文件构造 一个流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建SqlSession会话 SqlSession sqlSession = sqlSessionFactory.openSession(); // 构造 输入参数,就是更新的用户信息 User user = new User(); // 更新的用户信息中必须要有id user.setId(62); user.setUsername("赵六3"); user.setBirthday(new Date()); user.setAddress("郑州"); // 调用sqlSession插入用户 sqlSession.update("test.updateUser", user); // 提交 sqlSession.commit(); // 关闭sqlsession sqlSession.close(); } // 删除用户 @Test public void testDeleteUser() throws Exception { // mybatis全局配置文件 String resource = "SqlMapConfig.xml"; // 根据mybatis的全局配置文件构造 一个流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建SqlSession会话 SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("test.deleteUser", 60); // 提交 sqlSession.commit(); // 关闭sqlsession sqlSession.close(); } }
public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }